in frontend/src/lib/cytoscape-cxtmenu/cxtmenu.js [215:260]
function drawCommands(rx, ry, radius, theta) {
const dtheta = 2 * Math.PI / (commands.length);
let theta1 = Math.PI / 2;
let theta2 = theta1 + dtheta;
theta1 += dtheta * activeCommandI;
theta2 += dtheta * activeCommandI;
c2d.fillStyle = options.activeFillColor;
c2d.strokeStyle = 'black';
c2d.lineWidth = 1;
c2d.beginPath();
c2d.moveTo(r + options.activePadding, r + options.activePadding);
c2d.arc(r + options.activePadding, r + options.activePadding, r + options.activePadding, 2 * Math.PI - theta1, 2 * Math.PI - theta2, true);
c2d.closePath();
c2d.fill();
c2d.fillStyle = 'white';
c2d.globalCompositeOperation = 'destination-out';
const tx = radius + options.activePadding + rx / radius * (rs + options.spotlightPadding - options.indicatorSize / 4);
const ty = radius + options.activePadding + ry / radius * (rs + options.spotlightPadding - options.indicatorSize / 4);
const rot = Math.PI / 4 - theta;
c2d.translate(tx, ty);
c2d.rotate(rot);
// clear the indicator
c2d.beginPath();
c2d.fillRect(-options.indicatorSize / 2, -options.indicatorSize / 2, options.indicatorSize, options.indicatorSize);
c2d.closePath();
c2d.fill();
c2d.rotate(-rot);
c2d.translate(-tx, -ty);
// c2d.setTransform( 1, 0, 0, 1, 0, 0 );
// clear the spotlight
c2d.beginPath();
c2d.arc(r + options.activePadding, radius + options.activePadding, rs + options.spotlightPadding, 0, Math.PI * 2, true);
c2d.closePath();
c2d.fill();
c2d.globalCompositeOperation = 'source-over';
}