JSFiddle - React, Tailwind, and code Playground

JavaScript

function makeGLCanvas()
    {
        // Get A WebGL context
        var canvas = document.createElement('canvas');
        var contextNames = ["webgl", "experimental-webgl"];
        var gl = null;
        for (var i = 0; i < contextNames.length; ++i)
        {
            try
            {
                gl = canvas.getContext(contextNames[i], {
                    // Used so that the buffer contains valid information, and bytes can
                    // be retrieved from it. Otherwise, WebGL will switch to the back buffer
                    preserveDrawingBuffer: true
                });
            }
            catch(e) {}
            if (gl != null)
            {
                break;
            }
        }
        if (gl == null)
        {
            alert("WebGL not supported.\nGlobus won't work\nTry using browsers such as Mozilla " +
                "Firefox, Google Chrome or Opera");
            // TODO: Expecting that the canvas will be collected. If that is not the case, it will
            // need to be destroyed somehow.
            return;
        }

        return [canvas, gl];
    }

    // From Wikipedia
    function gcd(a,b) {
        a = Math.abs(a);
        b = Math.abs(b);
        if (b > a) {var temp = a; a = b; b = temp;}
        while (true) {
            if (b == 0) return a;
            a %= b;
            if (a == 0) return b;
            b %= a;
        }
    }

    function isGlContextFillingTheCanvas(gl) {
        return gl.canvas.width == gl.drawingBufferWidth && gl.canvas.height == gl.drawingBufferHeight;
    }

    // (See issue #2) All browsers reduce the size of the WebGL draw buffer for large canvases 
    // (usually over 4096px in width or height). This function uses a varian of binary search to
    // find the maximum size for a canvas given the provided x to y size ratio.
    //
    // To produce exact results, this function expects an integer ratio. The ratio will be equal to:
    // xRatio/yRatio.
    function...