diff --git a/packages/x-charts-pro/src/ChartZoomSlider/internals/ChartAxisZoomSlider.tsx b/packages/x-charts-pro/src/ChartZoomSlider/internals/ChartAxisZoomSlider.tsx index 439224aaa208b..fc75b41026a50 100644 --- a/packages/x-charts-pro/src/ChartZoomSlider/internals/ChartAxisZoomSlider.tsx +++ b/packages/x-charts-pro/src/ChartZoomSlider/internals/ChartAxisZoomSlider.tsx @@ -18,6 +18,7 @@ import { import { styled } from '@mui/material/styles'; import { useXAxes, useYAxes } from '@mui/x-charts/hooks'; import { rafThrottle } from '@mui/x-internals/rafThrottle'; +import { shouldForwardProp } from '@mui/system'; import { ChartsTooltipZoomSliderValue } from './ChartsTooltipZoomSliderValue'; import { selectorChartAxisZoomData, @@ -25,14 +26,29 @@ import { } from '../../internals/plugins/useChartProZoom'; import { ChartAxisZoomSliderThumb } from './ChartAxisZoomSliderThumb'; -const ZoomSliderTrack = styled('rect')(({ theme }) => ({ - '&': { - fill: - theme.palette.mode === 'dark' - ? (theme.vars || theme).palette.grey[800] - : (theme.vars || theme).palette.grey[300], - cursor: 'crosshair', - }, +const ZoomSliderTrack = styled('rect', { + shouldForwardProp: (prop) => + shouldForwardProp(prop) && prop !== 'axisDirection' && prop !== 'isSelecting', +})<{ axisDirection: 'x' | 'y'; isSelecting: boolean }>(({ theme }) => ({ + fill: + theme.palette.mode === 'dark' + ? (theme.vars || theme).palette.grey[800] + : (theme.vars || theme).palette.grey[300], + cursor: 'pointer', + variants: [ + { + props: { axisDirection: 'x', isSelecting: true }, + style: { + cursor: 'ew-resize', + }, + }, + { + props: { axisDirection: 'y', isSelecting: true }, + style: { + cursor: 'ns-resize', + }, + }, + ], })); const ZoomSliderActiveTrackRect = styled('rect')(({ theme }) => ({ @@ -162,6 +178,7 @@ function ChartAxisZoomSliderTrack({ const ref = React.useRef(null); const { instance, svgRef } = useChartContext<[UseChartProZoomSignature]>(); const store = useStore<[UseChartProZoomSignature]>(); + const [isSelecting, setIsSelecting] = React.useState(false); const onPointerDown = function onPointerDown(event: React.PointerEvent) { const rect = ref.current; @@ -241,6 +258,7 @@ function ChartAxisZoomSliderTrack({ rect.releasePointerCapture(pointerUpEvent.pointerId); rect.removeEventListener('pointermove', onPointerMove); document.removeEventListener('pointerup', onPointerUp); + setIsSelecting(false); if (pointerMoved) { return; @@ -271,6 +289,7 @@ function ChartAxisZoomSliderTrack({ document.addEventListener('pointerup', onPointerUp); rect.addEventListener('pointermove', onPointerMove); + setIsSelecting(true); instance.setAxisZoomData(axisId, (prev) => ({ ...prev, start: zoomFromPointerDown, @@ -278,7 +297,15 @@ function ChartAxisZoomSliderTrack({ })); }; - return ; + return ( + + ); } const formatter = Intl.NumberFormat(undefined, { maximumFractionDigits: 0 }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c9f32dd1ce03c..beaa28f8c2cdf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -78,7 +78,7 @@ importers: version: 7.0.2(@mui/material@7.0.2(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.0.0))(@types/react@19.0.12)(react@19.0.0))(@types/react@19.0.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.0.12)(react@19.0.0) '@mui/internal-babel-plugin-display-name': specifier: github:mui/mui-public#master&path:./packages/babel-plugin-display-name - version: https://codeload.github.com/mui/mui-public/tar.gz/cd8ee237392a83203449987090669ea42fe0b2d6#path:./packages/babel-plugin-display-name(@babel/core@7.27.1)(@babel/preset-react@7.27.1(@babel/core@7.27.1)) + version: https://codeload.github.com/mui/mui-public/tar.gz/931afef82da15f9926d06fbb220d2d681b9daea1#path:./packages/babel-plugin-display-name(@babel/core@7.27.1)(@babel/preset-react@7.27.1(@babel/core@7.27.1)) '@mui/internal-babel-plugin-resolve-imports': specifier: ^2.0.2 version: 2.0.2(@babel/core@7.27.1) @@ -3674,8 +3674,8 @@ packages: '@types/react': optional: true - '@mui/internal-babel-plugin-display-name@https://codeload.github.com/mui/mui-public/tar.gz/cd8ee237392a83203449987090669ea42fe0b2d6#path:./packages/babel-plugin-display-name': - resolution: {path: ./packages/babel-plugin-display-name, tarball: https://codeload.github.com/mui/mui-public/tar.gz/cd8ee237392a83203449987090669ea42fe0b2d6} + '@mui/internal-babel-plugin-display-name@https://codeload.github.com/mui/mui-public/tar.gz/931afef82da15f9926d06fbb220d2d681b9daea1#path:./packages/babel-plugin-display-name': + resolution: {path: ./packages/babel-plugin-display-name, tarball: https://codeload.github.com/mui/mui-public/tar.gz/931afef82da15f9926d06fbb220d2d681b9daea1} version: 0.0.0 peerDependencies: '@babel/core': ^7.0.0 @@ -13834,7 +13834,7 @@ snapshots: optionalDependencies: '@types/react': 19.0.12 - '@mui/internal-babel-plugin-display-name@https://codeload.github.com/mui/mui-public/tar.gz/cd8ee237392a83203449987090669ea42fe0b2d6#path:./packages/babel-plugin-display-name(@babel/core@7.27.1)(@babel/preset-react@7.27.1(@babel/core@7.27.1))': + '@mui/internal-babel-plugin-display-name@https://codeload.github.com/mui/mui-public/tar.gz/931afef82da15f9926d06fbb220d2d681b9daea1#path:./packages/babel-plugin-display-name(@babel/core@7.27.1)(@babel/preset-react@7.27.1(@babel/core@7.27.1))': dependencies: '@babel/core': 7.27.1 '@babel/helper-module-imports': 7.27.1