Skip to content

Commit 91618d8

Browse files
feat: enable zooming for mermaid diagrams
Change-Id: If00b3267c6e497381713302d9d9f86070dcb463c
1 parent e0c7502 commit 91618d8

File tree

3 files changed

+90
-0
lines changed

3 files changed

+90
-0
lines changed

assets/js/mermaid.js

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,62 @@
3333
var settings = norm(mermaid.mermaidAPI.defaultConfig, params);
3434
settings.startOnLoad = true;
3535
mermaid.initialize(settings);
36+
37+
function ensureModal() {
38+
if (!$('#mermaidModal').length) {
39+
var html = '' +
40+
'<div class="modal fade" id="mermaidModal" tabindex="-1" role="dialog" aria-hidden="true">' +
41+
'<div class="modal-dialog modal-dialog-centered modal-xl" role="document">' +
42+
'<div class="modal-content">' +
43+
'<div class="modal-body">' +
44+
'<div class="mermaid-zoom-controls">' +
45+
'<button type="button" class="btn btn-sm btn-light" id="mermaidZoomIn">+</button>' +
46+
'<button type="button" class="btn btn-sm btn-light" id="mermaidZoomOut">-</button>' +
47+
'<button type="button" class="btn btn-sm btn-light" id="mermaidZoomReset">Reset</button>' +
48+
'</div>' +
49+
'<div class="mermaid-zoom-wrapper"><div class="mermaid-zoom-content"></div></div>' +
50+
'</div>' +
51+
'</div>' +
52+
'</div>' +
53+
'</div>';
54+
$('body').append(html);
55+
}
56+
}
57+
58+
var scale = 1;
59+
function applyScale() {
60+
$('.mermaid-zoom-content').css('transform', 'scale(' + scale + ')');
61+
}
62+
63+
$(document).on('click', 'pre.mermaid, .mermaid', function() {
64+
ensureModal();
65+
var $svg = $(this).find('svg').clone();
66+
var $content = $('#mermaidModal .mermaid-zoom-content');
67+
$content.empty().append($svg);
68+
scale = 1;
69+
applyScale();
70+
$('#mermaidModal').modal('show');
71+
});
72+
73+
$(document).on('click', '#mermaidZoomIn', function() {
74+
scale = Math.min(scale + 0.2, 5);
75+
applyScale();
76+
});
77+
$(document).on('click', '#mermaidZoomOut', function() {
78+
scale = Math.max(scale - 0.2, 0.2);
79+
applyScale();
80+
});
81+
$(document).on('click', '#mermaidZoomReset', function() {
82+
scale = 1;
83+
applyScale();
84+
});
85+
$(document).on('wheel', '.mermaid-zoom-wrapper', function(e) {
86+
e.preventDefault();
87+
var dy = e.originalEvent.deltaY;
88+
scale += (dy > 0 ? -0.1 : 0.1);
89+
scale = Math.max(0.2, Math.min(5, scale));
90+
applyScale();
91+
});
3692
})(jQuery);
3793
{{ end }}
3894
{{ end }}

assets/scss/_styles_project.scss

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,31 @@ assets/scss/_styles_project.scss
2323
margin-bottom: initial;
2424
}
2525
}
26+
27+
pre.mermaid {
28+
padding: 0;
29+
margin: 0;
30+
background: transparent;
31+
border: 0;
32+
}
33+
34+
.mermaid svg {
35+
width: 100%;
36+
height: auto;
37+
}
38+
39+
.mermaid-zoom-wrapper {
40+
overflow: auto;
41+
max-height: 85vh;
42+
}
43+
44+
.mermaid-zoom-content {
45+
transform-origin: 0 0;
46+
}
47+
48+
.mermaid-zoom-controls {
49+
position: absolute;
50+
right: 1rem;
51+
top: 1rem;
52+
z-index: 10;
53+
}

assets/scss/markdown.scss

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,12 @@
3939
overflow: auto
4040
}
4141

42+
.markdown pre.mermaid {
43+
padding: 0;
44+
margin: 0;
45+
overflow: visible
46+
}
47+
4248
.markdown div[class*=language-] pre code {
4349
color: rgba(0,0,0,.5)
4450
}

0 commit comments

Comments
 (0)