A zero dependency way to convert DOM To SVG https://npmjs.com/package/@gdscnits/dts
  • JavaScript 62.9%
  • TypeScript 33.8%
  • HTML 3.3%
Find a file
2023-02-22 08:00:38 +05:30
docs Update README 2023-02-07 22:59:41 +05:30
src hotfix: Fix cloneNodeWithCSS 2023-02-11 11:43:35 +05:30
tests FIX: Broken testcase 2023-02-13 11:30:42 +05:30
types [v3]: Migrate from Chai to Jest 2023-02-07 23:46:21 +05:30
.eslintignore setup eslint 2023-01-30 17:29:07 +05:30
.eslintrc Update README 2023-02-07 22:59:41 +05:30
.gitignore [v1]: Migrate from Chai to Jest 2023-02-07 20:38:14 +05:30
.prettierignore [v3]: Migrate from Chai to Jest 2023-02-07 23:46:21 +05:30
.prettierrc.json Refactor: Use async await 2023-01-30 16:27:54 +05:30
esbuild.config.mjs Update README and minify build 2023-01-30 20:38:16 +05:30
jest.config.mjs [v1]: Migrate from Chai to Jest 2023-02-07 20:38:14 +05:30
jsdoc.conf.json setup jsdoc 2023-01-30 17:11:58 +05:30
LICENSE Initial commit 2023-01-27 10:37:02 +05:30
package.json UPD: Ver. Bump 2023-02-22 08:00:38 +05:30
pnpm-lock.yaml [v1]: Migrate from Chai to Jest 2023-02-07 20:38:14 +05:30
README.md minor readme change 2023-02-21 14:35:22 +05:30
tsconfig.json setup type declarations 2023-01-30 17:18:55 +05:30

dts

DOM To SVG

Convert a DOM Node to SVG Element.

Try on CodePen

Usage:

For running in Client side, simply use the CDN script:

import dts from "https://cdn.jsdelivr.net/npm/@gdscnits/dts/dist/index.min.js";
const elem = document.getElementById("main")
// console.log(dts(elem)); // to get URI
console.log(dts(elem, false)); // to get svg

For Installing locally:

npm i @gdscnits/dts
// File: index.js
import dts from "@gdscnits/dts";
const elem = document.getElementById("main")
// console.log(dts(elem)); // to get URI
console.log(dts(elem, false)); // to get svg

Build the script using esbuild and browserify(Install them as dependencies). In package.json, put the following lines:

  "scripts": {
    "bundle": "esbuild index.js --bundle --sourcemap --target=chrome58,firefox57,safari11,edge16 --outfile=bundle.js"
  },
  "type": "module"

In the HTML file, include bundle.js as script.

<script src="./bundle.js"></script>

For React components, create a ref for the div whose SVG is needed.

import dts from "@gdscnits/dts";
import { useRef } from "react";

const Component = () => {
    const divref = useRef(null);
    const getSVG = () => {
        if(divref == null) return;
        // const svg = dts(divref) // to get URI
        const svg = dts(divref, false) // to get SVG
        console.log(svg)
    }
    return (
        <div className="main">
            {/* Click on this button to console log the SVG for divref */}
            <button onClick={getSVG}>
                Click me to get SVG
            </button>
            <div className="div_whose_SVG_is_needed" ref={divref}>
                <div className="styling">
                {/*...*/}
                </div>
            </div>
        </div>
    )
}

Setup Locally

  1. Clone the repository
git clone https://github.com/gdsc-nits-org/dts.git
  1. Install dependencies(this project uses pnpm, but you can use your favourite package manager)
pnpm install
  1. Build the project
pnpm esbuild

Additional

  1. View Docs
pnpm docs
  1. Build Docs
pnpm run docs
  1. Run test
pnpm test

TODO:

  • Replace rollup with esbuild
  • Make it asynchronous
  • Setup simple-git-hooks
  • Border Radius applied in image
  • Box Shadows are not rendered properly(Box Shadows not feasable with SVG)
  • Make it work with React components
  • Publish to NPM registry
  • Setup tests
  • Test all helpers
  • Fix some broken testcases
  • Document codebase and usage

Credit to where its due:

dom-to-image