[charts] Add bar batch renderer#20457
Conversation
|
Deploy preview: https://deploy-preview-20457--material-ui-x.netlify.app/ Updated pages: Bundle size report
|
CodSpeed Performance ReportMerging #20457 will not alter performanceComparing Summary
Footnotes |
|
This pull request has conflicts, please resolve those before we can evaluate the pull request. |
1d51405 to
a152903
Compare
d6e2d12 to
e6c01d8
Compare
|
This pull request has conflicts, please resolve those before we can evaluate the pull request. |
856ae32 to
f8701da
Compare
|
This pull request has conflicts, please resolve those before we can evaluate the pull request. |
f8701da to
ae86542
Compare
|
This pull request has conflicts, please resolve those before we can evaluate the pull request. |
ae86542 to
185ca1f
Compare
67f4390 to
85e75cb
Compare
| import { getBarItemAtPosition } from './getBarItemAtPosition'; | ||
| import { useStore } from '../internals/store/useStore'; | ||
|
|
||
| export function useInteractionItemProps() { |
There was a problem hiding this comment.
Should we use this and useOnItemClick on the default bar renderer as well?
It feels like it could be useful if we render stuff on top of charts, or if using things like canvas
There was a problem hiding this comment.
It feels like it could be useful if we render stuff on top of charts
Well, if we want to render stuff on top of charts and don't want them to influence the clicks, we should add pointer-events: none to that stuff. I think it would be weird to hijack clicks from elements that would normally receive them.
It's unfortunate we need to maintain two code paths, but I suppose that's the price to pay for better performance.
There was a problem hiding this comment.
Is the performance much better?
There was a problem hiding this comment.
I don't think we have another option. If we want to implement a batch bar plot like the one in this PR, we can't use onClick event to detect clicks, so the only way is to calculate the clicked bar like we do in this PR.
There was a problem hiding this comment.
Oh, I don't mean that.
I meant to say that we should maybe use the way it is calculated in this PR (based on pointer only) everywhere
There was a problem hiding this comment.
We could, but it would be a breaking change because the event source would have changed.
It also changes event handling slightly, which might break stuff that users are relying on.
I guess this is something that we'd need to investigate deeper
cd32216 to
8cd7e48
Compare
This MR contains the following updates: | Package | Type | Update | Change | OpenSSF | |---|---|---|---|---| | [@mui/x-charts](https://mui.com/x/react-charts/) ([source](https://github.com/mui/mui-x/tree/HEAD/packages/x-charts)) | dependencies | minor | [`8.23.0` → `8.24.0`](https://renovatebot.com/diffs/npm/@mui%2fx-charts/8.23.0/8.24.0) | [](https://securityscorecards.dev/viewer/?uri=github.com/mui/mui-x) | | [@mui/x-tree-view](https://mui.com/x/react-tree-view/) ([source](https://github.com/mui/mui-x/tree/HEAD/packages/x-tree-view)) | dependencies | minor | [`8.23.0` → `8.24.0`](https://renovatebot.com/diffs/npm/@mui%2fx-tree-view/8.23.0/8.24.0) | [](https://securityscorecards.dev/viewer/?uri=github.com/mui/mui-x) | | [@openapitools/openapi-generator-cli](https://github.com/OpenAPITools/openapi-generator-cli) | devDependencies | minor | [`2.26.0` → `2.27.0`](https://renovatebot.com/diffs/npm/@openapitools%2fopenapi-generator-cli/2.26.0/2.27.0) | [](https://securityscorecards.dev/viewer/?uri=github.com/OpenAPITools/openapi-generator-cli) | | [@typescript-eslint/eslint-plugin](https://typescript-eslint.io/packages/eslint-plugin) ([source](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin)) | devDependencies | minor | [`8.51.0` → `8.53.0`](https://renovatebot.com/diffs/npm/@typescript-eslint%2feslint-plugin/8.51.0/8.53.0) | [](https://securityscorecards.dev/viewer/?uri=github.com/typescript-eslint/typescript-eslint) | | [@typescript-eslint/parser](https://typescript-eslint.io/packages/parser) ([source](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser)) | devDependencies | minor | [`8.51.0` → `8.53.0`](https://renovatebot.com/diffs/npm/@typescript-eslint%2fparser/8.51.0/8.53.0) | [](https://securityscorecards.dev/viewer/?uri=github.com/typescript-eslint/typescript-eslint) | | [react-router-dom](https://github.com/remix-run/react-router) ([source](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom)) | dependencies | minor | [`7.11.0` → `7.12.0`](https://renovatebot.com/diffs/npm/react-router-dom/7.11.0/7.12.0) | [](https://securityscorecards.dev/viewer/?uri=github.com/remix-run/react-router) | --- ### Release Notes <details> <summary>mui/mui-x (@​mui/x-charts)</summary> ### [`v8.24.0`](https://github.com/mui/mui-x/blob/HEAD/CHANGELOG.md#8240) [Compare Source](mui/mui-x@v8.23.0...v8.24.0) *Jan 8, 2026* We'd like to extend a big thank you to the 12 contributors who made this release possible. Here are some highlights ✨: - ⚡️Add bar [batch renderer](https://mui.com/x/react-charts/bars/#performance), result in a significant performance improvement when rendering thousands of bars - 📊 Add [range bar chart](https://mui.com/x/react-charts/range-bar/) to render  - 🌎 Improved Danish (da-DK) and Japanese (ja-JP) locales on the Data Grid Special thanks go out to these community members for their valuable contributions: [@​anders-noerrelykke](https://github.com/anders-noerrelykke), [@​auloin](https://github.com/auloin), [@​sai6855](https://github.com/sai6855), [@​yuito-it](https://github.com/yuito-it) The following team members contributed to this release: [@​alelthomas](https://github.com/alelthomas), [@​alexfauquette](https://github.com/alexfauquette), [@​arminmeh](https://github.com/arminmeh), [@​bernardobelchior](https://github.com/bernardobelchior), [@​flaviendelangle](https://github.com/flaviendelangle), [@​JCQuintas](https://github.com/JCQuintas), [@​mapache-salvaje](https://github.com/mapache-salvaje), [@​siriwatknp](https://github.com/siriwatknp) ##### Data Grid ##### `@mui/[email protected]` - \[l10n] Improve Danish (da-DK) locale ([#​20828](mui/mui-x#20828)) [@​anders-noerrelykke](https://github.com/anders-noerrelykke) - \[l10n] Improve Japanese (ja-JP) locale ([#​20251](mui/mui-x#20251)) [@​yuito-it](https://github.com/yuito-it) ##### `@mui/[email protected]` [](https://mui.com/r/x-pro-svg-link "Pro plan") Same changes as in `@mui/[email protected]`, plus: - \[DataGridPro] Fix header filter height for `density="compact"` ([#​20834](mui/mui-x#20834)) [@​arminmeh](https://github.com/arminmeh) ##### `@mui/[email protected]` [](https://mui.com/r/x-premium-svg-link "Premium plan") Same changes as in `@mui/[email protected]`. ##### Date and Time Pickers ##### `@mui/[email protected]` - \[pickers] Fix Styles applied to PickersDay when MuiPickersDay-dayOutsideMonth is used ([#​20719](mui/mui-x#20719)) [@​sai6855](https://github.com/sai6855) ##### `@mui/[email protected]` [](https://mui.com/r/x-pro-svg-link "Pro plan") Same changes as in `@mui/[email protected]`. ##### Charts ##### `@mui/[email protected]` - \[charts] Add `VisibilityManager` logic to allow managing series/items ([#​20571](mui/mui-x#20571)) [@​JCQuintas](https://github.com/JCQuintas) - \[charts] Add `identifierSerializer` configuration ([#​20775](mui/mui-x#20775)) [@​JCQuintas](https://github.com/JCQuintas) - \[charts] Add `serializeIdentifier` instance function ([#​20791](mui/mui-x#20791)) [@​JCQuintas](https://github.com/JCQuintas) - \[charts] Add bar batch renderer ([#​20457](mui/mui-x#20457)) [@​bernardobelchior](https://github.com/bernardobelchior) - \[charts] Allow animating bar, line, and pie elements to hidden state ([#​20798](mui/mui-x#20798)) [@​JCQuintas](https://github.com/JCQuintas) - \[charts] Fix failing lint step ([#​20813](mui/mui-x#20813)) [@​bernardobelchior](https://github.com/bernardobelchior) - \[charts] Fix tooltip anchored to item ([#​20783](mui/mui-x#20783)) [@​alexfauquette](https://github.com/alexfauquette) - \[charts] Fix type casting in getCategoryAxisConfig and applySeriesLayout functions ([#​20797](mui/mui-x#20797)) [@​sai6855](https://github.com/sai6855) - \[charts] Let keyboard navigation avoid overflow and handle nullish values ([#​20757](mui/mui-x#20757)) [@​alexfauquette](https://github.com/alexfauquette) - \[charts] Refactor `PieChart` and `PieChartPro` to use `slots` and `slotProps` directly ([#​20795](mui/mui-x#20795)) [@​sai6855](https://github.com/sai6855) - \[charts] Refactor `useRegisterPointerEventHandlers` ([#​20824](mui/mui-x#20824)) [@​bernardobelchior](https://github.com/bernardobelchior) - \[charts] Update legend types to allow hiding/showing items ([#​20784](mui/mui-x#20784)) [@​JCQuintas](https://github.com/JCQuintas) ##### `@mui/[email protected]` [](https://mui.com/r/x-pro-svg-link "Pro plan") Same changes as in `@mui/[email protected]`, plus: - \[charts-pro] Pass `slotProps.toolbar` to `Toolbar` in `PieChartPro` ([#​20796](mui/mui-x#20796)) [@​sai6855](https://github.com/sai6855) ##### `@mui/[email protected]` [](https://mui.com/r/x-premium-svg-link "Premium plan") Same changes as in `@mui/[email protected]`, plus: - \[charts-premium] Add range bar chart ([#​20275](mui/mui-x#20275)) [@​bernardobelchior](https://github.com/bernardobelchior) ##### Tree View ##### `@mui/[email protected]` - \[tree view] Introduce a Tree View Store to clean the internals ([#​20051](mui/mui-x#20051)) [@​flaviendelangle](https://github.com/flaviendelangle) ##### `@mui/[email protected]` [](https://mui.com/r/x-pro-svg-link "Pro plan") Same changes as in `@mui/[email protected]`. ##### Codemod ##### `@mui/[email protected]` Internal changes. ##### Docs - \[docs] Fix axis size default values ([#​20799](mui/mui-x#20799)) [@​bernardobelchior](https://github.com/bernardobelchior) - \[docs] Update What's New in MUI X page with post v8 features (DX-118) ([#​20787](mui/mui-x#20787)) [@​alelthomas](https://github.com/alelthomas) - \[docs] Fix `onAccept`'s `context.source` documentation to use 'view' instead of 'picker' ([#​20465](mui/mui-x#20465)) [@​auloin](https://github.com/auloin) - \[docs] Revise the Charts Brush doc ([#​20792](mui/mui-x#20792)) [@​mapache-salvaje](https://github.com/mapache-salvaje) - \[docs] Revise the Charts Highlighting doc ([#​20788](mui/mui-x#20788)) [@​mapache-salvaje](https://github.com/mapache-salvaje) - \[docs] Revise the Charts Label doc ([#​20794](mui/mui-x#20794)) [@​mapache-salvaje](https://github.com/mapache-salvaje) - \[docs] Revise the Charts Export doc ([#​20779](mui/mui-x#20779)) [@​mapache-salvaje](https://github.com/mapache-salvaje) ##### Core - \[code-infra] Fix v8.23.0 release date ([#​20767](mui/mui-x#20767)) [@​bernardobelchior](https://github.com/bernardobelchior) - \[code-infra] Remove `glob-gitignore` ([#​20801](mui/mui-x#20801)) [@​bernardobelchior](https://github.com/bernardobelchior) - \[code-infra] Remove `nyc` ([#​20804](mui/mui-x#20804)) [@​bernardobelchior](https://github.com/bernardobelchior) - \[code-infra] Remove `stream-browserify` and `null-loader` ([#​20805](mui/mui-x#20805)) [@​bernardobelchior](https://github.com/bernardobelchior) - \[code-infra] Remove `stylelint-config-tailwindcss` ([#​20807](mui/mui-x#20807)) [@​bernardobelchior](https://github.com/bernardobelchior) - \[code-infra] Remove unused `path` package ([#​20802](mui/mui-x#20802)) [@​bernardobelchior](https://github.com/bernardobelchior) - \[code-infra] Retry flaky e2e test on webkit ([#​20806](mui/mui-x#20806)) [@​JCQuintas](https://github.com/JCQuintas) - \[internal] Add `internal` slot to properly generate components CSS layer ([#​20763](mui/mui-x#20763)) [@​siriwatknp](https://github.com/siriwatknp) </details> <details> <summary>OpenAPITools/openapi-generator-cli (@​openapitools/openapi-generator-cli)</summary> ### [`v2.27.0`](https://github.com/OpenAPITools/openapi-generator-cli/releases/tag/v2.27.0) [Compare Source](OpenAPITools/openapi-generator-cli@v2.26.0...v2.27.0) ##### Features - **config:** add support for environment variable placeholders in config ([#​1031](OpenAPITools/openapi-generator-cli#1031)) ([1cd2614](OpenAPITools/openapi-generator-cli@1cd2614)) </details> <details> <summary>typescript-eslint/typescript-eslint (@​typescript-eslint/eslint-plugin)</summary> ### [`v8.53.0`](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#8530-2026-01-12) [Compare Source](typescript-eslint/typescript-eslint@v8.52.0...v8.53.0) ##### 🚀 Features - **eslint-plugin:** add rule \[strict-void-return] ([#​9707](typescript-eslint/typescript-eslint#9707)) - **eslint-plugin:** \[no-unused-vars] add a fixer to remove unused imports ([#​11922](typescript-eslint/typescript-eslint#11922)) ##### 🩹 Fixes - **eslint-plugin:** \[no-useless-default-assignment] fix false positive for parameters corresponding to a rest parameter ([#​11916](typescript-eslint/typescript-eslint#11916)) - **eslint-plugin:** replace unclear "`error` typed" with more helpful description ([#​11704](typescript-eslint/typescript-eslint#11704)) - **typescript-estree:** forbid invalid `extends` and `implements` in interface declaration ([#​11935](typescript-eslint/typescript-eslint#11935)) - **typescript-estree:** forbid invalid class implements ([#​11934](typescript-eslint/typescript-eslint#11934)) - **typescript-estree:** forbid type-only import with both default and named specifiers ([#​11930](typescript-eslint/typescript-eslint#11930)) ##### ❤️ Thank You - Brad Zacher [@​bradzacher](https://github.com/bradzacher) - fisker Cheung [@​fisker](https://github.com/fisker) - Josh Goldberg - Josh Goldberg ✨ - Kirk Waiblinger - Niki [@​phaux](https://github.com/phaux) - Nikita - SungHyun627 [@​SungHyun627](https://github.com/SungHyun627) - Will Harney [@​wjhsf](https://github.com/wjhsf) You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website. ### [`v8.52.0`](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#8520-2026-01-05) [Compare Source](typescript-eslint/typescript-eslint@v8.51.0...v8.52.0) ##### 🚀 Features - **eslint-plugin-internal:** \[no-multiple-lines-of-errors] add rule ([#​11899](typescript-eslint/typescript-eslint#11899)) ##### 🩹 Fixes - **eslint-plugin:** \[no-base-to-string] detect @​[@​toPrimitive](https://github.com/toPrimitive) and valueOf ([#​11901](typescript-eslint/typescript-eslint#11901)) - **eslint-plugin:** \[no-useless-default-assignment] handle conditional initializer ([#​11908](typescript-eslint/typescript-eslint#11908)) ##### ❤️ Thank You - Josh Goldberg ✨ - Ulrich Stark You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website. </details> <details> <summary>typescript-eslint/typescript-eslint (@​typescript-eslint/parser)</summary> ### [`v8.53.0`](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#8530-2026-01-12) [Compare Source](typescript-eslint/typescript-eslint@v8.52.0...v8.53.0) This was a version bump only for parser to align it with other projects, there were no code changes. You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website. ### [`v8.52.0`](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#8520-2026-01-05) [Compare Source](typescript-eslint/typescript-eslint@v8.51.0...v8.52.0) This was a version bump only for parser to align it with other projects, there were no code changes. You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website. </details> <details> <summary>remix-run/react-router (react-router-dom)</summary> ### [`v7.12.0`](https://github.com/remix-run/react-router/blob/HEAD/packages/react-router-dom/CHANGELOG.md#7120) [Compare Source](https://github.com/remix-run/react-router/compare/[email protected]@7.12.0) ##### Patch Changes - Updated dependencies: - `[email protected]` </details> --- - [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box --- This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi43MS4wIiwidXBkYXRlZEluVmVyIjoiNDIuODEuMyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIiwicmVub3ZhdGUiXX0=--> See merge request swiss-armed-forces/cyber-command/cea/loom!243 Co-authored-by: shrewd-laidback palace <shrewd-laidback-palace-736-c41-2c1-e464fc974@swiss-armed-forces-open-source.ch> Co-authored-by: Loom MR Pipeline Trigger <group_103951964_bot_9504bb8dead6d4e406ad817a607f24be@noreply.gitlab.com>
chore(deps): update frontend dependencies (minor) (minor) This MR contains the following updates: | Package | Type | Update | Change | OpenSSF | |---|---|---|---|---| | [@mui/x-charts](https://mui.com/x/react-charts/) ([source](https://github.com/mui/mui-x/tree/HEAD/packages/x-charts)) | dependencies | minor | [`8.23.0` → `8.24.0`](https://renovatebot.com/diffs/npm/@mui%2fx-charts/8.23.0/8.24.0) | [](https://securityscorecards.dev/viewer/?uri=github.com/mui/mui-x) | | [@mui/x-tree-view](https://mui.com/x/react-tree-view/) ([source](https://github.com/mui/mui-x/tree/HEAD/packages/x-tree-view)) | dependencies | minor | [`8.23.0` → `8.24.0`](https://renovatebot.com/diffs/npm/@mui%2fx-tree-view/8.23.0/8.24.0) | [](https://securityscorecards.dev/viewer/?uri=github.com/mui/mui-x) | | [@openapitools/openapi-generator-cli](https://github.com/OpenAPITools/openapi-generator-cli) | devDependencies | minor | [`2.26.0` → `2.27.0`](https://renovatebot.com/diffs/npm/@openapitools%2fopenapi-generator-cli/2.26.0/2.27.0) | [](https://securityscorecards.dev/viewer/?uri=github.com/OpenAPITools/openapi-generator-cli) | | [@typescript-eslint/eslint-plugin](https://typescript-eslint.io/packages/eslint-plugin) ([source](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin)) | devDependencies | minor | [`8.51.0` → `8.53.0`](https://renovatebot.com/diffs/npm/@typescript-eslint%2feslint-plugin/8.51.0/8.53.0) | [](https://securityscorecards.dev/viewer/?uri=github.com/typescript-eslint/typescript-eslint) | | [@typescript-eslint/parser](https://typescript-eslint.io/packages/parser) ([source](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser)) | devDependencies | minor | [`8.51.0` → `8.53.0`](https://renovatebot.com/diffs/npm/@typescript-eslint%2fparser/8.51.0/8.53.0) | [](https://securityscorecards.dev/viewer/?uri=github.com/typescript-eslint/typescript-eslint) | | [react-router-dom](https://github.com/remix-run/react-router) ([source](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom)) | dependencies | minor | [`7.11.0` → `7.12.0`](https://renovatebot.com/diffs/npm/react-router-dom/7.11.0/7.12.0) | [](https://securityscorecards.dev/viewer/?uri=github.com/remix-run/react-router) | --- ### Release Notes <details> <summary>mui/mui-x (@​mui/x-charts)</summary> ### [`v8.24.0`](https://github.com/mui/mui-x/blob/HEAD/CHANGELOG.md#8240) [Compare Source](mui/mui-x@v8.23.0...v8.24.0) *Jan 8, 2026* We'd like to extend a big thank you to the 12 contributors who made this release possible. Here are some highlights ✨: - ⚡️Add bar [batch renderer](https://mui.com/x/react-charts/bars/#performance), result in a significant performance improvement when rendering thousands of bars - 📊 Add [range bar chart](https://mui.com/x/react-charts/range-bar/) to render  - 🌎 Improved Danish (da-DK) and Japanese (ja-JP) locales on the Data Grid Special thanks go out to these community members for their valuable contributions: [@​anders-noerrelykke](https://github.com/anders-noerrelykke), [@​auloin](https://github.com/auloin), [@​sai6855](https://github.com/sai6855), [@​yuito-it](https://github.com/yuito-it) The following team members contributed to this release: [@​alelthomas](https://github.com/alelthomas), [@​alexfauquette](https://github.com/alexfauquette), [@​arminmeh](https://github.com/arminmeh), [@​bernardobelchior](https://github.com/bernardobelchior), [@​flaviendelangle](https://github.com/flaviendelangle), [@​JCQuintas](https://github.com/JCQuintas), [@​mapache-salvaje](https://github.com/mapache-salvaje), [@​siriwatknp](https://github.com/siriwatknp) ##### Data Grid ##### `@mui/[email protected]` - \[l10n] Improve Danish (da-DK) locale ([#​20828](mui/mui-x#20828)) [@​anders-noerrelykke](https://github.com/anders-noerrelykke) - \[l10n] Improve Japanese (ja-JP) locale ([#​20251](mui/mui-x#20251)) [@​yuito-it](https://github.com/yuito-it) ##### `@mui/[email protected]` [](https://mui.com/r/x-pro-svg-link "Pro plan") Same changes as in `@mui/[email protected]`, plus: - \[DataGridPro] Fix header filter height for `density="compact"` ([#​20834](mui/mui-x#20834)) [@​arminmeh](https://github.com/arminmeh) ##### `@mui/[email protected]` [](https://mui.com/r/x-premium-svg-link "Premium plan") Same changes as in `@mui/[email protected]`. ##### Date and Time Pickers ##### `@mui/[email protected]` - \[pickers] Fix Styles applied to PickersDay when MuiPickersDay-dayOutsideMonth is used ([#​20719](mui/mui-x#20719)) [@​sai6855](https://github.com/sai6855) ##### `@mui/[email protected]` [](https://mui.com/r/x-pro-svg-link "Pro plan") Same changes as in `@mui/[email protected]`. ##### Charts ##### `@mui/[email protected]` - \[charts] Add `VisibilityManager` logic to allow managing series/items ([#​20571](mui/mui-x#20571)) [@​JCQuintas](https://github.com/JCQuintas) - \[charts] Add `identifierSerializer` configuration ([#​20775](mui/mui-x#20775)) [@​JCQuintas](https://github.com/JCQuintas) - \[charts] Add `serializeIdentifier` instance function ([#​20791](mui/mui-x#20791)) [@​JCQuintas](https://github.com/JCQuintas) - \[charts] Add bar batch renderer ([#​20457](mui/mui-x#20457)) [@​bernardobelchior](https://github.com/bernardobelchior) - \[charts] Allow animating bar, line, and pie elements to hidden state ([#​20798](mui/mui-x#20798)) [@​JCQuintas](https://github.com/JCQuintas) - \[charts] Fix failing lint step ([#​20813](mui/mui-x#20813)) [@​bernardobelchior](https://github.com/bernardobelchior) - \[charts] Fix tooltip anchored to item ([#​20783](mui/mui-x#20783)) [@​alexfauquette](https://github.com/alexfauquette) - \[charts] Fix type casting in getCategoryAxisConfig and applySeriesLayout functions ([#​20797](mui/mui-x#20797)) [@​sai6855](https://github.com/sai6855) - \[charts] Let keyboard navigation avoid overflow and handle nullish values ([#​20757](mui/mui-x#20757)) [@​alexfauquette](https://github.com/alexfauquette) - \[charts] Refactor `PieChart` and `PieChartPro` to use `slots` and `slotProps` directly ([#​20795](mui/mui-x#20795)) [@​sai6855](https://github.com/sai6855) - \[charts] Refactor `useRegisterPointerEventHandlers` ([#​20824](mui/mui-x#20824)) [@​bernardobelchior](https://github.com/bernardobelchior) - \[charts] Update legend types to allow hiding/showing items ([#​20784](mui/mui-x#20784)) [@​JCQuintas](https://github.com/JCQuintas) ##### `@mui/[email protected]` [](https://mui.com/r/x-pro-svg-link "Pro plan") Same changes as in `@mui/[email protected]`, plus: - \[charts-pro] Pass `slotProps.toolbar` to `Toolbar` in `PieChartPro` ([#​20796](mui/mui-x#20796)) [@​sai6855](https://github.com/sai6855) ##### `@mui/[email protected]` [](https://mui.com/r/x-premium-svg-link "Premium plan") Same changes as in `@mui/[email protected]`, plus: - \[charts-premium] Add range bar chart ([#​20275](mui/mui-x#20275)) [@​bernardobelchior](https://github.com/bernardobelchior) ##### Tree View ##### `@mui/[email protected]` - \[tree view] Introduce a Tree View Store to clean the internals ([#​20051](mui/mui-x#20051)) [@​flaviendelangle](https://github.com/flaviendelangle) ##### `@mui/[email protected]` [](https://mui.com/r/x-pro-svg-link "Pro plan") Same changes as in `@mui/[email protected]`. ##### Codemod ##### `@mui/[email protected]` Internal changes. ##### Docs - \[docs] Fix axis size default values ([#​20799](mui/mui-x#20799)) [@​bernardobelchior](https://github.com/bernardobelchior) - \[docs] Update What's New in MUI X page with post v8 features (DX-118) ([#​20787](mui/mui-x#20787)) [@​alelthomas](https://github.com/alelthomas) - \[docs] Fix `onAccept`'s `context.source` documentation to use 'view' instead of 'picker' ([#​20465](mui/mui-x#20465)) [@​auloin](https://github.com/auloin) - \[docs] Revise the Charts Brush doc ([#​20792](mui/mui-x#20792)) [@​mapache-salvaje](https://github.com/mapache-salvaje) - \[docs] Revise the Charts Highlighting doc ([#​20788](mui/mui-x#20788)) [@​mapache-salvaje](https://github.com/mapache-salvaje) - \[docs] Revise the Charts Label doc ([#​20794](mui/mui-x#20794)) [@​mapache-salvaje](https://github.com/mapache-salvaje) - \[docs] Revise the Charts Export doc ([#​20779](mui/mui-x#20779)) [@​mapache-salvaje](https://github.com/mapache-salvaje) ##### Core - \[code-infra] Fix v8.23.0 release date ([#​20767](mui/mui-x#20767)) [@​bernardobelchior](https://github.com/bernardobelchior) - \[code-infra] Remove `glob-gitignore` ([#​20801](mui/mui-x#20801)) [@​bernardobelchior](https://github.com/bernardobelchior) - \[code-infra] Remove `nyc` ([#​20804](mui/mui-x#20804)) [@​bernardobelchior](https://github.com/bernardobelchior) - \[code-infra] Remove `stream-browserify` and `null-loader` ([#​20805](mui/mui-x#20805)) [@​bernardobelchior](https://github.com/bernardobelchior) - \[code-infra] Remove `stylelint-config-tailwindcss` ([#​20807](mui/mui-x#20807)) [@​bernardobelchior](https://github.com/bernardobelchior) - \[code-infra] Remove unused `path` package ([#​20802](mui/mui-x#20802)) [@​bernardobelchior](https://github.com/bernardobelchior) - \[code-infra] Retry flaky e2e test on webkit ([#​20806](mui/mui-x#20806)) [@​JCQuintas](https://github.com/JCQuintas) - \[internal] Add `internal` slot to properly generate components CSS layer ([#​20763](mui/mui-x#20763)) [@​siriwatknp](https://github.com/siriwatknp) </details> <details> <summary>OpenAPITools/openapi-generator-cli (@​openapitools/openapi-generator-cli)</summary> ### [`v2.27.0`](https://github.com/OpenAPITools/openapi-generator-cli/releases/tag/v2.27.0) [Compare Source](OpenAPITools/openapi-generator-cli@v2.26.0...v2.27.0) ##### Features - **config:** add support for environment variable placeholders in config ([#​1031](OpenAPITools/openapi-generator-cli#1031)) ([1cd2614](OpenAPITools/openapi-generator-cli@1cd2614)) </details> <details> <summary>typescript-eslint/typescript-eslint (@​typescript-eslint/eslint-plugin)</summary> ### [`v8.53.0`](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#8530-2026-01-12) [Compare Source](typescript-eslint/typescript-eslint@v8.52.0...v8.53.0) ##### 🚀 Features - **eslint-plugin:** add rule \[strict-void-return] ([#​9707](typescript-eslint/typescript-eslint#9707)) - **eslint-plugin:** \[no-unused-vars] add a fixer to remove unused imports ([#​11922](typescript-eslint/typescript-eslint#11922)) ##### 🩹 Fixes - **eslint-plugin:** \[no-useless-default-assignment] fix false positive for parameters corresponding to a rest parameter ([#​11916](typescript-eslint/typescript-eslint#11916)) - **eslint-plugin:** replace unclear "`error` typed" with more helpful description ([#​11704](typescript-eslint/typescript-eslint#11704)) - **typescript-estree:** forbid invalid `extends` and `implements` in interface declaration ([#​11935](typescript-eslint/typescript-eslint#11935)) - **typescript-estree:** forbid invalid class implements ([#​11934](typescript-eslint/typescript-eslint#11934)) - **typescript-estree:** forbid type-only import with both default and named specifiers ([#​11930](typescript-eslint/typescript-eslint#11930)) ##### ❤️ Thank You - Brad Zacher [@​bradzacher](https://github.com/bradzacher) - fisker Cheung [@​fisker](https://github.com/fisker) - Josh Goldberg - Josh Goldberg ✨ - Kirk Waiblinger - Niki [@​phaux](https://github.com/phaux) - Nikita - SungHyun627 [@​SungHyun627](https://github.com/SungHyun627) - Will Harney [@​wjhsf](https://github.com/wjhsf) You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website. ### [`v8.52.0`](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#8520-2026-01-05) [Compare Source](typescript-eslint/typescript-eslint@v8.51.0...v8.52.0) ##### 🚀 Features - **eslint-plugin-internal:** \[no-multiple-lines-of-errors] add rule ([#​11899](typescript-eslint/typescript-eslint#11899)) ##### 🩹 Fixes - **eslint-plugin:** \[no-base-to-string] detect @​[@​toPrimitive](https://github.com/toPrimitive) and valueOf ([#​11901](typescript-eslint/typescript-eslint#11901)) - **eslint-plugin:** \[no-useless-default-assignment] handle conditional initializer ([#​11908](typescript-eslint/typescript-eslint#11908)) ##### ❤️ Thank You - Josh Goldberg ✨ - Ulrich Stark You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website. </details> <details> <summary>typescript-eslint/typescript-eslint (@​typescript-eslint/parser)</summary> ### [`v8.53.0`](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#8530-2026-01-12) [Compare Source](typescript-eslint/typescript-eslint@v8.52.0...v8.53.0) This was a version bump only for parser to align it with other projects, there were no code changes. You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website. ### [`v8.52.0`](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#8520-2026-01-05) [Compare Source](typescript-eslint/typescript-eslint@v8.51.0...v8.52.0) This was a version bump only for parser to align it with other projects, there were no code changes. You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website. </details> <details> <summary>remix-run/react-router (react-router-dom)</summary> ### [`v7.12.0`](https://github.com/remix-run/react-router/blob/HEAD/packages/react-router-dom/CHANGELOG.md#7120) [Compare Source](https://github.com/remix-run/react-router/compare/[email protected]@7.12.0) ##### Patch Changes - Updated dependencies: - `[email protected]` </details> --- - [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box --- This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi43MS4wIiwidXBkYXRlZEluVmVyIjoiNDIuODEuMyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIiwicmVub3ZhdGUiXX0=--> See merge request swiss-armed-forces/cyber-command/cea/loom!243 Co-authored-by: Loom MR Pipeline Trigger <group_103951964_bot_9504bb8dead6d4e406ad817a607f24be@noreply.gitlab.com> Co-authored-by: open-source Pipeline <group_90701827_bot_ed04ae348bc5f40af9966fb8b6867e99@noreply.gitlab.com>

Part of #12960.
Here's a PR where bar charts default to the batch renderer so you can test it and check Argos.
Differences from the individual bar plot:
Before/After
Before
After