From 13d9de52cde365329d97c7ad57e2e59405783552 Mon Sep 17 00:00:00 2001 From: alex Date: Wed, 28 May 2025 16:21:11 +0200 Subject: [PATCH 1/5] [charts] Make scatter chart use data attributes --- docs/data/charts/heatmap/heatmap.md | 2 - .../charts/scatter/ScatterCSSSelectors.js | 40 +++++++++++++++++++ .../charts/scatter/ScatterCSSSelectors.tsx | 40 +++++++++++++++++++ .../scatter/ScatterCSSSelectors.tsx.preview | 14 +++++++ docs/data/charts/scatter/scatter.md | 12 +++++- .../x-charts/src/ScatterChart/Scatter.tsx | 3 ++ 6 files changed, 108 insertions(+), 3 deletions(-) create mode 100644 docs/data/charts/scatter/ScatterCSSSelectors.js create mode 100644 docs/data/charts/scatter/ScatterCSSSelectors.tsx create mode 100644 docs/data/charts/scatter/ScatterCSSSelectors.tsx.preview diff --git a/docs/data/charts/heatmap/heatmap.md b/docs/data/charts/heatmap/heatmap.md index 00b06d6ca9435..e811a90531d7d 100644 --- a/docs/data/charts/heatmap/heatmap.md +++ b/docs/data/charts/heatmap/heatmap.md @@ -88,8 +88,6 @@ You can modify it with `slots.legend` and `slotProps.legend`. {{"demo": "HeatmapLegend.js"}} -## Labels 🚧 - ## Custom item {{"demo": "CustomItem.js"}} diff --git a/docs/data/charts/scatter/ScatterCSSSelectors.js b/docs/data/charts/scatter/ScatterCSSSelectors.js new file mode 100644 index 0000000000000..5079fb16e6ad7 --- /dev/null +++ b/docs/data/charts/scatter/ScatterCSSSelectors.js @@ -0,0 +1,40 @@ +import * as React from 'react'; +import { ScatterChart } from '@mui/x-charts/ScatterChart'; + +import { data } from './randomData'; + +const series = [ + { + id: 'series-1', + type: 'scatter', + label: 'Series A', + data: data.map((v) => ({ x: v.x1, y: v.y1, id: v.id })), + highlightScope: { highlight: 'item', fade: 'global' }, + }, + { + id: 'series-2', + type: 'scatter', + label: 'Series B', + data: data.map((v) => ({ x: v.x1, y: v.y2, id: v.id })), + highlightScope: { highlight: 'item', fade: 'global' }, + }, +]; + +export default function ScatterCSSSelectors() { + return ( + + ); +} diff --git a/docs/data/charts/scatter/ScatterCSSSelectors.tsx b/docs/data/charts/scatter/ScatterCSSSelectors.tsx new file mode 100644 index 0000000000000..0778013c97ada --- /dev/null +++ b/docs/data/charts/scatter/ScatterCSSSelectors.tsx @@ -0,0 +1,40 @@ +import * as React from 'react'; +import { ScatterChart } from '@mui/x-charts/ScatterChart'; +import { ScatterSeriesType } from '@mui/x-charts/models'; +import { data } from './randomData'; + +const series: ScatterSeriesType[] = [ + { + id: 'series-1', + type: 'scatter', + label: 'Series A', + data: data.map((v) => ({ x: v.x1, y: v.y1, id: v.id })), + highlightScope: { highlight: 'item', fade: 'global' }, + }, + { + id: 'series-2', + type: 'scatter', + label: 'Series B', + data: data.map((v) => ({ x: v.x1, y: v.y2, id: v.id })), + highlightScope: { highlight: 'item', fade: 'global' }, + }, +]; + +export default function ScatterCSSSelectors() { + return ( + + ); +} diff --git a/docs/data/charts/scatter/ScatterCSSSelectors.tsx.preview b/docs/data/charts/scatter/ScatterCSSSelectors.tsx.preview new file mode 100644 index 0000000000000..ce320e3b99d57 --- /dev/null +++ b/docs/data/charts/scatter/ScatterCSSSelectors.tsx.preview @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/docs/data/charts/scatter/scatter.md b/docs/data/charts/scatter/scatter.md index 2f475465cd8b6..a04d4c03712c6 100644 --- a/docs/data/charts/scatter/scatter.md +++ b/docs/data/charts/scatter/scatter.md @@ -105,7 +105,17 @@ See [Axis—Grid](/x/react-charts/axis/#grid) documentation for more information {{"demo": "GridDemo.js"}} -### CSS 🚧 +### CSS + +You can target scatter elements with CSS selector by using the following data attributes: + +- `data-series-id=''` +- `data-highlighted=true|false` +- `data-faded=true|false` + +Here is an example the modify how highlight impact items. + +{{"demo": "ScatterCSSSelectors.js"}} ### Shape diff --git a/packages/x-charts/src/ScatterChart/Scatter.tsx b/packages/x-charts/src/ScatterChart/Scatter.tsx index 7f197939fa65a..112e304a4365d 100644 --- a/packages/x-charts/src/ScatterChart/Scatter.tsx +++ b/packages/x-charts/src/ScatterChart/Scatter.tsx @@ -154,6 +154,9 @@ function Scatter(props: ScatterProps) { dataIndex: dataPoint.dataIndex, })) } + data-series-id={series.id} + data-highlighted={dataPoint.isHighlighted} + data-faded={dataPoint.isFaded} {...interactionItemProps[i]} {...markerProps} /> From ede8cdb9c07a80b51468b8981e74170b801ed42e Mon Sep 17 00:00:00 2001 From: alex Date: Mon, 2 Jun 2025 10:43:06 +0200 Subject: [PATCH 2/5] test --- packages/x-charts/src/ScatterChart/Scatter.tsx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/x-charts/src/ScatterChart/Scatter.tsx b/packages/x-charts/src/ScatterChart/Scatter.tsx index 112e304a4365d..7d61c669e934d 100644 --- a/packages/x-charts/src/ScatterChart/Scatter.tsx +++ b/packages/x-charts/src/ScatterChart/Scatter.tsx @@ -154,9 +154,10 @@ function Scatter(props: ScatterProps) { dataIndex: dataPoint.dataIndex, })) } - data-series-id={series.id} - data-highlighted={dataPoint.isHighlighted} - data-faded={dataPoint.isFaded} + data-series={series.id} + data-index={dataPoint.dataIndex} + data-highlighted={dataPoint.isHighlighted || undefined} + data-faded={dataPoint.isFaded || undefined} {...interactionItemProps[i]} {...markerProps} /> From 75ca717933a24393db453a18cf4efdaf1151b346 Mon Sep 17 00:00:00 2001 From: alex Date: Tue, 10 Jun 2025 12:43:05 +0200 Subject: [PATCH 3/5] test --- packages/x-charts/src/ScatterChart/Scatter.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/x-charts/src/ScatterChart/Scatter.tsx b/packages/x-charts/src/ScatterChart/Scatter.tsx index 7d61c669e934d..bea6e52d8c78f 100644 --- a/packages/x-charts/src/ScatterChart/Scatter.tsx +++ b/packages/x-charts/src/ScatterChart/Scatter.tsx @@ -135,7 +135,7 @@ function Scatter(props: ScatterProps) { }); return ( - + {cleanData.map((dataPoint, i) => ( Date: Wed, 11 Jun 2025 10:45:18 +0200 Subject: [PATCH 4/5] feedback --- .../charts/scatter/ScatterCSSSelectors.js | 8 +++---- .../charts/scatter/ScatterCSSSelectors.tsx | 8 +++---- .../scatter/ScatterCSSSelectors.tsx.preview | 8 +++---- docs/data/charts/scatter/scatter.md | 12 ++++++---- docs/pages/x/api/charts/scatter.json | 9 ++++++- .../api-docs/charts/scatter/scatter.json | 2 +- .../x-charts/src/ScatterChart/Scatter.tsx | 19 +++++++++++++-- packages/x-charts/src/ScatterChart/index.ts | 2 ++ .../src/ScatterChart/scatterClasses.ts | 24 +++++++++++++++++++ scripts/x-charts-pro.exports.json | 2 ++ scripts/x-charts.exports.json | 2 ++ 11 files changed, 75 insertions(+), 21 deletions(-) create mode 100644 packages/x-charts/src/ScatterChart/scatterClasses.ts diff --git a/docs/data/charts/scatter/ScatterCSSSelectors.js b/docs/data/charts/scatter/ScatterCSSSelectors.js index 5079fb16e6ad7..a07c2cac0dc44 100644 --- a/docs/data/charts/scatter/ScatterCSSSelectors.js +++ b/docs/data/charts/scatter/ScatterCSSSelectors.js @@ -24,12 +24,12 @@ export default function ScatterCSSSelectors() { return ( , scatterItemIdentifier: ScatterItemIdentifier, ) => void; + classes?: Partial; slots?: ScatterSlots; slotProps?: ScatterSlotProps; } @@ -57,7 +59,17 @@ export interface ScatterSlotProps extends ScatterMarkerSlotProps {} * - [Scatter API](https://mui.com/x/api/charts/scatter/) */ function Scatter(props: ScatterProps) { - const { series, xScale, yScale, color, colorGetter, onItemClick, slots, slotProps } = props; + const { + series, + xScale, + yScale, + color, + colorGetter, + onItemClick, + classes: inClasses, + slots, + slotProps, + } = props; const { instance } = useChartContext(); const store = useStore<[UseChartVoronoiSignature]>(); @@ -134,8 +146,10 @@ function Scatter(props: ScatterProps) { ownerState: {}, }); + const classes = useUtilityClasses(inClasses); + return ( - + {cleanData.map((dataPoint, i) => ( ) => { + const slots = { + root: ['root'], + }; + + return composeClasses(slots, getScatterUtilityClass, classes); +}; diff --git a/scripts/x-charts-pro.exports.json b/scripts/x-charts-pro.exports.json index 69b3e70a3a972..060b20536fa55 100644 --- a/scripts/x-charts-pro.exports.json +++ b/scripts/x-charts-pro.exports.json @@ -380,6 +380,8 @@ { "name": "ScatterChartProSlots", "kind": "Interface" }, { "name": "ScatterChartSlotProps", "kind": "Interface" }, { "name": "ScatterChartSlots", "kind": "Interface" }, + { "name": "scatterClasses", "kind": "Variable" }, + { "name": "ScatterClasses", "kind": "Interface" }, { "name": "ScatterItemIdentifier", "kind": "TypeAlias" }, { "name": "ScatterMarker", "kind": "Function" }, { "name": "ScatterMarkerProps", "kind": "Interface" }, diff --git a/scripts/x-charts.exports.json b/scripts/x-charts.exports.json index f8d6ec6d28653..71c231e7b57a9 100644 --- a/scripts/x-charts.exports.json +++ b/scripts/x-charts.exports.json @@ -335,6 +335,8 @@ { "name": "ScatterChartProps", "kind": "Interface" }, { "name": "ScatterChartSlotProps", "kind": "Interface" }, { "name": "ScatterChartSlots", "kind": "Interface" }, + { "name": "scatterClasses", "kind": "Variable" }, + { "name": "ScatterClasses", "kind": "Interface" }, { "name": "ScatterItemIdentifier", "kind": "TypeAlias" }, { "name": "ScatterMarker", "kind": "Function" }, { "name": "ScatterMarkerProps", "kind": "Interface" }, From 561e4a082da9a16562d9cd6c0ce47d70f45e8ab5 Mon Sep 17 00:00:00 2001 From: alex Date: Fri, 13 Jun 2025 09:34:18 +0200 Subject: [PATCH 5/5] typo --- docs/data/charts/scatter/scatter.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/data/charts/scatter/scatter.md b/docs/data/charts/scatter/scatter.md index 96b4a27ad16b0..59dae0e4841b4 100644 --- a/docs/data/charts/scatter/scatter.md +++ b/docs/data/charts/scatter/scatter.md @@ -113,7 +113,7 @@ You can target scatter markers with the following CSS selectors: - `[data-highlighted=true]` Selects markers with highlighted state. - `[data-faded=true]` Selects markers with faded state. -To select all marker groups, use the `scatterClasses.root` classe name. +To select all marker groups, use the `scatterClasses.root` class name. Here is an example that customizes the look of highlighted items depending on the series they belong to.