Merge pull request #2533 from ZhenShuo2021/feat/mermaid-dark

 Feat(mermaid): support dark mode
This commit is contained in:
Nuno C.
2025-10-14 10:08:26 +01:00
committed by GitHub
7 changed files with 62 additions and 65 deletions
+33
View File
@@ -22,6 +22,34 @@ if (document.documentElement.getAttribute("data-auto-appearance") === "true") {
}); });
} }
// Mermaid dark mode support
var updateMermaidTheme = () => {
if (typeof mermaid !== 'undefined') {
const isDark = document.documentElement.classList.contains("dark");
const mermaids = document.querySelectorAll('pre.mermaid');
mermaids.forEach(e => {
if (e.getAttribute('data-processed')) {
// Already rendered, clean the processed attributes
e.removeAttribute('data-processed');
// Replace the rendered HTML with the stored text
e.innerHTML = e.getAttribute('data-graph');
} else {
// First time, store the text
e.setAttribute('data-graph', e.textContent);
}
});
if (isDark) {
initMermaidDark();
mermaid.run();
} else {
initMermaidLight();
mermaid.run();
}
}
}
window.addEventListener("DOMContentLoaded", (event) => { window.addEventListener("DOMContentLoaded", (event) => {
const switcher = document.getElementById("appearance-switcher"); const switcher = document.getElementById("appearance-switcher");
const switcherMobile = document.getElementById("appearance-switcher-mobile"); const switcherMobile = document.getElementById("appearance-switcher-mobile");
@@ -29,6 +57,9 @@ window.addEventListener("DOMContentLoaded", (event) => {
updateMeta(); updateMeta();
this.updateLogo?.(getTargetAppearance()); this.updateLogo?.(getTargetAppearance());
// Initialize mermaid theme on page load
updateMermaidTheme();
if (switcher) { if (switcher) {
switcher.addEventListener("click", () => { switcher.addEventListener("click", () => {
document.documentElement.classList.toggle("dark"); document.documentElement.classList.toggle("dark");
@@ -38,6 +69,7 @@ window.addEventListener("DOMContentLoaded", (event) => {
targetAppearance targetAppearance
); );
updateMeta(); updateMeta();
updateMermaidTheme();
this.updateLogo?.(targetAppearance); this.updateLogo?.(targetAppearance);
}); });
switcher.addEventListener("contextmenu", (event) => { switcher.addEventListener("contextmenu", (event) => {
@@ -54,6 +86,7 @@ window.addEventListener("DOMContentLoaded", (event) => {
targetAppearance targetAppearance
); );
updateMeta(); updateMeta();
updateMermaidTheme();
this.updateLogo?.(targetAppearance); this.updateLogo?.(targetAppearance);
}); });
switcherMobile.addEventListener("contextmenu", (event) => { switcherMobile.addEventListener("contextmenu", (event) => {
+28 -26
View File
@@ -2,30 +2,32 @@ function css(name) {
return "rgb(" + getComputedStyle(document.documentElement).getPropertyValue(name) + ")"; return "rgb(" + getComputedStyle(document.documentElement).getPropertyValue(name) + ")";
} }
document.addEventListener("DOMContentLoaded", () => { function initMermaidLight() {
const mermaidDivs = document.querySelectorAll("div.mermaid"); mermaid.initialize({
theme: "base",
themeVariables: {
background: css("--color-neutral"),
primaryColor: css("--color-primary-200"),
secondaryColor: css("--color-secondary-200"),
tertiaryColor: css("--color-neutral-100"),
primaryBorderColor: css("--color-primary-400"),
secondaryBorderColor: css("--color-secondary-400"),
tertiaryBorderColor: css("--color-neutral-400"),
lineColor: css("--color-neutral-600"),
fontFamily:
"ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,segoe ui,Roboto,helvetica neue,Arial,noto sans,sans-serif",
fontSize: "16px",
},
});
}
for (const div of mermaidDivs) { function initMermaidDark() {
const preElement = div.querySelector("pre"); mermaid.initialize({
if (preElement) { theme: "dark",
div.textContent = preElement.textContent; themeVariables: {
} fontFamily:
} "ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,segoe ui,Roboto,helvetica neue,Arial,noto sans,sans-serif",
}); fontSize: "16px",
},
mermaid.initialize({ });
theme: "base", }
themeVariables: {
background: css("--color-neutral"),
primaryColor: css("--color-primary-200"),
secondaryColor: css("--color-secondary-200"),
tertiaryColor: css("--color-neutral-100"),
primaryBorderColor: css("--color-primary-400"),
secondaryBorderColor: css("--color-secondary-400"),
tertiaryBorderColor: css("--color-neutral-400"),
lineColor: css("--color-neutral-600"),
fontFamily:
"ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,segoe ui,Roboto,helvetica neue,Arial,noto sans,sans-serif",
fontSize: "16px",
},
});
@@ -15,7 +15,6 @@ The examples below are a small selection taken from the [official Mermaid docs](
## Flowchart ## Flowchart
<div style="background-color:white; padding: 20px">
{{< mermaid >}} {{< mermaid >}}
graph TD graph TD
A[Christmas] -->|Get money| B(Go shopping) A[Christmas] -->|Get money| B(Go shopping)
@@ -32,11 +31,9 @@ F
G G
end end
{{< /mermaid >}} {{< /mermaid >}}
</div>
## Sequence diagram ## Sequence diagram
<div style="background-color:white; padding: 20px">
{{< mermaid >}} {{< mermaid >}}
sequenceDiagram sequenceDiagram
autonumber autonumber
@@ -54,11 +51,9 @@ loop Every minute
John-->Alice: Great! John-->Alice: Great!
end end
{{< /mermaid >}} {{< /mermaid >}}
</div>
## Class diagram ## Class diagram
<div style="background-color:white; padding: 20px">
{{< mermaid >}} {{< mermaid >}}
classDiagram classDiagram
Animal "1" <|-- Duck Animal "1" <|-- Duck
@@ -82,11 +77,9 @@ class Zebra{
+run() +run()
} }
{{< /mermaid >}} {{< /mermaid >}}
</div>
## Entity relationship diagram ## Entity relationship diagram
<div style="background-color:white; padding: 20px">
{{< mermaid >}} {{< mermaid >}}
erDiagram erDiagram
CUSTOMER }|..|{ DELIVERY-ADDRESS : has CUSTOMER }|..|{ DELIVERY-ADDRESS : has
@@ -98,5 +91,3 @@ ORDER ||--|{ ORDER-ITEM : includes
PRODUCT-CATEGORY ||--|{ PRODUCT : contains PRODUCT-CATEGORY ||--|{ PRODUCT : contains
PRODUCT ||--o{ ORDER-ITEM : "ordered in" PRODUCT ||--o{ ORDER-ITEM : "ordered in"
{{< /mermaid >}} {{< /mermaid >}}
</div>
@@ -15,7 +15,6 @@ Mermaid 図は `mermaid` ショートコードを使うことで Blowfish でサ
## フローチャート ## フローチャート
<div style="background-color:white; padding: 20px">
{{< mermaid >}} {{< mermaid >}}
graph TD graph TD
A[クリスマス] -->|収入| B(買い物にいく) A[クリスマス] -->|収入| B(買い物にいく)
@@ -32,11 +31,9 @@ F
G G
end end
{{< /mermaid >}} {{< /mermaid >}}
</div>
## 順序図 ## 順序図
<div style="background-color:white; padding: 20px">
{{< mermaid >}} {{< mermaid >}}
sequenceDiagram sequenceDiagram
autonumber autonumber
@@ -54,11 +51,9 @@ loop 毎分
ジョン-->アリス: すばらしい! ジョン-->アリス: すばらしい!
end end
{{< /mermaid >}} {{< /mermaid >}}
</div>
## クラス図 ## クラス図
<div style="background-color:white; padding: 20px">
{{< mermaid >}} {{< mermaid >}}
classDiagram classDiagram
Animal "1" <|-- Duck Animal "1" <|-- Duck
@@ -82,11 +77,9 @@ class Zebra{
+run() +run()
} }
{{< /mermaid >}} {{< /mermaid >}}
</div>
## 主従関係図 ## 主従関係図
<div style="background-color:white; padding: 20px">
{{< mermaid >}} {{< mermaid >}}
erDiagram erDiagram
CUSTOMER }|..|{ DELIVERY-ADDRESS : has CUSTOMER }|..|{ DELIVERY-ADDRESS : has
@@ -98,5 +91,3 @@ ORDER ||--|{ ORDER-ITEM : includes
PRODUCT-CATEGORY ||--|{ PRODUCT : contains PRODUCT-CATEGORY ||--|{ PRODUCT : contains
PRODUCT ||--o{ ORDER-ITEM : "ordered in" PRODUCT ||--o{ ORDER-ITEM : "ordered in"
{{< /mermaid >}} {{< /mermaid >}}
</div>
@@ -15,7 +15,6 @@ The examples below are a small selection taken from the [official Mermaid docs](
## Flowchart ## Flowchart
<div style="background-color:white; padding: 20px">
{{< mermaid >}} {{< mermaid >}}
graph TD graph TD
A[Christmas] -->|Get money| B(Go shopping) A[Christmas] -->|Get money| B(Go shopping)
@@ -32,11 +31,9 @@ F
G G
end end
{{< /mermaid >}} {{< /mermaid >}}
</div>
## Sequence diagram ## Sequence diagram
<div style="background-color:white; padding: 20px">
{{< mermaid >}} {{< mermaid >}}
sequenceDiagram sequenceDiagram
autonumber autonumber
@@ -54,11 +51,9 @@ loop Every minute
John-->Alice: Great! John-->Alice: Great!
end end
{{< /mermaid >}} {{< /mermaid >}}
</div>
## Class diagram ## Class diagram
<div style="background-color:white; padding: 20px">
{{< mermaid >}} {{< mermaid >}}
classDiagram classDiagram
Animal "1" <|-- Duck Animal "1" <|-- Duck
@@ -82,11 +77,9 @@ class Zebra{
+run() +run()
} }
{{< /mermaid >}} {{< /mermaid >}}
</div>
## Entity relationship diagram ## Entity relationship diagram
<div style="background-color:white; padding: 20px">
{{< mermaid >}} {{< mermaid >}}
erDiagram erDiagram
CUSTOMER }|..|{ DELIVERY-ADDRESS : has CUSTOMER }|..|{ DELIVERY-ADDRESS : has
@@ -98,5 +91,3 @@ ORDER ||--|{ ORDER-ITEM : includes
PRODUCT-CATEGORY ||--|{ PRODUCT : contains PRODUCT-CATEGORY ||--|{ PRODUCT : contains
PRODUCT ||--o{ ORDER-ITEM : "ordered in" PRODUCT ||--o{ ORDER-ITEM : "ordered in"
{{< /mermaid >}} {{< /mermaid >}}
</div>
@@ -15,7 +15,6 @@ Blowfish 使用 `mermaid` 简码可以调用。Blowfish 会根据配置的 `colo
## 流程图 ## 流程图
<div style="background-color:white; padding: 20px">
{{< mermaid >}} {{< mermaid >}}
graph TD graph TD
A[Christmas] -->|Get money| B(Go shopping) A[Christmas] -->|Get money| B(Go shopping)
@@ -32,11 +31,9 @@ F
G G
end end
{{< /mermaid >}} {{< /mermaid >}}
</div>
## 时序图 ## 时序图
<div style="background-color:white; padding: 20px">
{{< mermaid >}} {{< mermaid >}}
sequenceDiagram sequenceDiagram
autonumber autonumber
@@ -54,11 +51,9 @@ loop Every minute
John-->Alice: Great! John-->Alice: Great!
end end
{{< /mermaid >}} {{< /mermaid >}}
</div>
## 类图 ## 类图
<div style="background-color:white; padding: 20px">
{{< mermaid >}} {{< mermaid >}}
classDiagram classDiagram
Animal "1" <|-- Duck Animal "1" <|-- Duck
@@ -82,11 +77,9 @@ class Zebra{
+run() +run()
} }
{{< /mermaid >}} {{< /mermaid >}}
</div>
## 实体关系图 ## 实体关系图
<div style="background-color:white; padding: 20px">
{{< mermaid >}} {{< mermaid >}}
erDiagram erDiagram
CUSTOMER }|..|{ DELIVERY-ADDRESS : has CUSTOMER }|..|{ DELIVERY-ADDRESS : has
@@ -98,5 +91,3 @@ ORDER ||--|{ ORDER-ITEM : includes
PRODUCT-CATEGORY ||--|{ PRODUCT : contains PRODUCT-CATEGORY ||--|{ PRODUCT : contains
PRODUCT ||--o{ ORDER-ITEM : "ordered in" PRODUCT ||--o{ ORDER-ITEM : "ordered in"
{{< /mermaid >}} {{< /mermaid >}}
</div>
+1 -3
View File
@@ -1,3 +1 @@
<div class="mermaid" align="center"> <pre class="not-prose mermaid">{{ .Inner | safeHTML }}</pre>
<pre>{{ .Inner | safeHTML }}</pre>
</div>