From b10c233a70c05cd1b1cb3c0e77b637da6efe8dc1 Mon Sep 17 00:00:00 2001 From: Bernardo Belchior Date: Mon, 24 Nov 2025 15:09:56 +0100 Subject: [PATCH 1/2] [charts-pro] Fix vertical zoom slider thumb not working on mobile --- .../internals/ChartAxisZoomSliderThumb.tsx | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/x-charts-pro/src/ChartZoomSlider/internals/ChartAxisZoomSliderThumb.tsx b/packages/x-charts-pro/src/ChartZoomSlider/internals/ChartAxisZoomSliderThumb.tsx index 9f7d24130bcc9..08fad67995bcd 100644 --- a/packages/x-charts-pro/src/ChartZoomSlider/internals/ChartAxisZoomSliderThumb.tsx +++ b/packages/x-charts-pro/src/ChartZoomSlider/internals/ChartAxisZoomSliderThumb.tsx @@ -61,6 +61,8 @@ export const ChartAxisZoomSliderThumb = React.forwardRef { onMoveEvent(event); }); @@ -68,6 +70,7 @@ export const ChartAxisZoomSliderThumb = React.forwardRef { thumb.removeEventListener('pointermove', onPointerMove); thumb.removeEventListener('pointerup', onPointerUp); + document.body.style.touchAction = prevTouchAction; }; const onPointerDown = (event: PointerEvent) => { @@ -75,6 +78,11 @@ export const ChartAxisZoomSliderThumb = React.forwardRef Date: Tue, 25 Nov 2025 09:18:33 +0100 Subject: [PATCH 2/2] Another fix attempt --- .../internals/ChartAxisZoomSliderThumb.tsx | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/packages/x-charts-pro/src/ChartZoomSlider/internals/ChartAxisZoomSliderThumb.tsx b/packages/x-charts-pro/src/ChartZoomSlider/internals/ChartAxisZoomSliderThumb.tsx index 08fad67995bcd..d086ea7d454b4 100644 --- a/packages/x-charts-pro/src/ChartZoomSlider/internals/ChartAxisZoomSliderThumb.tsx +++ b/packages/x-charts-pro/src/ChartZoomSlider/internals/ChartAxisZoomSliderThumb.tsx @@ -38,6 +38,10 @@ export interface ChartZoomSliderThumbProps extends Omit, 'orientation'>, ChartZoomSliderThumbOwnerState {} +function preventDefault(event: Event) { + event.preventDefault(); +} + /** * Renders the zoom slider thumb, which is responsible for resizing the zoom range. * @internal @@ -58,19 +62,21 @@ export const ChartAxisZoomSliderThumb = React.forwardRef {}; } - let prevTouchAction = 'auto'; + // Prevent scrolling on touch devices when dragging the thumb + thumb.addEventListener('touchmove', preventDefault, { passive: false }); const onPointerMove = rafThrottle((event: PointerEvent) => { onMoveEvent(event); }); - const onPointerUp = () => { + const onPointerEnd = (event: PointerEvent) => { thumb.removeEventListener('pointermove', onPointerMove); - thumb.removeEventListener('pointerup', onPointerUp); - document.body.style.touchAction = prevTouchAction; + thumb.removeEventListener('pointerup', onPointerEnd); + thumb.removeEventListener('pointercancel', onPointerEnd); + thumb.releasePointerCapture(event.pointerId); }; const onPointerDown = (event: PointerEvent) => { @@ -79,19 +85,19 @@ export const ChartAxisZoomSliderThumb = React.forwardRef { thumb.removeEventListener('pointerdown', onPointerDown); + thumb.removeEventListener('pointermove', onPointerMove); + thumb.removeEventListener('pointercancel', onPointerEnd); + thumb.removeEventListener('pointerup', onPointerEnd); + thumb.removeEventListener('touchmove', preventDefault); onPointerMove.clear(); }; }, [onMoveEvent, orientation]);