JSFiddle - React, Tailwind, and code Playground

HTML

<canvas id="drawCanvas" width="800" height="550" style="border:1px solid #000000;"/>

JavaScript

var numWires = 3;
var numStates = Math.pow(2, numWires);
var tau = Math.PI*2;

// --- Layout Constants ---
var makeRect = function(x, y, w, h) {
    return {x:x,y:y,w:w,h:h};
};
var canvas = document.getElementById("drawCanvas");
var ctx = canvas.getContext("2d");
ctx.font = "12px Helvetica";
var gateRadius = 25;
var circuitOperationHorizontalSpacing = 10;
var circuitOperations = [];

var testVectorsTitleOffset = -20;
var testVectorLabelOffset = -8;
var testVectorSeparation = 3;

var testVectorsY = 350;
var testVectorsInterSpacing = 25;
var testVectorsWidth = (canvas.width + testVectorsInterSpacing) / 4 - testVectorsInterSpacing;

var circuitRect = makeRect(0, 120, canvas.width, 201);
var inputVectorsRect = makeRect(5, testVectorsY, testVectorsWidth, -1);
var operationMatrixRect = makeRect(
	inputVectorsRect.x + inputVectorsRect.w + testVectorsInterSpacing, 
	testVectorsY, 
	testVectorsWidth - testVectorSeparation*(numStates-1), 
	testVectorsWidth - testVectorSeparation*(numStates-1));
var outputVectorsRect = makeRect(
	operationMatrixRect.x + operationMatrixRect.w + testVectorsInterSpacing, 
	testVectorsY, 
	testVectorsWidth, 
	-1);
var goalVectorsRect = makeRect(
	outputVectorsRect.x + outputVectorsRect.w + testVectorsInterSpacing, 
	testVectorsY, 
	testVectorsWidth, 
	-1);
var showOperationMatrixInline = false;
var intermediateVectorsRect = inputVectorsRect;
if (numWires > 3) {
    circuitRect = makeRect(0, 120, 1400, 200);
    inputVectorsRect = makeRect(0, testVectorsY, 300, -1);
    operationMatrixRect = makeRect(0, 130, 200, 200);
    showOperationMatrixInline = true;
    outputVectorsRect = makeRect(350, testVectorsY, 300, -1);
    intermediateVectorsRect = inputVectorsRect;
}
var complexPhaseSweepRadius = 8;
var showComplexPhaseHaveEnoughRadiusCutoff = 20;
var inputTestVectorsCaption = "Test Inputs";
var intermediatePostTestVectorsCaption = "States after Operation";
var outputTestVectorsCaption = "Current Outputs";
var effectOfOperationCaption =...