type DownloadImageProps = { url: string; name: string; extension?: 'png' | 'jpg'; scale?: number; }; export async function downloadImage({ url, name, extension = 'png', scale = 1, }: DownloadImageProps) { try { const res = await fetch(url); const svg = await res.text(); const image = `data:image/svg+xml;base64,${window.btoa(svg)}`; const img = new Image(); img.src = image; img.onload = () => { const canvas = document.createElement('canvas'); canvas.width = img.width * scale; canvas.height = img.height * scale; const ctx = canvas.getContext('2d'); ctx?.drawImage(img, 0, 0, canvas.width, canvas.height); const png = canvas.toDataURL('image/png', 1.0); // Increase the quality by setting a higher value (0.0 - 1.0) const a = document.createElement('a'); a.href = png; a.download = `${name}.${extension}`; a.click(); }; } catch (error) { alert('Error downloading image'); } } export async function downloadGeneratedRoadmapImage( name: string, node: HTMLElement, ) { // Append a watermark to the bottom right of the image const watermark = document.createElement('div'); watermark.className = 'flex justify-end absolute top-4 right-4 gap-2'; watermark.innerHTML = ` roadmap.sh `; node.insertAdjacentElement('afterbegin', watermark); const domtoimage = (await import('dom-to-image')).default; if (!domtoimage) { throw new Error('Unable to download image'); } const dataUrl = await domtoimage.toJpeg(node, { bgcolor: 'white', quality: 1, }); node?.removeChild(watermark); const link = document.createElement('a'); link.download = `${name}-roadmap.jpg`; link.href = dataUrl; link.click(); }