main guarded scroll's x/y independently (coordinate=[null,100] -> y=100), while click treats a coordinate without x as no point. The shared _xy() applied click semantics to scroll; split out _scroll_xy() with main's per-axis guard and pin both behaviors in a test.