Skip to content

Commit bf057e6

Browse files
committed
feat: configurable themes for mermaid
1 parent 8ce74f3 commit bf057e6

File tree

6 files changed

+196
-60
lines changed

6 files changed

+196
-60
lines changed

example/src/App.tsx

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,11 @@ import {
55
onCleanup,
66
onMount,
77
} from "solid-js";
8-
import { MarkdownRenderer, type Themes } from "solid-markdown-wasm";
8+
import {
9+
DEFAULT_MERMAID_CONFIG,
10+
MarkdownRenderer,
11+
type Themes,
12+
} from "solid-markdown-wasm";
913
import { MonacoEditor } from "solid-monaco";
1014
import haxiomLogo from "../src/assets/haxiom.svg";
1115
import initialMarkdown from "../src/assets/markdown_preview.md?raw";
@@ -153,6 +157,7 @@ const App: Component = () => {
153157
return (
154158
<div
155159
class="flex flex-col w-screen h-screen"
160+
data-theme={isDarkMode() ? "dark" : "light"}
156161
classList={{ "bg-[#1e1e1e]": isDarkMode(), "bg-white": !isDarkMode() }}
157162
>
158163
{/* Toolbar */}
@@ -267,8 +272,7 @@ const App: Component = () => {
267272
href="https://haxiom.io"
268273
target="_blank"
269274
rel="noopener noreferrer"
270-
class="text-sm font-medium px-3 py-1.5 rounded transition-colors text-black hover:opacity-80"
271-
style={{ "background-color": "#6fffe9" }}
275+
class="text-sm font-medium px-3 py-1.5 rounded transition-colors hover:opacity-80 bg-(--haxiom-accent-color) text-(--haxiom-fg-color)"
272276
>
273277
Try Haxiom
274278
</a>
@@ -302,6 +306,27 @@ const App: Component = () => {
302306
fallback={<LoadingFallback />}
303307
onLoaded={() => console.log("WASM Loaded")}
304308
immediateRenderMermaid={immediateMermaid()}
309+
mermaidConfig={(theme) => {
310+
const isDark = theme === "dark";
311+
const textColor = isDark ? "#c9d1d9" : "#24292f";
312+
const nodeBkg = isDark ? "#BB2528" : "#fee2e2"; // Dark red vs light red
313+
const nodeText = isDark ? "#ffffff" : "#991b1b"; // White vs dark red
314+
315+
return {
316+
...DEFAULT_MERMAID_CONFIG(theme),
317+
themeVariables: {
318+
...DEFAULT_MERMAID_CONFIG(theme).themeVariables,
319+
primaryColor: nodeBkg,
320+
nodeBkg: nodeBkg,
321+
primaryTextColor: nodeText,
322+
nodeTextColor: nodeText,
323+
textColor: textColor,
324+
lineColor: "#FF0000",
325+
secondaryColor: "#006100",
326+
tertiaryColor: isDark ? "#222222" : "#eeeeee",
327+
},
328+
};
329+
}}
305330
/>
306331
</div>
307332
</div>

example/src/assets/gantt_test.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# Gantt Chart Test
2+
3+
```mermaid
4+
gantt
5+
title A Gantt Diagram
6+
dateFormat YYYY-MM-DD
7+
section Section
8+
A task :a1, 2014-01-01, 30d
9+
Another task :after a1 , 20d
10+
section Another
11+
Task in sec :2014-01-12 , 12d
12+
another task : 24d
13+
```

example/src/index.css

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,15 @@
5050
}
5151

5252
@media (prefers-color-scheme: dark) {
53+
:root,
5354
.markdown-body,
5455
[data-theme="dark"] {
5556
/* dark */
5657
color-scheme: dark;
58+
--haxiom-accent-color: rgb(111, 255, 233);
59+
--haxiom-accent-color-hover: rgb(111, 255, 233);
60+
--haxiom-accent-color-disabled: rgb(111, 255, 233);
61+
--haxiom-fg-color: black;
5762
--focus-outlineColor: #1f6feb;
5863
--fgColor-default: #f0f6fc;
5964
--fgColor-muted: #9198a1;
@@ -108,10 +113,15 @@
108113
}
109114

110115
@media (prefers-color-scheme: light) {
116+
:root,
111117
.markdown-body,
112118
[data-theme="light"] {
113119
/* light */
114120
color-scheme: light;
121+
--haxiom-accent-color: #4f46e5;
122+
--haxiom-accent-color-hover: #4f46e5;
123+
--haxiom-accent-color-disabled: #4f46e5;
124+
--haxiom-fg-color: white;
115125
--focus-outlineColor: #0969da;
116126
--fgColor-default: #1f2328;
117127
--fgColor-muted: #59636e;
@@ -1580,6 +1590,8 @@
15801590
background: transparent;
15811591
border: none;
15821592
padding: 1rem 0;
1593+
min-width: 600px;
1594+
overflow-x: auto;
15831595
}
15841596

15851597
.markdown-body pre:has(code.language-mermaid) svg,
@@ -1592,8 +1604,8 @@
15921604

15931605
.mermaid-render-btn {
15941606
padding: 0.5rem 1rem;
1595-
background: #6366f1;
1596-
color: white;
1607+
background: var(--haxiom-accent-color);
1608+
color: var(--haxiom-fg-color);
15971609
border: none;
15981610
border-radius: 4px;
15991611
cursor: pointer;
@@ -1603,11 +1615,11 @@
16031615
}
16041616

16051617
.mermaid-render-btn:hover {
1606-
background: #4f46e5;
1618+
background: var(--haxiom-accent-color-hover);
16071619
}
16081620

16091621
.mermaid-render-btn:disabled {
1610-
background: #9ca3af;
1622+
background: var(--haxiom-accent-color-disabled);
16111623
cursor: not-allowed;
16121624
}
16131625

@@ -1632,18 +1644,13 @@
16321644
}
16331645
}
16341646

1635-
.mermaid-clickable pre[data-mermaid-processed="true"] {
1636-
cursor: pointer;
1637-
transition: opacity 0.2s, background-color 0.2s;
1647+
.mermaid-clickable .language-mermaid {
1648+
cursor: zoom-in;
1649+
transition: opacity 0.2s;
16381650
}
16391651

1640-
.mermaid-clickable pre[data-mermaid-processed="true"]:hover {
1652+
.mermaid-clickable .language-mermaid:hover {
16411653
opacity: 0.9;
1642-
background-color: var(--bgColor-neutral-muted, #818b981f);
1643-
}
1644-
1645-
.mermaid-clickable pre[data-mermaid-processed="true"] svg {
1646-
cursor: pointer;
16471654
}
16481655

16491656
.mermaid-preview-content svg {
@@ -1691,3 +1698,7 @@
16911698
cursor: pointer;
16921699
padding: 10px;
16931700
}
1701+
1702+
.mermaid-preview-overlay .mermaid-preview-content svg {
1703+
background-color: var(--bgColor-default);
1704+
}

src/components/MarkdownRenderer.tsx

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@ import {
1717
onMount,
1818
} from "solid-js";
1919
import { render } from "solid-js/web";
20-
import { useMermaidRenderer } from "../utils/useMermaidRenderer";
20+
import {
21+
type MermaidConfigFn,
22+
useMermaidRenderer,
23+
} from "../utils/useMermaidRenderer";
2124

2225
export type { Themes } from "markdown-renderer";
2326

@@ -105,6 +108,7 @@ export interface MarkdownRendererProps {
105108
fallback?: JSX.Element;
106109
onLoaded?: () => void;
107110
immediateRenderMermaid?: boolean;
111+
mermaidConfig?: MermaidConfigFn;
108112
}
109113

110114
export const MarkdownRenderer: Component<MarkdownRendererProps> = (props) => {
@@ -116,6 +120,7 @@ export const MarkdownRenderer: Component<MarkdownRendererProps> = (props) => {
116120
// Initialize Mermaid renderer
117121
const { processBlocks, renderMermaid } = useMermaidRenderer(
118122
props.immediateRenderMermaid ?? false,
123+
props.mermaidConfig,
119124
);
120125

121126
// Store iframe data: element, wrapper, source, and dimensions
@@ -497,7 +502,11 @@ export const MarkdownRenderer: Component<MarkdownRendererProps> = (props) => {
497502
injectCopyButtons();
498503

499504
// Process Mermaid diagrams
500-
processBlocks(contentRef);
505+
processBlocks(
506+
contentRef,
507+
props.immediateRenderMermaid ?? false,
508+
props.mermaidConfig,
509+
);
501510

502511
// Observe content for size changes
503512
if (resizeObserver && contentRef) {

src/index.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
export { MarkdownRenderer } from "./components/MarkdownRenderer";
22
export type { MarkdownRendererProps } from "./components/MarkdownRenderer";
3-
export { useMermaidRenderer } from "./utils/useMermaidRenderer";
3+
export {
4+
useMermaidRenderer,
5+
DEFAULT_MERMAID_CONFIG,
6+
type MermaidConfigFn,
7+
} from "./utils/useMermaidRenderer";
48
export type { Themes } from "markdown-renderer";

0 commit comments

Comments
 (0)