techniq / layerchart

Composable Svelte chart components to build a wide range of visualizations
https://www.layerchart.com
MIT License
650 stars 12 forks source link

Download as PNG / SVG / etc #162

Open techniq opened 6 months ago

techniq commented 6 months ago
techniq commented 6 months ago

SVG reproduction when using CSS classes / variables will require some extra processing to fully reproduce visual.

image

techniq commented 6 months ago

Mike Bostock's examples of serialize() and rasterize() for SVG look straight forward (using document.createTreeWalker().

Likely how Download SVG and Download PNG are implemented (or at least the basics).

image

see also: https://talk.observablehq.com/t/svg-to-png/6957

techniq commented 4 months ago

See discussion for approach with SVG

function downloadSVG() {
    const svgEl = document.querySelector('.layercake-layout-svg');
    if (svgEl) {
        svgEl?.setAttribute('xmlns', 'http://www.w3.org/2000/svg');

        svgEl.querySelector('.svg_text')?.classList.remove('hidden');

        const svgString = new XMLSerializer().serializeToString(svgEl);

        const a = document.createElement('a');
        a.href = window.URL.createObjectURL(new Blob([svgString]));
        a.download = 'download.svg';
        a.click();

        a.remove();

        svgEl?.removeAttribute('xmlns');
        svgEl.querySelector('.svg_text')?.classList.add('hidden');
    }
};
techniq commented 4 months ago

See discussion for approach with Canvas

function downloadPNG() {
    const canvas = document.querySelector('.layercake-layout-canvas') as HTMLCanvasElement;
    const ctx = canvas.getContext('2d');
    const dataUrl = ctx?.canvas.toDataURL('image/png', 1);

    const a = document.createElement('a');
    a.href = dataUrl;
    a.download = 'download.png';
    a.click();
    a.remove();
};
meta-cretin commented 2 months ago

save as svg and png looks good to me...