JSFiddle - React, Tailwind, and code Playground

HTML

<body>
  
    <div id="container">
      <canvas id="canvas"  >
      </canvas>
    </div>
  
  </body>

CSS

#canvas{
	border: solid 2px green;
	background-color:#fff;

}
body{
    margin:0;
}

JavaScript

var canvas = document.getElementById('canvas');
        var ctx = canvas.getContext('2d');
        var width  = window.innerWidth;
        var height = window.innerHeight;
        canvas.height = height;
        canvas.width = width;
        canvas.addEventListener('mousedown', function(e) {
            this.down = true;
            points.setStart(e.pageX, e.pageY);
        }, 0);
        canvas.addEventListener('mouseup', function() {
            this.down = false;          
        }, 0);
        canvas.addEventListener('mousemove', function(e) {          
            if (this.down) {
                points.newPoint(e.pageX, e.pageY);
            }
        }, 0);

var points = function() {
    var queue = [], qi = 0;
    var ctx = canvas.getContext('2d');
    
    function clear() {
        queue = [];
        qi = 0;
    }
    
    function setStart(x, y) {
        clear();
        newPoint(x, y);
    }
    
    function newPoint(x, y) {
        queue.push([x, y]);
    }
    
    function tick() {
        
        var k = 20; // adjust to limit points drawn per cycle
        
        if (queue.length - qi > 1) {
            ctx.beginPath();
            if (qi === 0)
                ctx.moveTo(queue[0][0], queue[0][1]);
            else
                ctx.moveTo(queue[qi - 1][0], queue[qi - 1][1]);

            for (++qi; --k >= 0 && qi < queue.length; ++qi) {
                ctx.lineTo(queue[qi][0], queue[qi][1]);
            }

            ctx.strokeStyle = "rgb(0,0,0)";
            ctx.lineWidth = 3;
            ctx.stroke();
        }
    }
    
    setInterval(tick, 50); // adjust cycle time
    
    return {
        setStart: setStart,
        newPoint: newPoint
    };
}();