JSFiddle - React, Tailwind, and code Playground
HTML
<script src="https://cdnjs.cloudflare.com/ajax/libs/snap.svg/0.4.1/snap.svg-min.js"></script>
<svg id="svgout">
</svg>
CSS
#svgout {
width: 100vw;
height: 100vh;
}
JavaScript
Snap.plugin(function (Snap, Element, Paper, global, Fragment) {
function dragStart(x, y, e) {
this.current_transform = this.transform();
}
function dragMove(dx, dy, x, y, e) {
this.transform(this.current_transform+'T'+dx+','+dy);
this.updatePaths();
}
function dragEnd(e) {
this.current_transform = this.transform();
}
function updatePaths() {
var key;
for(key in this.paths) {
this.paths[key][0].attr({"path" : this.getPathString(this.paths[key][1])});
this.paths[key][0].prependTo(this.paper);
}
}
function getCoordinates() {
return [this.matrix.e + (this.node.width.baseVal.value / 2),
this.matrix.f + (this.node.height.baseVal.value / 2)];
}
function getPathString(obj) {
var p1 = this.getCoordinates();
var p2 = obj.getCoordinates();
return "M"+p1[0]+","+p1[1]+"L"+p2[0]+","+p2[1];
}
function addPath(obj) {
var id = obj.id;
var path = this.paper.path(this.getPathString(obj)).attr({fill:'none', stroke:'blue', strokeWidth:1});
path.prependTo(this.paper);
this.paths[id] = [path, obj];
obj.paths[this.id] = [path, this];
}
function removePath(obj) {
var id = obj.id;
if (this.paths[id] != null) {
this.paths[id][0].remove();
this.paths[id][1] = null;
delete this.paths[id];
obj.paths[this.id][1] = null;
delete obj.paths[this.id];
}
}
Paper.prototype.draggableRect = function (x, y, w, h) {
var rect = this.rect(0,0,w,h).transform("T"+x+","+y);
rect.paths = {};
rect.drag(dragMove, dragStart, dragEnd);
rect.updatePaths = updatePaths;
rect.getCoordinates = getCoordinates;
rect.getPathString = getPathString;
rect.addPath = addPath;
rect.removePath = removePath;
...