11---
2- const { hasBorder = true } = Astro .props ;
2+ const { hasBorder = true , diagramName = " diagram " } = Astro .props ;
33---
44<div >
55 { hasBorder ?
66 <div class = " not-content border mermaid-wrapper" ><slot /></div > :
77 <div class = " not-content" ><slot /></div >
88 }
9- <button data-mermaid-button class =" button" >
9+ <button data-mermaid-view class =" button" >
1010 <span >View full diagram</span >
1111 </button >
12+
13+ <button data-mermaid-download ={ diagramName } class =" button" >
14+ <span >Download diagram</span >
15+ </button >
1216</div >
1317
1418<style >
1519div {
1620 margin-top: var(--space-m);
1721}
1822
19-
2023.border :global(svg) {
2124 border-radius: var(--border-radius);
2225 box-shadow: var(--box-shadow);
@@ -29,9 +32,11 @@ button {
2932 border: 0;
3033 padding: 0;
3134 cursor: pointer;
35+ margin-inline-end: var(--space-s);
3236}
3337
34- .button[data-mermaid-button].button[data-mermaid-button] {
38+ .button[data-mermaid-view].button[data-mermaid-view],
39+ .button[data-mermaid-download].button[data-mermaid-download] {
3540 margin-top: 0;
3641}
3742
@@ -47,27 +52,47 @@ button:hover span {
4752 color: var(--sl-color-white);
4853}
4954
50- span::after {
55+ [data-mermaid-view] span::after {
5156 content: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 18 18"><path stroke="hsl(221,8%,56%)" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 3H3a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2v-4M11 1h6m0 0v6m0-6L7 11"/></svg >');
5257 height: 0.75em;
5358 width: 0.75em;
5459}
5560</style >
5661
5762<script >
58- const clickHandler = event => {
63+ const viewClickHandler = event => {
5964 const svg = event.target.parentElement.previousElementSibling.querySelector('svg')
6065 const as_text = new XMLSerializer().serializeToString(svg)
6166 const blob = new Blob([as_text], { type: 'image/svg+xml' })
6267 const url = URL.createObjectURL(blob)
6368 const win = open(url)
6469 if (win) {
65- win.onload = (evt ) => URL.revokeObjectURL(url);
70+ win.onload = (event ) => URL.revokeObjectURL(url);
6671 }
6772 }
6873
69- const buttons = document.querySelectorAll('[data-mermaid-button]');
70- buttons.forEach((button) => {
71- button.addEventListener('click', clickHandler);
74+ const downloadClickHandler = (event) => {
75+ const svg = event.target.parentElement.previousElementSibling.previousElementSibling.querySelector('svg')
76+ const as_text = new XMLSerializer().serializeToString(svg)
77+ const blob = new Blob([as_text], { type: 'image/svg+xml' })
78+ const url = URL.createObjectURL(blob)
79+ const diagramName = event.target.parentElement.getAttribute('data-mermaid-download') || 'diagram'
80+ const downloadLink = document.createElement("a")
81+ downloadLink.href = url
82+ downloadLink.download = `${diagramName}.svg`
83+ document.body.appendChild(downloadLink)
84+ downloadLink.click()
85+ document.body.removeChild(downloadLink)
86+ URL.revokeObjectURL(url)
87+ }
88+
89+ const viewButtons = document.querySelectorAll('[data-mermaid-view]');
90+ viewButtons.forEach((viewButton) => {
91+ viewButton.addEventListener('click', viewClickHandler);
92+ });
93+
94+ const downloadButtons = document.querySelectorAll('[data-mermaid-download]');
95+ downloadButtons.forEach((downloadButton) => {
96+ downloadButton.addEventListener('click', downloadClickHandler);
7297 });
7398</script >
0 commit comments