From 97895563842661bd076f2ba06914b4d161b1e940 Mon Sep 17 00:00:00 2001 From: David Karlsson <35727626+dvdksn@users.noreply.github.com> Date: Wed, 27 May 2026 11:08:46 +0200 Subject: [PATCH 1/2] layouts: render ```mermaid code blocks as diagrams Adds a Hugo codeblock render hook that turns ```mermaid fences into
containers, plus a lazily-loaded mermaid bundle
that only ships on pages that actually contain a diagram. Mirrors the
existing YouTube embed pattern (Store flag + conditional script tag in
baseof) so the main scripts.js bundle stays unchanged.
---
assets/js/mermaid.js | 19 +
layouts/_markup/render-codeblock-mermaid.html | 5 +
layouts/_partials/mermaid-script.html | 4 +
layouts/baseof.html | 4 +
package-lock.json | 959 +++++++++++++++++-
package.json | 1 +
6 files changed, 990 insertions(+), 2 deletions(-)
create mode 100644 assets/js/mermaid.js
create mode 100644 layouts/_markup/render-codeblock-mermaid.html
create mode 100644 layouts/_partials/mermaid-script.html
diff --git a/assets/js/mermaid.js b/assets/js/mermaid.js
new file mode 100644
index 0000000000..ae8f7a9b1f
--- /dev/null
+++ b/assets/js/mermaid.js
@@ -0,0 +1,19 @@
+import mermaid from 'mermaid'
+
+const isDark = () => document.documentElement.classList.contains('dark')
+
+mermaid.initialize({
+ startOnLoad: false,
+ securityLevel: 'strict',
+ theme: isDark() ? 'dark' : 'default',
+})
+
+const render = () => {
+ mermaid.run({ querySelector: 'pre.mermaid' })
+}
+
+if (document.readyState === 'loading') {
+ document.addEventListener('DOMContentLoaded', render)
+} else {
+ render()
+}
diff --git a/layouts/_markup/render-codeblock-mermaid.html b/layouts/_markup/render-codeblock-mermaid.html
new file mode 100644
index 0000000000..25ddaa2bd0
--- /dev/null
+++ b/layouts/_markup/render-codeblock-mermaid.html
@@ -0,0 +1,5 @@
+{{- .Page.Store.Set "mermaid" true -}}
+{{- .Inner -}}
diff --git a/layouts/_partials/mermaid-script.html b/layouts/_partials/mermaid-script.html
new file mode 100644
index 0000000000..f69deeb8e7
--- /dev/null
+++ b/layouts/_partials/mermaid-script.html
@@ -0,0 +1,4 @@
+{{ $mermaid := resources.Get "js/mermaid.js"
+ | js.Build (dict "minify" true "targetPath" "mermaid.js")
+}}
+
diff --git a/layouts/baseof.html b/layouts/baseof.html
index a4717baf81..062ff2bec1 100644
--- a/layouts/baseof.html
+++ b/layouts/baseof.html
@@ -95,5 +95,9 @@
{{ with .Store.Get "youtube" }}
{{ partialCached "youtube-script.html" "-" "-" }}
{{ end }}
+ {{/* Load mermaid if the page contains a mermaid code block */}}
+ {{ with .Store.Get "mermaid" }}
+ {{ partialCached "mermaid-script.html" "-" "-" }}
+ {{ end }}