Skip to content

Commit 99d4f77

Browse files
committed
refactor: improve Mermaid diagram rendering and responsiveness in Chapter 3 guide
1 parent f7ad120 commit 99d4f77

1 file changed

Lines changed: 49 additions & 4 deletions

File tree

Ctfl-at-chapter3-agile-testing-techniques-tools.html

Lines changed: 49 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -513,8 +513,25 @@
513513
display: flex;
514514
justify-content: center;
515515
}
516-
.mermaid-wrap svg {
517-
max-width: 100%;
516+
.mermaid {
517+
display: flex;
518+
justify-content: center;
519+
width: 100%;
520+
}
521+
.mermaid svg {
522+
display: block;
523+
margin: 0 auto;
524+
max-width: 100% !important;
525+
height: auto !important;
526+
overflow: visible !important;
527+
}
528+
.mermaid foreignObject {
529+
overflow: visible !important;
530+
}
531+
.mermaid foreignObject > div,
532+
.mermaid .nodeLabel,
533+
.mermaid .edgeLabel {
534+
overflow: visible !important;
518535
}
519536
.mermaid-wrap .loading {
520537
font-family: var(--font-mono);
@@ -2515,6 +2532,7 @@ <h2 id="8">8. 次のステップ</h2>
25152532

25162533
mermaid.initialize({
25172534
startOnLoad: false,
2535+
securityLevel: 'loose',
25182536
theme: 'dark',
25192537
themeVariables: {
25202538
background: '#0c1a2c',
@@ -2562,9 +2580,36 @@ <h2 id="8">8. 次のステップ</h2>
25622580
for (let i = 0; i < mermaidSources.length; i++) {
25632581
const el = document.getElementById('mermaid-' + i);
25642582
if (!el) continue;
2565-
el.textContent = mermaidSources[i];
2583+
const src = mermaidSources[i];
2584+
try {
2585+
const { svg } = await mermaid.render('svg-mermaid-' + i, src);
2586+
el.innerHTML = svg;
2587+
2588+
const svgEl = el.querySelector('svg');
2589+
if (svgEl) {
2590+
svgEl.removeAttribute('width');
2591+
svgEl.removeAttribute('height');
2592+
svgEl.style.height = 'auto';
2593+
svgEl.style.overflow = 'visible';
2594+
2595+
const viewBoxStr = svgEl.getAttribute('viewBox');
2596+
if (viewBoxStr) {
2597+
const parts = viewBoxStr.split(' ').map(Number);
2598+
if (parts.length === 4) {
2599+
const [vx, vy, vw, vh] = parts;
2600+
const isSequenceOrState = src.trim().startsWith('sequenceDiagram') || src.trim().startsWith('stateDiagram');
2601+
const extraHeight = isSequenceOrState ? 110 : 15;
2602+
svgEl.style.width = `${vw}px`;
2603+
svgEl.style.maxWidth = '100%';
2604+
svgEl.setAttribute('viewBox', `${vx} ${vy} ${vw} ${vh + extraHeight}`);
2605+
}
2606+
}
2607+
}
2608+
} catch (err) {
2609+
console.error(`Mermaid render error for mermaid-${i}:`, err);
2610+
el.innerHTML = `<p style="color: var(--red);">図表の描画に失敗しました: ${err.message}</p>`;
2611+
}
25662612
}
2567-
await mermaid.run({ querySelector: '.mermaid' });
25682613
}
25692614
renderDiagrams();
25702615

0 commit comments

Comments
 (0)