Files
Hayden Bleasel 101ca62c2d Update docs styles (#22)
* Initial implementation

* Bump deps

* Update code-block.tsx

* Update navbar.tsx

* Move video to Geistdocs

* Update layout.tsx

* Margin fixes

* Update code-block-tabs.tsx

* Update docs-page.tsx

* Update navbar.tsx

* Add feed

* Update docs-layout.tsx

* Update mobile-menu.tsx

* Fix adaptable layout

* Update docs-page.tsx

* Update docs page composability

* Update global.css

* Remove unused AI Elements

* Update Feedback
2025-11-14 11:56:29 -08:00

69 lines
1.5 KiB
TypeScript

"use client";
import { useTheme } from "next-themes";
import { use, useEffect, useId, useState } from "react";
export const Mermaid = ({ chart }: { chart: string }) => {
const [mounted, setMounted] = useState(false);
useEffect(() => {
setMounted(true);
}, []);
if (!mounted) {
return null;
}
return <MermaidContent chart={chart} />;
};
const cache = new Map<string, Promise<unknown>>();
function cachePromise<T>(
key: string,
setPromise: () => Promise<T>
): Promise<T> {
const cached = cache.get(key);
if (cached) {
return cached as Promise<T>;
}
const promise = setPromise();
cache.set(key, promise);
return promise;
}
function MermaidContent({ chart }: { chart: string }) {
const id = useId();
const { resolvedTheme } = useTheme();
const { default: mermaid } = use(
cachePromise("mermaid", () => import("mermaid"))
);
mermaid.initialize({
startOnLoad: false,
securityLevel: "loose",
fontFamily: "inherit",
themeCSS: "margin: 1.5rem auto 0;",
theme: resolvedTheme === "dark" ? "dark" : "default",
});
const { svg, bindFunctions } = use(
cachePromise(`${chart}-${resolvedTheme}`, () =>
mermaid.render(id, chart.replaceAll("\\n", "\n"))
)
);
return (
<div
// biome-ignore lint/security/noDangerouslySetInnerHtml: "this is needed."
dangerouslySetInnerHTML={{ __html: svg }}
ref={(container) => {
if (container) {
bindFunctions?.(container);
}
}}
/>
);
}