Skip to content

[charts-premium] Add WebGL renderer to ScatterChartPremium - #22157

Merged
JCQuintas merged 34 commits into
mui:masterfrom
JCQuintas:scatter-chart-webgl
May 5, 2026
Merged

JCQuintas merged 34 commits into
mui:masterfrom
JCQuintas:scatter-chart-webgl

Conversation

@JCQuintas

@JCQuintas JCQuintas commented Apr 22, 2026 •

Copy link
Copy Markdown
Member

Summary

  • Adds a new ScatterChartPremium component with a renderer prop that accepts 'svg-single' | 'svg-batch' | 'webgl' (default 'svg-single').
  • When renderer="webgl", points are drawn into the shared premium WebGL canvas via a new ScatterWebGLPlot (instanced antialiased circles), keeping axes/grid/tooltip on the SVG layer.
  • Demo: docs/data/charts/scatter/ScatterWebGLRenderer.tsx — 200k points, two series.

WebGL plot internals

  • useScatterWebGLPlotData walks series once and writes directly into pre-allocated Float32Arrays (no intermediate objects). sizes/colors arrays are cached by seriesData identity so resize/axis changes don't trigger a GPU color re-upload.
  • ScatterWebGLProgram allocates buffers + VAO once, tracks (capacity, lastUploaded) per buffer, and uploads via bufferSubData + DYNAMIC_DRAW with a reference-equality short-circuit.
  • Clear/draw-dispatch is owned by the shared ChartsWebGLLayer; the program only issues the drawArraysInstanced call.

@code-infra-dashboard

code-infra-dashboard Bot commented Apr 22, 2026 •

Copy link
Copy Markdown

Deploy preview

Bundle size

Bundle Parsed size Gzip size
@mui/x-data-grid 0B(0.00%) 0B(0.00%)
@mui/x-data-grid-pro 0B(0.00%) 0B(0.00%)
@mui/x-data-grid-premium 0B(0.00%) 0B(0.00%)
@mui/x-charts 🔺+720B(+0.19%) 🔺+193B(+0.17%)
@mui/x-charts-pro 🔺+732B(+0.14%) 🔺+179B(+0.12%)
@mui/x-charts-premium 🔺+7.68KB(+1.39%) 🔺+1.93KB(+1.17%)
@mui/x-date-pickers 0B(0.00%) 0B(0.00%)
@mui/x-date-pickers-pro 0B(0.00%) 0B(0.00%)
@mui/x-tree-view 0B(0.00%) 0B(0.00%)
@mui/x-tree-view-pro 0B(0.00%) 0B(0.00%)

Details of bundle changes


Check out the code infra dashboard for more information about this PR.

@JCQuintas JCQuintas self-assigned this Apr 23, 2026
@JCQuintas JCQuintas added type: new feature Expand the scope of the product to solve a new problem. plan: Premium Impact at least one Premium user. scope: charts Changes related to the charts. labels Apr 23, 2026
@JCQuintas JCQuintas changed the title [charts] Add WebGL renderer to ScatterChartPremium [charts-premium] Add WebGL renderer to ScatterChartPremium Apr 23, 2026
@codspeed

codspeed Bot commented Apr 23, 2026 •

Copy link
Copy Markdown

Merging this PR will not alter performance

✅ 14 untouched benchmarks


Comparing JCQuintas:scatter-chart-webgl (542b03c) with master (5f66c56)

Open in CodSpeed

@JCQuintas
JCQuintas marked this pull request as ready for review April 23, 2026 14:00
@alexfauquette

Copy link
Copy Markdown
Member

Impressive 🎉

While playing with it, I'm wondering if the highlight will be handled in a follow up. For not with no item highlight, it's tricky to know if the tooltip and the rendered item are correct

@JCQuintas

Copy link
Copy Markdown
Member Author

Impressive 🎉

While playing with it, I'm wondering if the highlight will be handled in a follow up. For not with no item highlight, it's tricky to know if the tooltip and the rendered item are correct

Added a small highlight component. It renders in svg since it is a single element, and would allow customisation.

Not sure which class to use on it though. Should we create a new one or reuse the focusedMark? 🤔

@alexfauquette alexfauquette left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Verry nice component. I left minor comments but nothing serious about the WebGL. Maybe because I don't have the knowledge to review it. Would be interesting to gt Bernardo point of view on this one

Comment on lines +30 to +32
// Colors and sizes depend only on series identity (series color + markerSize).
// When only the drawing area or axes change we reuse the cached Float32Array
// references so the WebGL program can skip the GPU upload for them.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Claudio let me notice that this is not exact because of the following lines

const sx = xScale(point.x);
const sy = yScale(point.y);
if (sx == null || sy == null || Number.isNaN(sx) || Number.isNaN(sy)) {
  continue;
}

If the xAxis scale got modified in a way that sx/sy are not numbers, the point coordinate and colors might be desynchronised between the newly computed and the cached version.

That's fairly unlikely. But worth mentioning at least in the comment

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it is ok because the cache will resync if seriesData changes. Will add a comment

} | null>(null);

// Centers change on every zoom/axis update, but the underlying ArrayBuffer
// can be reused to avoid allocating ~1.6 MB per zoom frame at 200k points.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just to be sure I got correctly how you reached to those number.

A Float32Number takes 4 Bytes. You have x and y you the array size in Bytes is 8 times the number of data points.

So plus the colors that are also 4 Bytes per RGBA component (so 16 in total) and the size which is also adding 4 Bytes, the charts represent a Buffer of (16 + 8 + 4)* 200k = 5.6MB

I'm wondering if the colors and size could benefit from the usage of a Int8Array to save some bytes

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

sizes wouldn't really improve much if we want to keep precision. Like, someone might want the size to be 10.5. The general gain is small anyways.

For colors it makes sense, we probably don't need to support colors outside the 0...255 value


const centersLength = maxPoints * 2;
let pool = centersPoolRef.current;
if (pool === null || pool.length < centersLength) {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You reuse the buffer if the number of data point increase. What if it decreases? Will we still see last removed points?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If data shrinks it keeps the same size, we just don't re-allocate.

Then we handle it with new Float32Array(pool.buffer, 0, centersLength), since it will create a view on the data based on the actual length of the data times 2

Comment on lines +51 to +55
const cx = getXPosition(scatterPoint.x);
const cy = getYPosition(scatterPoint.y);
const r = series.markerSize / 2;

return (

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think for the scatter plot, we check if the mark in inside the drawing area with some margins. That's usefull for keyboard navigation. It prevent from showing highlight outside of the drawing area without having to put this in a clip-path

* so the highlight has to be drawn in SVG and positioned via the same axis scales the
* WebGL plot uses.
*/
export function HighlightedScatterMark(props: React.SVGAttributes<SVGCircleElement>) {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should be in community since it's also usefull for the svg-batch rendering

Comment thread test/regressions/testsBySuite.ts Resolved
this.shaders.forEach((shader) => gl.deleteShader(shader));
}

// Assumes the owning VAO is already bound.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
// Assumes the owning VAO is already bound.
// Assumes the owning VAO (Vertex Array Object) is already bound.

children,
} = useScatterChartProps({
...other,
renderer: renderer === 'webgl' ? 'svg-single' : renderer,

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why not just removing this line instead of a hack to please TS?

Suggested change
renderer: renderer === 'webgl' ? 'svg-single' : renderer,

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Or you could keep it but in that case defaulting to the 'svg-batch' instead of 'svg-single' might be better to get by default the onItemClick working

const useVoronoiOnItemClick = resolvedDisableHitArea !== true || renderer === 'svg-batch';

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've decided to invert the check in useVoronoiOnItemClick to check if NOT undefined AND NOT 'svg-single' instead, since all other (possible future) renderers would likely want to optimise anyways.

* (for example WebGL or `svg-batch`), so the highlight has to be drawn in SVG
* and positioned via the same axis scales the underlying renderer uses.
*/
export function HighlightedScatterMark({

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm wondering if we should

  • Share some of this code with the FocusedScatterMark since they do similar computation (get and identifier and render the corresponding point)
  • Use it in the render='svg-batch' case to remove the notion of siblings in the BatchScatter

Basically this webGL implementation miss the highlightScope support to compute the color and size of the series. But could be done in a follow up if you prefer

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

added

@github-actions github-actions Bot added the PR: out-of-date The pull request has merge conflicts and can't be merged. label Apr 30, 2026
@github-actions

Copy link
Copy Markdown
Contributor

This pull request has conflicts, please resolve those before we can evaluate the pull request.

# Conflicts:
#	packages/x-charts/src/ScatterChart/FocusedScatterMark.tsx
@github-actions github-actions Bot removed the PR: out-of-date The pull request has merge conflicts and can't be merged. label Apr 30, 2026
@JCQuintas
JCQuintas requested a review from alexfauquette April 30, 2026 10:56
@JCQuintas
JCQuintas merged commit 7b19944 into mui:master May 5, 2026
22 checks passed
@JCQuintas
JCQuintas deleted the scatter-chart-webgl branch May 5, 2026 07:35
736-c41-2c1-e464fc974 added a commit to Swiss-Armed-Forces/Loom that referenced this pull request May 18, 2026
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 | [`9.0.2` → `9.1.0`](https://renovatebot.com/diffs/npm/@mui%2fx-charts/9.0.2/9.1.0) | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/mui/mui-x/badge)](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 | [`9.0.2` → `9.1.0`](https://renovatebot.com/diffs/npm/@mui%2fx-tree-view/9.0.2/9.1.0) | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/mui/mui-x/badge)](https://securityscorecards.dev/viewer/?uri=github.com/mui/mui-x) |
| [ace-builds](https://github.com/ajaxorg/ace-builds) | dependencies | minor | [`1.43.6` → `1.44.0`](https://renovatebot.com/diffs/npm/ace-builds/1.43.6/1.44.0) | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/ajaxorg/ace-builds/badge)](https://securityscorecards.dev/viewer/?uri=github.com/ajaxorg/ace-builds) |
| [i18next](https://www.i18next.com) ([source](https://github.com/i18next/i18next)) | dependencies | minor | [`26.0.6` → `26.1.0`](https://renovatebot.com/diffs/npm/i18next/26.0.6/26.1.0) | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/i18next/i18next/badge)](https://securityscorecards.dev/viewer/?uri=github.com/i18next/i18next) |
| [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.14.1` → `7.15.0`](https://renovatebot.com/diffs/npm/react-router-dom/7.14.1/7.15.0) | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/remix-run/react-router/badge)](https://securityscorecards.dev/viewer/?uri=github.com/remix-run/react-router) |

---

### Release Notes

<details>
<summary>mui/mui-x (@&#8203;mui/x-charts)</summary>

### [`v9.1.0`](https://github.com/mui/mui-x/blob/HEAD/CHANGELOG.md#910)

[Compare Source](mui/mui-x@v9.0.4...v9.1.0)

*May 8, 2026*

We'd like to extend a big thank you to the 14 contributors who made this release possible. Here are some highlights ✨:

- ⚡️ Add a WebGL renderer to the [Scatter chart](https://mui.com/x/react-charts/scatter/#webgl-renderer), and apply the same WebGL performance patterns to the candlestick and heatmap \[Premium]
- 🐞 Bugfixes
- 📚 Documentation improvements

Special thanks go out to these community members for their valuable contributions:
[@&#8203;Anexus5919](https://github.com/Anexus5919), [@&#8203;gaetanodanelli](https://github.com/gaetanodanelli), [@&#8203;imazizbohra](https://github.com/imazizbohra), [@&#8203;mustafajw07](https://github.com/mustafajw07)

The following team members contributed to this release:
[@&#8203;alexfauquette](https://github.com/alexfauquette), [@&#8203;brijeshb42](https://github.com/brijeshb42), [@&#8203;flaviendelangle](https://github.com/flaviendelangle), [@&#8203;JCQuintas](https://github.com/JCQuintas), [@&#8203;LukasTy](https://github.com/LukasTy), [@&#8203;mapache-salvaje](https://github.com/mapache-salvaje), [@&#8203;MBilalShafi](https://github.com/MBilalShafi), [@&#8203;michelengelen](https://github.com/michelengelen), [@&#8203;oliviertassinari](https://github.com/oliviertassinari), [@&#8203;rita-codes](https://github.com/rita-codes)

##### Data Grid

##### `@mui/x-data-grid@9.1.0`

- \[DataGrid] Fix accessibility violation in detail panel toggle column header ([#&#8203;22178](mui/mui-x#22178)) [@&#8203;michelengelen](https://github.com/michelengelen)
- \[DataGrid] Fix active filter detection for array values ([#&#8203;22340](mui/mui-x#22340)) [@&#8203;MBilalShafi](https://github.com/MBilalShafi)
- \[DataGrid] Fix crash when grouping/tree-data values match `Object.prototype` property names ([#&#8203;22312](mui/mui-x#22312)) [@&#8203;LukasTy](https://github.com/LukasTy)
- \[DataGrid] Position overlays below top pinned rows ([#&#8203;22341](mui/mui-x#22341)) [@&#8203;MBilalShafi](https://github.com/MBilalShafi)
- \[l10n] Improve Italian (it-IT) locale ([#&#8203;22290](mui/mui-x#22290)) [@&#8203;gaetanodanelli](https://github.com/gaetanodanelli)

##### `@mui/x-data-grid-pro@9.1.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link "Pro plan")

Same changes as in `@mui/x-data-grid@9.1.0`, plus:

- \[DataGridPro] Fix column unpin restoring stale position after reorder ([#&#8203;22250](mui/mui-x#22250)) [@&#8203;michelengelen](https://github.com/michelengelen)

##### `@mui/x-data-grid-premium@9.1.0` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link "Premium plan")

Same changes as in `@mui/x-data-grid-pro@9.1.0`, plus:

- \[DataGridPremium] Fix aggregation column header title truncation without ellipsis ([#&#8203;22248](mui/mui-x#22248)) [@&#8203;michelengelen](https://github.com/michelengelen)

##### Date and Time Pickers

##### `@mui/x-date-pickers@9.1.0`

- \[pickers] Fix duplicate hour label in `MultiSectionDigitalClock` on DST day ([#&#8203;22110](mui/mui-x#22110)) [@&#8203;LukasTy](https://github.com/LukasTy)
- \[l10n] Improve Italian (it-IT) locale ([#&#8203;22290](mui/mui-x#22290)) [@&#8203;gaetanodanelli](https://github.com/gaetanodanelli)

##### `@mui/x-date-pickers-pro@9.1.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link "Pro plan")

Same changes as in `@mui/x-date-pickers@9.1.0`.

##### Charts

##### `@mui/x-charts@9.1.0`

- \[charts] Add `ChartsAxisHighlightValue` component ([#&#8203;21803](mui/mui-x#21803)) [@&#8203;Copilot](https://github.com/Copilot)
- \[charts] Create `ChartsRadialAxisHighlight` ([#&#8203;22241](mui/mui-x#22241)) [@&#8203;alexfauquette](https://github.com/alexfauquette)
- \[charts] Remove useless extends ([#&#8203;22313](mui/mui-x#22313)) [@&#8203;alexfauquette](https://github.com/alexfauquette)
- \[charts] Use `PolarAxisConfig` in polar plugin internals ([#&#8203;22315](mui/mui-x#22315)) [@&#8203;alexfauquette](https://github.com/alexfauquette)

##### `@mui/x-charts-pro@9.1.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link "Pro plan")

Same changes as in `@mui/x-charts@9.1.0`.

##### `@mui/x-charts-premium@9.1.0` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link "Premium plan")

Same changes as in `@mui/x-charts-pro@9.1.0`, plus:

- \[charts-premium] Add WebGL renderer to `ScatterChartPremium` ([#&#8203;22157](mui/mui-x#22157)) [@&#8203;JCQuintas](https://github.com/JCQuintas)
- \[charts-premium] Add highlight to the `RadialLineChart` ([#&#8203;22156](mui/mui-x#22156)) [@&#8203;alexfauquette](https://github.com/alexfauquette)
- \[charts-premium] Apply WebGL perf patterns to candlestick + heatmap ([#&#8203;22223](mui/mui-x#22223)) [@&#8203;JCQuintas](https://github.com/JCQuintas)
- \[charts-premium] Introduce the `RadialBarChart` ([#&#8203;22268](mui/mui-x#22268)) [@&#8203;alexfauquette](https://github.com/alexfauquette)

##### Tree View

##### `@mui/x-tree-view@9.1.0`

- \[tree view] Fix stale Tree View `apiRef` after keyed remount ([#&#8203;22342](mui/mui-x#22342)) [@&#8203;MBilalShafi](https://github.com/MBilalShafi)

##### `@mui/x-tree-view-pro@9.1.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link "Pro plan")

Same changes as in `@mui/x-tree-view@9.1.0`.

##### Scheduler

##### `@mui/x-scheduler@9.0.0-alpha.5`

- \[scheduler] Make `EventItem` interactive by integrating button props for keyboard accessibility ([#&#8203;22160](mui/mui-x#22160)) [@&#8203;mustafajw07](https://github.com/mustafajw07)
- \[scheduler] Migrate color switch to Base UI `ToggleGroup` ([#&#8203;22254](mui/mui-x#22254)) [@&#8203;flaviendelangle](https://github.com/flaviendelangle)
- \[scheduler] Rename Scheduler headless packages ([#&#8203;22273](mui/mui-x#22273)) [@&#8203;rita-codes](https://github.com/rita-codes)
- \[scheduler] Use TreeView for the resource sidebar ([#&#8203;22261](mui/mui-x#22261)) [@&#8203;flaviendelangle](https://github.com/flaviendelangle)
- \[scheduler] Use fieldset/legend instead of headings for form sections in the event dialog ([#&#8203;22095](mui/mui-x#22095)) [@&#8203;Anexus5919](https://github.com/Anexus5919)
- \[scheduler] Added `position: relative` for consistent layout ([#&#8203;22284](mui/mui-x#22284)) [@&#8203;mustafajw07](https://github.com/mustafajw07)
- \[l10n] Improve Italian (it-IT) locale ([#&#8203;22290](mui/mui-x#22290)) [@&#8203;gaetanodanelli](https://github.com/gaetanodanelli)

##### `@mui/x-scheduler-premium@9.0.0-alpha.5` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link "Premium plan")

Same changes as in `@mui/x-scheduler@9.0.0-alpha.5`, plus:

- \[scheduler] Replace per-view headers with a generic `EventTimelinePremiumHeader` in the `EventTimeline` ([#&#8203;22222](mui/mui-x#22222)) [@&#8203;rita-codes](https://github.com/rita-codes)

##### Codemod

##### `@mui/x-codemod@9.1.0`

Internal changes.

##### Docs

- \[docs] Migrate `FlightPicker` overview demo to v9 `slotProps` shape ([#&#8203;22272](mui/mui-x#22272)) [@&#8203;LukasTy](https://github.com/LukasTy)
- \[docs] Standardize Scheduler docs style and formatting ([#&#8203;22161](mui/mui-x#22161)) [@&#8203;mapache-salvaje](https://github.com/mapache-salvaje)
- \[docs] Add feedback form to the scheduler docs ([#&#8203;22237](mui/mui-x#22237)) [@&#8203;rita-codes](https://github.com/rita-codes)
- \[docs] Fix `GridToolbarCustom` demo crash in DataGrid ([#&#8203;21950](mui/mui-x#21950)) [@&#8203;MBilalShafi](https://github.com/MBilalShafi)
- \[docs] Do not resolve axes in charts ([#&#8203;22307](mui/mui-x#22307)) [@&#8203;alexfauquette](https://github.com/alexfauquette)
- \[docs] Fix no longer valid link ([#&#8203;22371](mui/mui-x#22371)) [@&#8203;LukasTy](https://github.com/LukasTy)
- \[docs] Replace broken CodeSandbox iframes in migration guides ([#&#8203;22352](mui/mui-x#22352)) [@&#8203;LukasTy](https://github.com/LukasTy)

##### Core

- \[code-infra] Bump browser `testTimeout` to absorb React 19 slowness ([#&#8203;22236](mui/mui-x#22236)) [@&#8203;LukasTy](https://github.com/LukasTy)
- \[code-infra] Use vale rules from code-infra package ([#&#8203;22256](mui/mui-x#22256)) [@&#8203;brijeshb42](https://github.com/brijeshb42)
- \[code-infra] Fix broken valelint and docs build ([#&#8203;22362](mui/mui-x#22362)) [@&#8203;LukasTy](https://github.com/LukasTy)
- \[internal] Prepare renaming LICENSE file to LICENSE.md ([#&#8203;22055](mui/mui-x#22055)) [@&#8203;imazizbohra](https://github.com/imazizbohra)
- \[internal] Remove outdated .woff files ([#&#8203;22286](mui/mui-x#22286)) [@&#8203;oliviertassinari](https://github.com/oliviertassinari)
- \[internal] Replace Codspeed with `@mui/internal-benchmark` for charts ([#&#8203;22243](mui/mui-x#22243)) [@&#8203;JCQuintas](https://github.com/JCQuintas)

##### Miscellaneous

- \[internal-gestures] Add passive option to `TurnWheelGesture` ([#&#8203;22349](mui/mui-x#22349)) [@&#8203;JCQuintas](https://github.com/JCQuintas)
- \[internal-gestures] Enforce pointer-type filter in `ShadowRoot` branch ([#&#8203;22327](mui/mui-x#22327)) [@&#8203;JCQuintas](https://github.com/JCQuintas)
- \[internal-gestures] Improve passive event listener handling ([#&#8203;22329](mui/mui-x#22329)) [@&#8203;JCQuintas](https://github.com/JCQuintas)
- \[internal-gestures] Inline wheel-delta clamp per axis ([#&#8203;22331](mui/mui-x#22331)) [@&#8203;JCQuintas](https://github.com/JCQuintas)
- \[internal-gestures] Return read-only pointer map without copy ([#&#8203;22330](mui/mui-x#22330)) [@&#8203;JCQuintas](https://github.com/JCQuintas)
- \[internal-gestures] Track multi-tap reset timeout to prevent leak ([#&#8203;22326](mui/mui-x#22326)) [@&#8203;JCQuintas](https://github.com/JCQuintas)

### [`v9.0.4`](https://github.com/mui/mui-x/blob/HEAD/CHANGELOG.md#904)

[Compare Source](mui/mui-x@v9.0.3...v9.0.4)

*Apr 28, 2026*

We'd like to extend a big thank you to the 4 contributors who made this release possible. Here are some highlights ✨:

- Fix Pickers previous (v9.0.3) release ensuring the latest `@mui/x-internals` version usage

The following team members contributed to this release:
[@&#8203;alexfauquette](https://github.com/alexfauquette), [@&#8203;JCQuintas](https://github.com/JCQuintas), [@&#8203;LukasTy](https://github.com/LukasTy), [@&#8203;mj12albert](https://github.com/mj12albert)

##### Data Grid

##### `@mui/x-data-grid@9.0.4`

Internal changes.

##### `@mui/x-data-grid-pro@9.0.4` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link "Pro plan")

Same changes as in `@mui/x-data-grid@9.0.4`.

##### `@mui/x-data-grid-premium@9.0.4` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link "Premium plan")

Same changes as in `@mui/x-data-grid-pro@9.0.4`.

##### Date and Time Pickers

##### `@mui/x-date-pickers@9.0.4`

Internal changes.

##### `@mui/x-date-pickers-pro@9.0.4` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link "Pro plan")

Same changes as in `@mui/x-date-pickers@9.0.4`.

##### Charts

##### `@mui/x-charts@9.0.4`

- \[charts] Exclude hidden series and items from keyboard navigation (alt approach) ([#&#8203;22221](mui/mui-x#22221)) [@&#8203;JCQuintas](https://github.com/JCQuintas)
- \[charts] Fix line interaction with `area` and `conectNulls` ([#&#8203;22227](mui/mui-x#22227)) [@&#8203;alexfauquette](https://github.com/alexfauquette)
- \[charts] Implement the continuous case of `getAxisIndex` for rotation axis ([#&#8203;22230](mui/mui-x#22230)) [@&#8203;alexfauquette](https://github.com/alexfauquette)

##### `@mui/x-charts-pro@9.0.4` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link "Pro plan")

Same changes as in `@mui/x-charts@9.0.4`.

##### `@mui/x-charts-premium@9.0.4` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link "Premium plan")

Same changes as in `@mui/x-charts-pro@9.0.4` plus:

- \[charts-premium] Add `showMark` and `shape` properties to radial line ([#&#8203;22226](mui/mui-x#22226)) [@&#8203;alexfauquette](https://github.com/alexfauquette)

##### Tree View

##### `@mui/x-tree-view@9.0.4`

Internal changes.

##### `@mui/x-tree-view-pro@9.0.4` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link "Pro plan")

Same changes as in `@mui/x-tree-view@9.0.4`.

##### Scheduler

##### `@mui/x-scheduler@9.0.4`

Internal changes.

##### `@mui/x-scheduler-premium@9.0.4` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link "Premium plan")

Same changes as in `@mui/x-scheduler@9.0.4`.

##### Codemod

##### `@mui/x-codemod@9.0.4`

Internal changes.

##### Docs

- \[docs] Update WCAG links ([#&#8203;22234](mui/mui-x#22234)) [@&#8203;mj12albert](https://github.com/mj12albert)

##### Core

- \[code-infra] Avoid overriding `renovate` `ignoredPaths` ([#&#8203;22228](mui/mui-x#22228)) [@&#8203;LukasTy](https://github.com/LukasTy)

### [`v9.0.3`](https://github.com/mui/mui-x/blob/HEAD/CHANGELOG.md#903)

[Compare Source](mui/mui-x@v9.0.2...v9.0.3)

*Apr 27, 2026*

We'd like to extend a big thank you to the 16 contributors who made this release possible. Here are some highlights ✨:

- ⌨️ Keyboard support for creating events in the Scheduler

Special thanks go out to these community members for their valuable contributions:
[@&#8203;supunsathsara](https://github.com/supunsathsara), [@&#8203;ZAKIURREHMAN](https://github.com/ZAKIURREHMAN)

The following team members contributed to this release:
[@&#8203;aemartos](https://github.com/aemartos), [@&#8203;alexfauquette](https://github.com/alexfauquette), [@&#8203;arminmeh](https://github.com/arminmeh), [@&#8203;brijeshb42](https://github.com/brijeshb42), [@&#8203;Janpot](https://github.com/Janpot), [@&#8203;JCQuintas](https://github.com/JCQuintas), [@&#8203;LukasTy](https://github.com/LukasTy), [@&#8203;MBilalShafi](https://github.com/MBilalShafi), [@&#8203;michelengelen](https://github.com/michelengelen), [@&#8203;oliviertassinari](https://github.com/oliviertassinari), [@&#8203;rita-codes](https://github.com/rita-codes), [@&#8203;romgrk](https://github.com/romgrk), [@&#8203;sai6855](https://github.com/sai6855), [@&#8203;siriwatknp](https://github.com/siriwatknp)

##### Data Grid

##### `@mui/x-data-grid@9.0.3`

- \[DataGrid] Fix `:first-child` SSR warning when `MuiDataGrid.styleOverrides` is set ([#&#8203;22081](mui/mui-x#22081)) [@&#8203;siriwatknp](https://github.com/siriwatknp)
- \[DataGrid] Fix row reordering when filter hides rows ([#&#8203;22096](mui/mui-x#22096)) [@&#8203;siriwatknp](https://github.com/siriwatknp)
- \[DataGrid] Remove unused `LayoutDataGridLegacy` class ([#&#8203;22009](mui/mui-x#22009)) [@&#8203;romgrk](https://github.com/romgrk)
- \[DataGrid] Remove unused code, clean up grid-related utilities and deprecate `GridPanelHeader` ([#&#8203;22112](mui/mui-x#22112)) [@&#8203;sai6855](https://github.com/sai6855)
- \[DataGrid] Fix columns cutting off after resizing ([#&#8203;22088](mui/mui-x#22088)) [@&#8203;ZAKIURREHMAN](https://github.com/ZAKIURREHMAN)

##### `@mui/x-data-grid-pro@9.0.3` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link "Pro plan")

Same changes as in `@mui/x-data-grid@9.0.3`.

##### `@mui/x-data-grid-premium@9.0.3` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link "Premium plan")

Same changes as in `@mui/x-data-grid-pro@9.0.3`, plus:

- \[DataGridPremium] Fix row grouping model updates not being reflected ([#&#8203;22122](mui/mui-x#22122)) [@&#8203;MBilalShafi](https://github.com/MBilalShafi)

##### Date and Time Pickers

##### `@mui/x-date-pickers@9.0.3`

- \[pickers] Fix `DateRangeCalendar` drag with `AdapterDayjs` plain-constructor values ([#&#8203;22165](mui/mui-x#22165)) [@&#8203;LukasTy](https://github.com/LukasTy)
- \[pickers] Fix disabled state not overriding error border color ([#&#8203;21169](mui/mui-x#21169)) [@&#8203;supunsathsara](https://github.com/supunsathsara)
- \[pickers] Forward `data-*` and `aria-*` attributes to the root ([#&#8203;22147](mui/mui-x#22147)) [@&#8203;LukasTy](https://github.com/LukasTy)
- \[pickers] Support `K` and `k` hour format tokens ([#&#8203;22108](mui/mui-x#22108)) [@&#8203;michelengelen](https://github.com/michelengelen)

##### `@mui/x-date-pickers-pro@9.0.3` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link "Pro plan")

Same changes as in `@mui/x-date-pickers@9.0.3`, plus:

- \[DateRangeCalendar] Ensure date dragging triggers regardless of trigger element ([#&#8203;21868](mui/mui-x#21868)) [@&#8203;michelengelen](https://github.com/michelengelen)

##### Charts

##### `@mui/x-charts@9.0.3`

- \[charts] Centralize WebGL clear/render cycle (context-based) ([#&#8203;22127](mui/mui-x#22127)) [@&#8203;JCQuintas](https://github.com/JCQuintas)
- \[charts] Fix closest series detection for line charts ([#&#8203;22168](mui/mui-x#22168)) [@&#8203;alexfauquette](https://github.com/alexfauquette)
- \[charts] Fix radius grid lines when axis uses point scale ([#&#8203;22134](mui/mui-x#22134)) [@&#8203;alexfauquette](https://github.com/alexfauquette)
- \[charts] Use cubic solver for berzier intersection ([#&#8203;22152](mui/mui-x#22152)) [@&#8203;alexfauquette](https://github.com/alexfauquette)

##### `@mui/x-charts-pro@9.0.3` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link "Pro plan")

Same changes as in `@mui/x-charts@9.0.3`, plus:

- \[charts-pro] Fix wheel zoom clamping with custom `minStart`/`maxEnd` ([#&#8203;22159](mui/mui-x#22159)) [@&#8203;JCQuintas](https://github.com/JCQuintas)

##### `@mui/x-charts-premium@9.0.3` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link "Premium plan")

Same changes as in `@mui/x-charts-pro@9.0.3`, plus:

- \[charts] Create a `'radialLine'` series type ([#&#8203;22066](mui/mui-x#22066)) [@&#8203;alexfauquette](https://github.com/alexfauquette)
- \[charts] Plot radial line ([#&#8203;22133](mui/mui-x#22133)) [@&#8203;alexfauquette](https://github.com/alexfauquette)
- \[charts] Remove `HeatmapWebGLRenderer` indirection ([#&#8203;22169](mui/mui-x#22169)) [@&#8203;JCQuintas](https://github.com/JCQuintas)

##### Tree View

##### `@mui/x-tree-view@9.0.2`

Internal changes.

##### `@mui/x-tree-view-pro@9.0.2` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link "Pro plan")

Same changes as in `@mui/x-tree-view@9.0.2`.

##### Scheduler

##### Breaking changes

- The `views` of `EventTimelinePremium` have been renamed to `presets`, with names that describe the header layout. The props `view`/`defaultView`/`views`/`onViewChange` are now `preset`/`defaultPreset`/`presets`/`onPresetChange`, and the type `EventTimelinePremiumView` is now `EventTimelinePremiumPreset`.

| Old      | New            |
| :------- | :------------- |
| `time`   | `dayAndHour`   |
| `days`   | `day`          |
| `weeks`  | `dayAndWeek`   |
| `months` | `monthAndYear` |
| `years`  | `year`         |

CSS variables (`--time-cell-width`, etc.) and headless store state (`state.view`, `setView`) follow the same rename. The `presets` array is now sorted internally against a canonical zoom order.

##### `@mui/x-scheduler@9.0.0-alpha.3`

- \[scheduler] Allow creating events via keyboard - EventCalendar ([#&#8203;21967](mui/mui-x#21967)) [@&#8203;rita-codes](https://github.com/rita-codes)
- \[scheduler] Prefix element IDs with a unique Scheduler instance ID ([#&#8203;22109](mui/mui-x#22109)) [@&#8203;rita-codes](https://github.com/rita-codes)

##### `@mui/x-scheduler-premium@9.0.0-alpha.3` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link "Premium plan")

Same changes as in `@mui/x-scheduler@9.0.0-alpha.3`.

- \[scheduler] Allow creating events via keyboard - `EventTimeline` ([#&#8203;22119](mui/mui-x#22119)) [@&#8203;rita-codes](https://github.com/rita-codes)
- \[scheduler] Rename `EventTimeline` `views` to ordered presets ([#&#8203;22130](mui/mui-x#22130)) [@&#8203;rita-codes](https://github.com/rita-codes)

##### Docs

- \[docs] Cleanup generated llm md files for chat ([#&#8203;22163](mui/mui-x#22163)) [@&#8203;brijeshb42](https://github.com/brijeshb42)
- \[docs] Fix `highlightScope` description ([#&#8203;22154](mui/mui-x#22154)) [@&#8203;alexfauquette](https://github.com/alexfauquette)
- \[docs] Remove obsolete v7 deprecation warning for `dayOfWeekFormatter` ([#&#8203;22111](mui/mui-x#22111)) [@&#8203;LukasTy](https://github.com/LukasTy)
- \[docs] Use mui.com for broken links checker known targets ([#&#8203;22129](mui/mui-x#22129)) [@&#8203;JCQuintas](https://github.com/JCQuintas)
- \[docs] Document picker behavior inside MUI `Dialog` and provide recommended solutions ([#&#8203;22144](mui/mui-x#22144)) [@&#8203;michelengelen](https://github.com/michelengelen)
- \[docs] Improve v9 license key version mismatch error guidance ([#&#8203;22180](mui/mui-x#22180)) [@&#8203;aemartos](https://github.com/aemartos)

##### Core

- \[code-infra] Reduce concurrency for package build to 5 ([#&#8203;22115](mui/mui-x#22115)) [@&#8203;Janpot](https://github.com/Janpot)
- \[code-infra] Rename `docsx` alias to `docs` ([#&#8203;22155](mui/mui-x#22155)) [@&#8203;brijeshb42](https://github.com/brijeshb42)
- \[docs-infra] Remove monorepo dependency ([#&#8203;22025](mui/mui-x#22025)) [@&#8203;brijeshb42](https://github.com/brijeshb42)
- \[docs-infra] Use latest published packages ([#&#8203;22086](mui/mui-x#22086)) [@&#8203;brijeshb42](https://github.com/brijeshb42)
- \[test] Refactor Pickers tests to async user-event ([#&#8203;22043](mui/mui-x#22043)) [@&#8203;LukasTy](https://github.com/LukasTy)
- \[test] Remove redundant explicit `unmount()` calls from Pickers tests ([#&#8203;22118](mui/mui-x#22118)) [@&#8203;LukasTy](https://github.com/LukasTy)

##### Miscellaneous

- \[infra] Update `.gitignore` to exclude `.claude/worktrees` ([#&#8203;22145](mui/mui-x#22145)) [@&#8203;michelengelen](https://github.com/michelengelen)
- \[infra] Enable branch tracking when creating release branch ([#&#8203;22177](mui/mui-x#22177)) [@&#8203;michelengelen](https://github.com/michelengelen)
- \[license] Add MIT license to `x-virtualizer` package ([#&#8203;22164](mui/mui-x#22164)) [@&#8203;michelengelen](https://github.com/michelengelen)
- \[website] Fix outdated MUI logos ([#&#8203;22117](mui/mui-x#22117)) [@&#8203;oliviertassinari](https://github.com/oliviertassinari)
- \[internal] Try avoiding store update when virtualization is disabled ([#&#8203;22093](mui/mui-x#22093)) [@&#8203;arminmeh](https://github.com/arminmeh)

</details>

<details>
<summary>ajaxorg/ace-builds (ace-builds)</summary>

### [`v1.44.0`](https://github.com/ajaxorg/ace-builds/blob/HEAD/CHANGELOG.md#1440-2026-05-11)

[Compare Source](ajaxorg/ace-builds@v1.43.6...v1.44.0)

##### Features

- Extension to show whitespaces in selection ([#&#8203;5844](ajaxorg/ace#5844)) ([9498a7f](ajaxorg/ace@9498a7f))
- **mode:** Add Cedar and CedarSchema language modes for Ace Editor ([#&#8203;5944](ajaxorg/ace#5944)) ([c5c19dc](ajaxorg/ace@c5c19dc))
- **rust:** Include `raw` borrow operator in keyword list ([#&#8203;5942](ajaxorg/ace#5942)) ([93581d6](ajaxorg/ace@93581d6))
- update Flix keywords ([#&#8203;5931](ajaxorg/ace#5931)) ([f45eb67](ajaxorg/ace@f45eb67))

##### Bug Fixes

- `mode` type to accept both `SyntaxMode` and `string` across definitions and implementations ([#&#8203;5925](ajaxorg/ace#5925)) ([a6b1cb1](ajaxorg/ace@a6b1cb1))
- row calculation for fractional coords in virtual\_renderer ([#&#8203;5914](ajaxorg/ace#5914)) ([a6724b7](ajaxorg/ace@a6724b7))

##### [1.43.6](ajaxorg/ace@v1.43.5...v1.43.6) (2026-01-23)

##### Bug Fixes

- the text completer didn't export its id ([#&#8203;5847](ajaxorg/ace#5847)) ([b256c10](ajaxorg/ace@b256c10))

##### [1.43.5](ajaxorg/ace@v1.43.4...v1.43.5) (2025-12-02)

##### [1.43.4](ajaxorg/ace@v1.43.3...v1.43.4) (2025-10-17)

##### Bug Fixes

- Update for compliance with typescript 5.9.2 ([#&#8203;5855](ajaxorg/ace#5855)) ([6e110b0](ajaxorg/ace@6e110b0))

##### [1.43.3](ajaxorg/ace@v1.43.2...v1.43.3) (2025-09-02)

##### Bug Fixes

- firefox textarea autocomplete corruption ([#&#8203;5860](ajaxorg/ace#5860)) ([23ac02f](ajaxorg/ace@23ac02f))

##### [1.43.2](ajaxorg/ace@v1.43.1...v1.43.2) (2025-07-15)

##### Features

- Implement text markers ([#&#8203;5835](ajaxorg/ace#5835)) ([085730f](ajaxorg/ace@085730f))

##### [1.43.1](ajaxorg/ace@v1.43.0...v1.43.1) (2025-07-02)

##### Bug Fixes

- **a11y:** aria-describedby to gutter elements ([#&#8203;5838](ajaxorg/ace#5838)) ([bf27c15](ajaxorg/ace@bf27c15))

##### [1.42.1](ajaxorg/ace@v1.42.0...v1.42.1) (2025-06-20)

##### Features

- Add scroll diff decorators ([#&#8203;5807](ajaxorg/ace#5807)) ([b45e94c](ajaxorg/ace@b45e94c))

</details>

<details>
<summary>i18next/i18next (i18next)</summary>

### [`v26.1.0`](https://github.com/i18next/i18next/blob/HEAD/CHANGELOG.md#2610)

[Compare Source](i18next/i18next@v26.0.10...v26.1.0)

- feat: `enableSelector: 'strict'` (TypeOptions + runtime option). Opt-in mode that drops the flattened-primary form from `NsResource` at the type level — every namespace (primary included) is exposed only under its own key on `$`, uniformly across single- and multi-ns hooks. At runtime, a leading selector path segment matching the scope's namespace list is always rewritten as a namespace prefix, including the primary. Eliminates the silent-miss surface area where `t($ => $.primary.foo)` typechecks but doesn't resolve under the default mode (see [#&#8203;2429](i18next/i18next#2429)). Backward-compatible: default `enableSelector: false | true | 'optimize'` behavior is unchanged. Note: strict mode is incompatible with the [#&#8203;2405](i18next/i18next#2405) pattern (keys whose names match sibling namespaces) — those users should stay on default mode.

### [`v26.0.10`](https://github.com/i18next/i18next/blob/HEAD/CHANGELOG.md#26010)

[Compare Source](i18next/i18next@v26.0.9...v26.0.10)

- feat: `getFixedT` accepts a fourth optional `fixedOpts` argument carrying `scopeNs` — the full namespace list the bound `t` was created for. The selector API uses `scopeNs` to detect when a path's first segment is a namespace prefix, **without** changing resolution scope. Resolution still uses the bound `ns` (a single primary string in the typical react-i18next setup), so plain `t('key')` lookups stay isolated to the primary namespace exactly as before — only `t($ => $.secondaryNs.foo)` selectors now route correctly under `useTranslation([nsA, nsB])`. Fixes the runtime side of [#&#8203;2429](i18next/i18next#2429) for the `react-i18next` default-`nsMode` case. The 4th argument is opt-in: existing 3-arg `getFixedT(lng, ns, keyPrefix)` callers see no behavior change.

### [`v26.0.9`](https://github.com/i18next/i18next/blob/HEAD/CHANGELOG.md#2609)

[Compare Source](i18next/i18next@v26.0.8...v26.0.9)

- fix(types): unformatted interpolation values are now typed as `string | number` (was `string`). i18next stringifies values at runtime, so requiring callers to wrap numbers in `String(...)` for plain `{{var}}` placeholders was unnecessary friction — and could mask the real problem when a non-string value was passed alongside multiple interpolation slots (the `t()` overload resolution would fall through to the 3-arg form and report a confusing "not assignable to string" error against the options object). Typed format specifiers like `{{x, number}}`, `{{x, currency}}`, `{{x, datetime}}`, etc. keep their precise types; this only relaxes the no-format default. The `count` variable remains `number`-only

### [`v26.0.8`](https://github.com/i18next/i18next/blob/HEAD/CHANGELOG.md#2608)

[Compare Source](i18next/i18next@v26.0.7...v26.0.8)

- fix(types): restore the pre-v25.10.4 `ExistsFunction` shape so plain arrow functions can again be assigned to `ExistsFunction`-typed variables (TypeScript cannot infer type predicates through multi-overload assignment). Direct `i18next.exists(key)` calls still narrow `key` to `SelectorKey` — the predicate is now declared inline on `i18n.exists`. Custom wrappers that want the narrowing can type themselves as `typeof i18next.exists` [2425](i18next/i18next#2425)

### [`v26.0.7`](https://github.com/i18next/i18next/blob/HEAD/CHANGELOG.md#2607)

[Compare Source](i18next/i18next@v26.0.6...v26.0.7)

- fix: when a plural lookup misses, the `missingKey` debug log now shows the actual plural-resolved key (e.g. `foo.bar_many` for Polish `count: 14`) instead of the base key — making it obvious which plural category was expected and missing [2423](i18next/i18next#2423)
- chore: drop `@babel/runtime` runtime dependency. The build no longer generates any `@babel/runtime` imports, so the package is unused by consumers. Rollup now uses `babelHelpers: 'bundled'` so any helpers that are ever needed in the future will be inlined rather than imported externally [2424](i18next/i18next#2424)
- chore: stop emitting `dist/esm/i18next.bundled.js`. It was byte-identical to `dist/esm/i18next.js` because no helpers were being imported [2424](i18next/i18next#2424)

</details>

<details>
<summary>remix-run/react-router (react-router-dom)</summary>

### [`v7.15.0`](https://github.com/remix-run/react-router/blob/HEAD/packages/react-router-dom/CHANGELOG.md#v7150)

[Compare Source](https://github.com/remix-run/react-router/compare/react-router-dom@7.14.2...react-router-dom@7.15.0)

##### Patch Changes

- Updated dependencies:
  - [`react-router@7.15.0`](https://github.com/remix-run/react-router/releases/tag/react-router@7.15.0)

### [`v7.14.2`](https://github.com/remix-run/react-router/blob/HEAD/packages/react-router-dom/CHANGELOG.md#v7142)

[Compare Source](https://github.com/remix-run/react-router/compare/react-router-dom@7.14.1...react-router-dom@7.14.2)

##### Patch Changes

- Updated dependencies:
  - [`react-router@7.14.2`](https://github.com/remix-run/react-router/releases/tag/react-router@7.14.2)

</details>

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box

---

This MR has been generated by [Mend Renovate](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xNzAuMTgiLCJ1cGRhdGVkSW5WZXIiOiI0My4xNzEuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIiwicmVub3ZhdGUiXX0=-->

See merge request swiss-armed-forces/cyber-command/cea/loom!501

Co-authored-by: Loom MR Pipeline Trigger <group_103951964_bot_9504bb8dead6d4e406ad817a607f24be@noreply.gitlab.com>
Co-authored-by: shrewd-laidback palace <shrewd-laidback-palace-736-c41-2c1-e464fc974@swiss-armed-forces-open-source.ch>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

plan: Premium Impact at least one Premium user. scope: charts Changes related to the charts. type: new feature Expand the scope of the product to solve a new problem.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants