JSFiddle - React, Tailwind, and code Playground

CSS

html, body {

      height: 100%;

      width: 100%;

      margin: 0;

      padding: 0;

      overflow: hidden;

  }

JavaScript

var currentzoom = 1;
var docFragment = document.createDocumentFragment();
var start = new Date();

var end = new Date();
console.log(end - start);

var currentx = 0.0,
    currenty = 0.0,
    currentzoom = 1.0,
    xold = 0,
    yold = 0,
    button = false;

for (i = 0; i < 1000; i++) {
    var blax = (Math.random() - 0.5) * 3000;
    var blay = (Math.random() - 0.5) * 3000;
    var tb = document.createElement('span');
    $(tb).data("x", blax / $(window).width());
    $(tb).data("y", blay / $(window).height());
    $(tb).data("size", 20 * currentzoom);
    tb.contentEditable = true;
    tb.style.fontFamily = 'arial';
    tb.style.fontSize = '20px';
    tb.style.position = 'absolute';
    tb.style.top = blay + 'px';
    tb.style.left = blax + 'px';
    tb.innerHTML = "newtext";
    docFragment.appendChild(tb);
}
document.body.appendChild(docFragment);

document.body.onclick = function(e) {
    if (e.target.nodeName == 'SPAN') {
        return;
    }
    var tb = document.createElement('span');

    $(tb).data("x", currentx + e.clientX / $(window).width() * currentzoom);
    $(tb).data("y", currenty + e.clientY / $(window).height() * currentzoom);
    $(tb).data("size", 20 * currentzoom);
    tb.contentEditable = true;
    tb.style.fontFamily = 'arial';
    tb.style.fontSize = '20px';
    tb.style.backgroundColor = 'transparent';
    tb.style.position = 'absolute';
    tb.style.top = e.clientY + 'px';
    tb.style.left = e.clientX + 'px';
    document.body.appendChild(tb);
    tb.focus();
};

document.body.onmousedown = function(e) {
    button = true;
    xold = e.clientX;
    yold = e.clientY;
};

document.body.onmouseup = function(e) {
    button = false;
};

redraw = function(resize) {

    var spans = $("span").detach();
    $(spans).each(function(index) {
        var newx = Math.floor(($(this).data("x") - currentx) / currentzoom * $(window).width());
        var newy = Math.floor(($(this).data("y") - currenty) / currentzoom * $(window).height());

       ...