Added runtime darkmode to remark42

This commit is contained in:
ClovertaTheTrilobita 2026-04-25 00:56:06 +03:00
parent 7292affc04
commit 9c53ea922e

View file

@ -6,7 +6,6 @@ const siteId = import.meta.env.PUBLIC_REMARK42_SITE_ID;
--- ---
<div id="remark42"></div> <div id="remark42"></div>
<script define:vars={{ pagePath, host, siteId }} is:inline data-astro-rerun> <script define:vars={{ pagePath, host, siteId }} is:inline data-astro-rerun>
function getTheme() { function getTheme() {
return document.documentElement.classList.contains("dark") return document.documentElement.classList.contains("dark")
@ -35,6 +34,7 @@ const siteId = import.meta.env.PUBLIC_REMARK42_SITE_ID;
resolve(true); resolve(true);
return; return;
} }
existing.addEventListener("load", () => resolve(true), { existing.addEventListener("load", () => resolve(true), {
once: true, once: true,
}); });
@ -67,16 +67,42 @@ const siteId = import.meta.env.PUBLIC_REMARK42_SITE_ID;
setRemarkConfig(); setRemarkConfig();
await ensureScript(); await ensureScript();
if (window.REMARK42) { if (!window.REMARK42) return;
if (typeof window.REMARK42.destroy === "function") { if (typeof window.REMARK42.destroy === "function") {
window.REMARK42.destroy(); window.REMARK42.destroy();
} }
if (typeof window.REMARK42.createInstance === "function") { if (typeof window.REMARK42.createInstance === "function") {
node.innerHTML = ""; node.innerHTML = "";
window.REMARK42.createInstance(window.remark_config); window.REMARK42.createInstance(window.remark_config);
} }
} }
function setupRemark42ThemeObserver() {
if (window.__remark42ThemeObserver) {
window.__remark42ThemeObserver.disconnect();
}
let lastTheme = getTheme();
const observer = new MutationObserver(() => {
const currentTheme = getTheme();
if (currentTheme === lastTheme) return;
lastTheme = currentTheme;
mountRemark42();
});
observer.observe(document.documentElement, {
attributes: true,
attributeFilter: ["class"],
});
window.__remark42ThemeObserver = observer;
} }
mountRemark42(); mountRemark42();
setupRemark42ThemeObserver();
</script> </script>