feat: Mermaid dark theme with custom themeVariables + re-render on switch + fix code view colors
This commit is contained in:
@@ -35,10 +35,39 @@ export function updateMermaidTheme(isDark) {
|
|||||||
mermaid.initialize({
|
mermaid.initialize({
|
||||||
startOnLoad: false,
|
startOnLoad: false,
|
||||||
securityLevel: 'strict',
|
securityLevel: 'strict',
|
||||||
theme: _currentTheme,
|
theme: isDark ? 'base' : 'base',
|
||||||
|
themeVariables: isDark ? {
|
||||||
|
primaryColor: '#3b3b5c',
|
||||||
|
primaryTextColor: '#e0e0f0',
|
||||||
|
primaryBorderColor: '#5a5a8a',
|
||||||
|
lineColor: '#8a8aaa',
|
||||||
|
secondaryColor: '#2d2d48',
|
||||||
|
tertiaryColor: '#1e1e32',
|
||||||
|
background: '#1a1a2e',
|
||||||
|
mainBkg: '#2a2a40',
|
||||||
|
nodeBorder: '#5a5a8a',
|
||||||
|
clusterBkg: '#22223a',
|
||||||
|
clusterBorder: '#4a4a7a',
|
||||||
|
titleColor: '#c0c0e0',
|
||||||
|
edgeLabelBackground: '#2a2a40',
|
||||||
|
nodeTextColor: '#e0e0f0',
|
||||||
|
} : {
|
||||||
|
primaryColor: '#f0f0f5',
|
||||||
|
primaryTextColor: '#1a1a2e',
|
||||||
|
primaryBorderColor: '#ccc',
|
||||||
|
lineColor: '#666',
|
||||||
|
secondaryColor: '#e8e8f0',
|
||||||
|
tertiaryColor: '#fafafa',
|
||||||
|
},
|
||||||
fontFamily: 'inherit',
|
fontFamily: 'inherit',
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Re-render all existing Mermaid containers with the new theme
|
||||||
|
var containers = document.querySelectorAll('.mermaid-container');
|
||||||
|
for (var i = 0; i < containers.length; i++) {
|
||||||
|
reRenderContainer(containers[i]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
@@ -239,6 +268,34 @@ function extractDiagramType(code) {
|
|||||||
return 'mermaid';
|
return 'mermaid';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// Re-render a container after theme change
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
async function reRenderContainer(container) {
|
||||||
|
var code = container.getAttribute('data-mermaid-code');
|
||||||
|
if (!code) return;
|
||||||
|
|
||||||
|
var rendered = container.querySelector('.mermaid-rendered');
|
||||||
|
if (!rendered) return;
|
||||||
|
|
||||||
|
try {
|
||||||
|
var id = 'mermaid-' + (++_renderCounter) + '-' + Date.now();
|
||||||
|
var result = await mermaid.render(id, preprocessObsidian(code));
|
||||||
|
rendered.innerHTML = result.svg;
|
||||||
|
|
||||||
|
// Reset zoom/pan state on the SVG
|
||||||
|
var svg = rendered.querySelector('svg');
|
||||||
|
if (svg) {
|
||||||
|
svg.style.transform = '';
|
||||||
|
svg.style.cursor = 'grab';
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
// Keep old rendering on error
|
||||||
|
console.warn('[Mermaid] Re-render failed:', err.message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
// Zoom & Pan (#27)
|
// Zoom & Pan (#27)
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|||||||
+3
-2
@@ -7633,7 +7633,7 @@ body.popup-mode .content-area {
|
|||||||
.mermaid-header {
|
.mermaid-header {
|
||||||
display: flex; align-items: center; justify-content: space-between;
|
display: flex; align-items: center; justify-content: space-between;
|
||||||
padding: 6px 10px;
|
padding: 6px 10px;
|
||||||
background: var(--bg-tertiary, #f0f0f5);
|
background: var(--bg-hover);
|
||||||
border-bottom: 1px solid var(--border);
|
border-bottom: 1px solid var(--border);
|
||||||
min-height: 34px;
|
min-height: 34px;
|
||||||
}
|
}
|
||||||
@@ -7690,9 +7690,10 @@ body.popup-mode .content-area {
|
|||||||
.mermaid-source { padding: 16px; overflow: auto; }
|
.mermaid-source { padding: 16px; overflow: auto; }
|
||||||
.mermaid-source pre {
|
.mermaid-source pre {
|
||||||
margin: 0; padding: 12px;
|
margin: 0; padding: 12px;
|
||||||
background: var(--bg-tertiary, #f5f5f5);
|
background: var(--code-bg);
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
font-size: 0.78rem; line-height: 1.5;
|
font-size: 0.78rem; line-height: 1.5;
|
||||||
|
color: var(--text-primary);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ── Error ── */
|
/* ── Error ── */
|
||||||
|
|||||||
Reference in New Issue
Block a user