Skip to content

Commit 81b6ed3

Browse files
authored
Merge branch 'master' into radial-bar-refinement
2 parents 49bcff9 + 8f6c165 commit 81b6ed3

109 files changed

Lines changed: 2120 additions & 562 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.circleci/config.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
version: 2.1
22

33
orbs:
4-
code-infra: https://raw.githubusercontent.com/mui/mui-public/7c091ffc8105f41363b1bd9907eca180c8c1d21e/.circleci/orbs/code-infra.yml
4+
code-infra: https://raw.githubusercontent.com/mui/mui-public/18225f60a2186e3eb12f1c1ecee4db945baecca2/.circleci/orbs/code-infra.yml
55

66
parameters:
77
browserstack-force:

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
.cursor
66
.claude/settings.local.json
77
.claude/worktrees/
8+
.claude/scheduled_tasks.lock
89
.junie
910

1011
__diff_output__

CHANGELOG.md

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,123 @@
11
# Changelog
22

3+
## 9.3.0
4+
5+
_May 21, 2026_
6+
7+
We'd like to extend a big thank you to the 16 contributors who made this release possible. Here are some highlights ✨:
8+
9+
- 📆 Refactor Calendar Range drag editing to use Pointer Events instead of drag and touch events combination (#22279)
10+
- ✨ Apply lazy loading to `EventTimelinePremium` (#22308)
11+
- 🐞 Bugfixes
12+
- 📚 Documentation improvements
13+
- 🌎 Added Norwegian bokmål (nb-NO) locale to the Scheduler
14+
- 🌎 Improved Swedish (sv-SE) locale on the Data Grid
15+
16+
Special thanks go out to these community members for their valuable contributions:
17+
@Anexus5919, @jvskriubakken, @oscar-b, @rin, @viktormelin
18+
19+
The following team members contributed to this release:
20+
@aemartos, @alexfauquette, @arminmeh, @Janpot, @JCQuintas, @LukasTy, @mj12albert, @oliviertassinari, @rita-codes, @romgrk, @sai6855
21+
22+
### Data Grid
23+
24+
#### `@mui/x-data-grid@9.3.0`
25+
26+
- [DataGrid] Fix scrollbar disappearing after multiple resizes (#22512) @LukasTy
27+
- [DataGrid] Revert "Add support for pinned columns in `GridVirtualScroller`" (#22467) @oliviertassinari
28+
- [l10n] Improve Swedish (svSE) locale (#21851) @viktormelin
29+
30+
#### `@mui/x-data-grid-pro@9.3.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan')
31+
32+
Same changes as in `@mui/x-data-grid@9.3.0`.
33+
34+
#### `@mui/x-data-grid-premium@9.3.0` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan')
35+
36+
Same changes as in `@mui/x-data-grid-pro@9.3.0`.
37+
38+
### Date and Time Pickers
39+
40+
#### `@mui/x-date-pickers@9.3.0`
41+
42+
- [pickers] Fix disabled state styling for `PickersTextField` standard and filled variants (#22189) @LukasTy
43+
- [pickers] Fix previous month disabled state calculation (#22524) @mj12albert
44+
- [pickers] Merge `slotProps.sectionContent` in `PickersInputBase` (#22324) @rin
45+
46+
#### `@mui/x-date-pickers-pro@9.3.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan')
47+
48+
Same changes as in `@mui/x-date-pickers@9.3.0`, plus:
49+
50+
- [DateRangeCalendar] Use Pointer Events for drag editing (#22279) @LukasTy
51+
52+
### Charts
53+
54+
#### `@mui/x-charts@9.3.0`
55+
56+
- [charts] Add `data-series` to elements of radar chart (#22523) @alexfauquette
57+
- [charts] Add environment check for warning messages in axis and radar hooks (#22506) @sai6855
58+
- [charts] Chart `seriesConfig` deduplication for lines and bars (#22257) @sai6855
59+
- [charts] Fix highlighted item crash (#22539) @oscar-b
60+
- [charts] Fix the line and mark class (#22526) @alexfauquette
61+
- [charts] Fix use of deprecated API in docs (#22469) @oliviertassinari
62+
- [charts] Improve performance of `evaluateCurveY` function (#22407) @sai6855
63+
64+
#### `@mui/x-charts-pro@9.3.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan')
65+
66+
Same changes as in `@mui/x-charts@9.3.0`.
67+
68+
#### `@mui/x-charts-premium@9.3.0` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan')
69+
70+
Same changes as in `@mui/x-charts-pro@9.3.0`, plus:
71+
72+
- [charts-premium] Add `closePath` option to the radial line series (#22517) @alexfauquette
73+
74+
### Tree View
75+
76+
#### `@mui/x-tree-view-pro@9.3.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan')
77+
78+
Internal changes.
79+
80+
### Scheduler
81+
82+
#### `@mui/x-scheduler@9.0.0-alpha.7`
83+
84+
- [I10n] Add Norwegian bokmål (nb-NO) locale (#22415) @jvskriubakken
85+
86+
#### `@mui/x-scheduler-premium@9.0.0-alpha.7` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan')
87+
88+
Same changes as in `@mui/x-scheduler@9.0.0-alpha.7`, plus:
89+
90+
- [scheduler] Apply lazy loading to `EventTimelinePremium` (#22308) @rita-codes
91+
- [scheduler] Deduplicate staged ranges within the debounce window (#22476) @Anexus5919
92+
- [scheduler] Pass full event objects to `dataSource.updateEvents` (#22462) @rita-codes
93+
94+
### Docs
95+
96+
- [docs] Automatically update supported versions (#21850) @arminmeh
97+
- [docs] Fix `New` label on bar charts docs (#22473) @oliviertassinari
98+
- [docs] Improve premium page header for charts (#22474) @oliviertassinari
99+
- [docs] Sync `README` with licensing/licensing.md in scheduler (#22468) @oliviertassinari
100+
101+
### Core
102+
103+
- [code-infra] Cover docs overview composites with Argos (#22283) @LukasTy
104+
- [code-infra] Enable `mui/no-presentation-role` lint rule (#22360) @Janpot
105+
- [code-infra] Make generated `propTypes` union order deterministic (#22521) @JCQuintas
106+
- [code-infra] Make screenshots stable across different ordering of the tests (#22449) @Janpot
107+
- [code-infra] Optimize visual regression testing (#22447) @Janpot
108+
- [code-infra] Replace markdownlint with remark from code-infra (#22255) @Janpot
109+
110+
### Miscellaneous
111+
112+
- [virtualizer] Improve `controlled` mode performance (#22123) @romgrk
113+
- [data-grid-generator] Include `tree-data` params in `useDemoData` cache key (#22456) @Janpot
114+
- [test] Fix flaky browser tests and optimize (#22431) @Janpot
115+
- [test] Speed up `test_types` job (#22442) @Janpot
116+
- [test] Trim ffmpeg install in `test_regressions` (#22459) @Janpot
117+
- [test] Add WebGL performance benchmarks for charts (#22471) @JCQuintas
118+
- [test] Expand chart performance benchmarks for charts (#22472) @JCQuintas
119+
- [x-license] use workspace dep for v9 in cross-major compat tests (#22504) @aemartos
120+
3121
## 9.2.0
4122

5123
_May 13, 2026_

docs/data/charts/toolbar/ChartsToolbarCustomToolbar.js

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -80,14 +80,18 @@ function CustomToolbar() {
8080
<Stack>
8181
<Toolbar>
8282
<Tooltip title="Zoom in">
83-
<ChartsToolbarZoomInTrigger render={<ToolbarButton size="small" />}>
84-
<ZoomInIcon />
85-
</ChartsToolbarZoomInTrigger>
83+
<span>
84+
<ChartsToolbarZoomInTrigger render={<ToolbarButton size="small" />}>
85+
<ZoomInIcon />
86+
</ChartsToolbarZoomInTrigger>
87+
</span>
8688
</Tooltip>
8789
<Tooltip title="Zoom out">
88-
<ChartsToolbarZoomOutTrigger render={<ToolbarButton size="small" />}>
89-
<ZoomOutIcon />
90-
</ChartsToolbarZoomOutTrigger>
90+
<span>
91+
<ChartsToolbarZoomOutTrigger render={<ToolbarButton size="small" />}>
92+
<ZoomOutIcon />
93+
</ChartsToolbarZoomOutTrigger>
94+
</span>
9195
</Tooltip>
9296

9397
<ResetZoomButton>Reset</ResetZoomButton>

docs/data/charts/toolbar/ChartsToolbarCustomToolbar.tsx

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -82,14 +82,18 @@ function CustomToolbar() {
8282
<Stack>
8383
<Toolbar>
8484
<Tooltip title="Zoom in">
85-
<ChartsToolbarZoomInTrigger render={<ToolbarButton size="small" />}>
86-
<ZoomInIcon />
87-
</ChartsToolbarZoomInTrigger>
85+
<span>
86+
<ChartsToolbarZoomInTrigger render={<ToolbarButton size="small" />}>
87+
<ZoomInIcon />
88+
</ChartsToolbarZoomInTrigger>
89+
</span>
8890
</Tooltip>
8991
<Tooltip title="Zoom out">
90-
<ChartsToolbarZoomOutTrigger render={<ToolbarButton size="small" />}>
91-
<ZoomOutIcon />
92-
</ChartsToolbarZoomOutTrigger>
92+
<span>
93+
<ChartsToolbarZoomOutTrigger render={<ToolbarButton size="small" />}>
94+
<ZoomOutIcon />
95+
</ChartsToolbarZoomOutTrigger>
96+
</span>
9397
</Tooltip>
9498

9599
<ResetZoomButton>Reset</ResetZoomButton>
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import * as React from 'react';
2+
import { LineChartPro } from '@mui/x-charts-pro/LineChartPro';
3+
import { dataset } from '../dataset/gdpPerCapitaEvolution';
4+
5+
const INITIAL_START = 75;
6+
7+
export default function ChartsToolbarRangeButtonsInitialSelection() {
8+
return (
9+
<LineChartPro
10+
dataset={dataset}
11+
xAxis={[
12+
{ id: 'x', scaleType: 'time', dataKey: 'date', zoom: true, tickNumber: 5 },
13+
]}
14+
yAxis={[{ width: 60, valueFormatter: (v) => `$${(v / 1000).toFixed(0)}k` }]}
15+
series={[
16+
{ dataKey: 'fr', label: 'France' },
17+
{ dataKey: 'gb', label: 'UK' },
18+
{ dataKey: 'dl', label: 'Germany' },
19+
]}
20+
height={300}
21+
showToolbar
22+
initialZoom={[{ axisId: 'x', start: INITIAL_START, end: 100 }]}
23+
slotProps={{
24+
toolbar: {
25+
rangeButtons: [
26+
{ label: 'Last ¼', value: () => ({ start: 75, end: 100 }) },
27+
{ label: 'Last ½', value: () => ({ start: 50, end: 100 }) },
28+
{ label: 'All', value: null },
29+
],
30+
},
31+
}}
32+
/>
33+
);
34+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import * as React from 'react';
2+
import { LineChartPro } from '@mui/x-charts-pro/LineChartPro';
3+
import { dataset } from '../dataset/gdpPerCapitaEvolution';
4+
5+
const INITIAL_START = 75;
6+
7+
export default function ChartsToolbarRangeButtonsInitialSelection() {
8+
return (
9+
<LineChartPro
10+
dataset={dataset}
11+
xAxis={[
12+
{ id: 'x', scaleType: 'time', dataKey: 'date', zoom: true, tickNumber: 5 },
13+
]}
14+
yAxis={[
15+
{ width: 60, valueFormatter: (v: number) => `$${(v / 1000).toFixed(0)}k` },
16+
]}
17+
series={[
18+
{ dataKey: 'fr', label: 'France' },
19+
{ dataKey: 'gb', label: 'UK' },
20+
{ dataKey: 'dl', label: 'Germany' },
21+
]}
22+
height={300}
23+
showToolbar
24+
initialZoom={[{ axisId: 'x', start: INITIAL_START, end: 100 }]}
25+
slotProps={{
26+
toolbar: {
27+
rangeButtons: [
28+
{ label: 'Last ¼', value: () => ({ start: 75, end: 100 }) },
29+
{ label: 'Last ½', value: () => ({ start: 50, end: 100 }) },
30+
{ label: 'All', value: null },
31+
],
32+
},
33+
}}
34+
/>
35+
);
36+
}

docs/data/charts/toolbar/toolbar.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,12 @@ Function values receive index-based domain bounds instead of timestamps.
134134

135135
{{"demo": "ChartsToolbarOrdinalRangeButtons.js"}}
136136

137+
### Initial selection
138+
139+
When `initialZoom` (or a controlled `zoomData`) matches a range button's computed range, that button is selected on first render without requiring user interaction.
140+
141+
{{"demo": "ChartsToolbarRangeButtonsInitialSelection.js"}}
142+
137143
### Custom toolbar with range buttons
138144

139145
You can use `ChartsToolbarRangeButtonTrigger` directly in a custom toolbar to have full control over layout and behavior.
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
import * as React from 'react';
2+
import { MarkdownElement } from '@mui/internal-core-docs/MarkdownDocs';
3+
4+
// Ordered from newest to oldest.
5+
// When a new major version is released:
6+
// 1. Update its `releaseDate` from `null` to the actual release date.
7+
// 2. Set `ltsEndDate` on the previous stable version (typically releaseDate + 2 years).
8+
// All statuses will update automatically based on the current date.
9+
//
10+
// #target-branch-reference
11+
// Add a new entry when creating a new major version branch.
12+
// For example, when creating v10 from v9, add `{ version: '^10.0.0', releaseDate: null, plannedRelease: 'April 2027' }`
13+
const muiXVersions = [
14+
// { version: '^10.0.0', releaseDate: null, plannedRelease: 'April 2027' },
15+
{ version: '^9.0.0', releaseDate: '2026-04-08' },
16+
{ version: '^8.0.0', releaseDate: '2025-04-17', ltsEndDate: '2028-04-08' },
17+
{ version: '^7.0.0', releaseDate: '2024-03-23', ltsEndDate: '2027-04-17' },
18+
{ version: '^6.0.0', releaseDate: '2023-03-03', ltsEndDate: '2026-03-23' },
19+
{ version: '^5.0.0', releaseDate: '2021-11-23', ltsEndDate: '2025-03-03' },
20+
{ version: '^4.0.0', releaseDate: '2021-09-28', ltsEndDate: '2023-11-23' },
21+
];
22+
23+
function formatDate(dateStr) {
24+
const date = new Date(dateStr);
25+
return date.toLocaleDateString('en-US', {
26+
year: 'numeric',
27+
month: 'long',
28+
day: 'numeric',
29+
});
30+
}
31+
32+
function getVersionStatus(version, now) {
33+
if (!version.releaseDate || new Date(version.releaseDate) > now) {
34+
return { type: 'preRelease' };
35+
}
36+
37+
if (!version.ltsEndDate) {
38+
return { type: 'currentStable' };
39+
}
40+
41+
if (now < new Date(version.ltsEndDate)) {
42+
return { type: 'lts', endDate: version.ltsEndDate };
43+
}
44+
45+
return { type: 'outOfSupport', endDate: version.ltsEndDate };
46+
}
47+
48+
function renderStatus(status) {
49+
switch (status.type) {
50+
case 'preRelease':
51+
return '🚧 Pre-release (Continuous support)';
52+
case 'currentStable':
53+
return '✅ Current stable major (Continuous support)';
54+
case 'lts':
55+
return (
56+
<React.Fragment>
57+
⚠️ LTS - Support for security issues and regressions{' '}
58+
<strong>until {formatDate(status.endDate)}</strong>.
59+
</React.Fragment>
60+
);
61+
62+
case 'outOfSupport':
63+
return `❌ Out of support since ${formatDate(status.endDate)}.`;
64+
default:
65+
return '';
66+
}
67+
}
68+
69+
const now = new Date();
70+
const columns = [
71+
{
72+
key: 'version',
73+
label: 'MUI X version',
74+
align: 'right',
75+
render: (versionData) => versionData.version,
76+
},
77+
{
78+
key: 'release',
79+
label: 'Release',
80+
align: 'left',
81+
render: (versionData) =>
82+
versionData.releaseDate ?? versionData.plannedRelease ?? 'TBD',
83+
},
84+
{
85+
key: 'supported',
86+
label: 'Supported',
87+
align: 'left',
88+
render: (versionData) => renderStatus(getVersionStatus(versionData, now)),
89+
},
90+
];
91+
92+
export default function SupportedVersions() {
93+
const props = { sx: { width: '100%' } };
94+
const fontFamily = 'inherit'; // prevent `th` and `td` specific font families
95+
96+
return (
97+
<MarkdownElement {...props}>
98+
<table>
99+
<thead>
100+
<tr>
101+
{columns.map((column) => (
102+
<th key={column.key} align={column.align} style={{ fontFamily }}>
103+
{column.label}
104+
</th>
105+
))}
106+
</tr>
107+
</thead>
108+
<tbody>
109+
{muiXVersions.map((version) => (
110+
<tr key={version.version}>
111+
{columns.map((column) => (
112+
<td key={column.key} align={column.align} style={{ fontFamily }}>
113+
{column.render(version)}
114+
</td>
115+
))}
116+
</tr>
117+
))}
118+
</tbody>
119+
</table>
120+
</MarkdownElement>
121+
);
122+
}

0 commit comments

Comments
 (0)