diff --git a/src/components/image-editor/useImageCanvasStageInteractions.test.tsx b/src/components/image-editor/useImageCanvasStageInteractions.test.tsx
index 0db87d40a..9c1ccdde9 100644
--- a/src/components/image-editor/useImageCanvasStageInteractions.test.tsx
+++ b/src/components/image-editor/useImageCanvasStageInteractions.test.tsx
@@ -920,4 +920,52 @@ describe('useImageCanvasStageInteractions', () => {
expect(flushMinimapViewportDrag).toHaveBeenCalledTimes(1);
expect(onViewportInteractionEnd).toHaveBeenCalledTimes(2);
});
+
+ it('allows middle-button dragging and rejects right-button dragging', () => {
+ render();
+
+ const viewport = screen.getByTestId('viewport');
+
+ act(() => {
+ fireEvent(
+ viewport,
+ new MouseEvent('pointerdown',{
+ bubbles: true,
+ clientX: 100,
+ clientY: 100,
+ button: 1,
+ buttons: 4,
+ }),
+ );
+ });
+ expect(screen.getByTestId('panning').textContent).toBe('true');
+
+ act(() => {
+ fireEvent(
+ viewport,
+ new MouseEvent('pointerup',{
+ bubbles: true,
+ clientX: 100,
+ clientY: 100,
+ button: 1,
+ buttons: 0,
+ }),
+ );
+ });
+ expect(screen.getByTestId('panning').textContent).toBe('false');
+
+ act(() => {
+ fireEvent(
+ viewport,
+ new MouseEvent('pointerdown',{
+ bubbles: true,
+ clientX: 100,
+ clientY: 100,
+ button: 2,
+ buttons: 2,
+ }),
+ );
+ });
+ expect(screen.getByTestId('panning').textContent).toBe('false');
+ });
});
diff --git a/src/components/image-editor/useImageCanvasStageInteractions.ts b/src/components/image-editor/useImageCanvasStageInteractions.ts
index 1b94876b2..5f19ae5d3 100644
--- a/src/components/image-editor/useImageCanvasStageInteractions.ts
+++ b/src/components/image-editor/useImageCanvasStageInteractions.ts
@@ -239,7 +239,7 @@ export function useImageCanvasStageInteractions({
const handleCanvasPointerDown = useCallback(
(event: ReactPointerEvent) => {
const button = getPointerButton(event);
- if (button !== 0 || effectiveTool === 'hand') {
+ if (button === 1 ||(button !== 2 && effectiveTool === 'hand')) {
startPan(event);
return;
}