Code walkthrough

React + 60fps — refs, one poll loop

lib/gamepad.ts

Browser slot indices

Never hardcode pads[0] — indices are assigned by the OS

48/** Read all four browser slots (index is not connection order). */49export function pollAllGamepadSlots(): GamepadState[] {50  const pads = navigator.getGamepads();51  return Array.from({ length: 4 }, (_, slotIndex) => {52    const gp = pads[slotIndex];53    if (gp?.connected) return parseGamepad(gp);54    return emptyGamepadState(slotIndex);55  });56}57 58export function getPrimaryGamepad(states: GamepadState[]): GamepadState {59  return states.find((s) => s.connected) ?? emptyGamepadState(0);60}