setView({ tx: 0, ty: 0 })}
onPointerDown={(event) => {
if (event.button !== 0) return;
dragRef.current = { x: event.clientX, y: event.clientY, tx: view.tx, ty: view.ty };
setPanning(true);
event.currentTarget.setPointerCapture(event.pointerId);
}}
onPointerMove={(event) => {
const drag = dragRef.current;
if (!drag) return;
setView({ tx: drag.tx + event.clientX - drag.x, ty: drag.ty + event.clientY - drag.y });
}}
onPointerUp={endPan}
onPointerCancel={endPan}
>
{stages.map((stage, stageIndex) => {
const stageWidth = Math.max(
nodeWidth,
stage.seats.length * (nodeWidth + nodeGap) - nodeGap,
);
return (
{stage.seats.map((seat) => {
const accent = NODE_COLORS[(colorIndex++ + 1) % NODE_COLORS.length]!;
return (
);
})}
);
})}
);
}
function FlowConnector({
branches,
width,
nodeWidth,
nodeGap,
}: {
branches: number;
width: number;
nodeWidth: number;
nodeGap: number;
}) {
const connectorStyle = { backgroundColor: "rgba(148,163,184,.88)" };
if (branches <= 1) {
return (