Repository navigation
deps(js): bump MUI X Charts to 9.16 with React 19 and Material 9.5 - #12243
Merged
Merged
Conversation
MarkusNeusinger
added a commit
that referenced
this pull request
Oct 22, 2026
…notes Gemini 3.8 Flash first review on #12243: a circle shape alone draws nothing while showMark defaults to false, and DefaultChartsLegend is one of the removed v7 imports (pie-basic). Also rewraps one long line. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
Contributor
There was a problem hiding this comment.
🔵 Needs a closer look
The documented 164 bundle failures and 67 blank-axis regressions require the owner’s regeneration decision and coordination with #12240 before merge.
No open issues 🎉
What changed in this PR
Upgrades the pipeline’s JavaScript render stack to MUI X Charts 9.16, Material 9.5, and React 19, with generation guidance for the breaking API changes. Existing published artifacts remain unchanged until regeneration.
Changes:
- Updates dependency pins and the lockfile for the new render stack.
- Adds v9 guidance for composition, legends, axes, styling, and chart sizing.
- Updates the displayed library version and documents the catalogue compatibility impact.
| File | Description |
|---|---|
prompts/library/muix.md |
Adds v9 migration guidance and adjusts example heights for legends. |
package.json |
Bumps MUI Charts, Material, React, and React DOM. |
package-lock.json |
Locks the upgraded stack and its transitive dependencies. |
core/constants.py |
Updates the displayed MUI X Charts version to 9.16.0. |
changelog.d/muix-9.md |
Records the upgrade and existing implementations’ regeneration needs. |
Review effort: Balanced
MarkusNeusinger
added a commit
that referenced
this pull request
Oct 23, 2026
…notes Gemini 3.8 Flash first review on #12243: a circle shape alone draws nothing while showMark defaults to false, and DefaultChartsLegend is one of the removed v7 imports (pie-basic). Also rewraps one long line. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MarkusNeusinger
force-pushed
the
chore/muix-9
branch
from
October 23, 2026 10:01
f355836 to
3a8877a
Compare
The JS render harness pins @mui/x-charts 9.16.0, @mui/material 9.5.0 and react / react-dom 19.3.1 (from 7.29.1, 5.18.0 and 18.3.1), the React and Material versions the frontend already runs. Installed with npm; emotion stays on 11.14.x, which satisfies the new peer ranges. prompts/library/muix.md moves its API level to MUI X Charts 9, the major the lock now pins (tests/unit/core/test_version_sources.py), and gains a "MUI X v9 API" section covering what breaks or silently restyles generated code (ChartsContainer, hideLegend and the legend position values, the HTML legend's extra height, position "none" for axes, per-chart CSS classes and [data-series], line-mark defaults). The Sizing section adds the explicit axis height/width rule, because v9 truncates tick labels that overflow the axis band, and both code examples subtract the legend band. The displayed version now comes from the lock, so core/constants.py is unchanged. render.mjs and the setup-node guard component need no change: the guard renders 3200x1800 under the new stack. Existing MUI X implementations were written for v7. Under v9, 164 of 323 no longer bundle (mostly the removed @mui/x-charts/ChartContainer path), and 157 of the 159 that render change. The owner decided on 2026-10-23 to merge and regenerate all MUI X implementations. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0175hA62juZoajMcqKxWFGza
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…notes Gemini 3.8 Flash first review on #12243: a circle shape alone draws nothing while showMark defaults to false, and DefaultChartsLegend is one of the removed v7 imports (pie-basic). Also rewraps one long line. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MarkusNeusinger
force-pushed
the
chore/muix-9
branch
from
October 23, 2026 10:09
3a8877a to
7a371ef
Compare
4 tasks done
MarkusNeusinger
added a commit
that referenced
this pull request
Oct 23, 2026
…#12259) ## Summary - **Playwright 1.55.1 → 1.64.1** in the root `package.json` and `package-lock.json`. GitHub's `ubuntu-latest` now resolves to Ubuntu 26.04 (image 20261012.163.1). Playwright 1.55.1 has no `ubuntu26.04-x64` host platform, so `npx playwright install --with-deps chromium` in `.github/actions/setup-node` failed (run 39938127853). Every `impl-generate`/`impl-repair` run for chartjs, d3, echarts, highcharts and muix died in setup. 1.64.1 ships the 26.04 download paths and apt dependency list. The lock diff is playwright + playwright-core plus the darwin-only `fsevents` optional entry that 1.64 no longer declares. esbuild stays at 0.28.1. Integrity hashes match the registry. This also aligns with the `playwright-core@1.64.1` pin that `scripts/site-smoke.mjs` and `ci-image.yml` already use. - **Ruff format fix no longer part of this PR.** This branch first carried the two PEP 758 `except` lines that main's lint needed. #12260 landed the identical lines, and after merging main they collapsed, so the diff is Playwright only. - Supersedes Dependabot #12251 for the Playwright half; its esbuild 0.28.2 half is left to Dependabot. ## Plan N/A ## Test plan - [x] **The action's own steps on Ubuntu 26.04, in a container.** `ubuntu:26.04` (26.04.1 LTS, resolute) with Node 22.23.3 (the action's default `node-version: "22"`). Every `run:` step of `.github/actions/setup-node/action.yml` ran verbatim against a minimal checkout: - **1.64.1:** `npm ci`, `npx playwright install --with-deps chromium` (apt deps + Chrome for Testing 156.0.8078.4) and both smoke renders all pass. The chartjs PNG and the MUI X React-path PNG are both 3200×1800. - **1.55.1 (negative control):** the install fails with exactly the CI error, `Error: ERROR: Playwright does not support chromium on ubuntu26.04-x64`. - [x] Render comparison: 1.55.1 (Chromium 140.0.7339.186) against 1.64.1 (Chromium 156.0.8078.4). Each harness was confirmed to launch its own build. The sample is 17 catalogue snippets × 2 themes = 34 pairs, rendered the way the pipeline calls the harness: - chartjs: 4 snippets. d3: 3. echarts: 4. highcharts: 3. muix: 3. Six of them are square-orientation. - **All 34 pairs are pixel-identical:** 0.000 % of pixels differ and the content bounding boxes match. Only the PNG encoding bytes differ. - [x] **MUI X sample excluded two snippets.** Two sampled muix snippets (`spiral-timeseries`, `biplot-pca`) import `@mui/x-charts/ChartContainer`. MUI X 9.16 (#12243) no longer exports that path, so both fail identically under BOTH Playwright versions. This is the known #12243 blast radius, and the muix bulk regeneration covers it. The muix sample therefore uses three snippets that still bundle. - [x] `ruff check`, `ruff format --check`, `mypy api core`, `pytest tests/unit tests/integration` (12715 passed) and `tools.changelog check` are green locally. ## Known gaps - **No PR check runs `.github/actions/setup-node`.** Only `impl-generate.yml` and `impl-repair.yml` use it, and neither runs on pull requests. A green PR therefore does not prove the install on the real runner. The 26.04 container run above is the closest local proof: same OS release, same Node major, same verbatim steps. The GitHub runner image adds preinstalled software on top of that. - **The real test is the first `impl-generate` run for a JavaScript library after the merge.** The muix bulk-regeneration pilot will be that run. - **Steps after setup are also untested on 26.04.** No `impl-generate` run has yet passed setup on the new image. Python, uv and the pngquant apt install already pass there (run 39938127853, steps 9–13). Claude, image processing and the GCS upload have not run on 26.04 yet. --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Oct 23, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Note
The owner decided on 2026-10-23 to merge this PR and bulk-regenerate all 323 MUI X implementations afterwards.
Summary
package.jsonvia npm:@mui/x-charts7.29.1 → 9.16.0,@mui/material5.18.0 → 9.5.0,react/react-dom18.3.1 → 19.3.1. These are the React and Material versionsapp/already runs. Emotion stays on 11.14.x, which satisfies the new peer ranges. The tree resolves to one copy each of React, Material,@mui/systemand@mui/utils.prompts/library/muix.mdto MUI X Charts 9, the major the lock now pins. Adds a "MUI X v9 API" section, an axis-size rule in Sizing, and a legend-band allowance in both code examples. Since refactor: derive library versions from pins, install from uv.lock #12240, the displayed version comes from the lock, socore/constants.pyneeds no change.automation/js-render/render.mjsand the setup-node guard component unchanged. The guard snippet renders 3200 × 1800 under the new stack.Before and after renders
Every MUI X implementation was rendered in both themes with the old pins and then with the new ones (646 renders each), and the PNGs were compared with PIL. Renders are deterministic: 44 of 44 repeat renders of the old stack were pixel-identical. So any differing pixel counts as a change, with no tolerance.
The changed v9 renders differ in a median of 13 % of their pixels, with a maximum of 69 %.
The v8.29.3 column shows that staying on v8 would not avoid the regressions. v8 keeps the
ChartContainerpath, but the legend, axis-size and margin changes that cause most of the visual damage landed in v8. Under v8, 135 specs get a blank axis.Failures
All 164 failures happen at esbuild bundle time, so nothing is drawn:
@mui/x-charts/ChartContainersubpath removed; v9 renamed itChartsContainerand has no aliasChartContainerimported from the package root (heatmap-periodic-table,qrcode-basic)lineElementClassesremoved, nowlineClasses.line(line-styled)DefaultChartsLegendremoved (pie-basic)A bundle stops at its first error, so further v9 problems may surface in these files once the import is fixed.
Ten largest diffs (light theme)
area-stackedfillOpacityset via.MuiAreaElement-rootno longer applies, so fills turn opaque. The strict x domain drops the empty trailing month, and the legend marks become lines.streamgraph-basicleftAxis={null}reappears. The samestackOrder: "insideOut"andstackOffset: "wiggle"now produce a different layer order and a flatter baseline.area-stacked-percentarea-stacked-confidencelearning-curve-basic.MuiAreaElement-series-<id>turn opaque and cover the lines. Marks cycle shapes, and the x tick labels go blank.area-basic.MuiAreaElement-rootfalls back to solid. The x tick labels go blank, and a legend appears.histogram-cumulativeslotProps.legend.hiddenreappears, and the x tick labels go blank.survival-kaplan-meierline-filledline-impurity-comparisonSilent regressions in the charts that still render
These v7 options are not rejected in v9. They are ignored.
sxselectors on classes v9 removed (.MuiAreaElement-*,.MuiLineElement-series-*,.MuiBarElement-root, …)slotProps.legend.hidden, so the legend reappearsdirection/positionvalueslabelStyle,itemMarkWidth,markGap,itemGap,padding)topAxis/leftAxis/bottomAxis/rightAxisprops, so hidden axes reappeartickFontSize/labelFontSizeA DOM probe over all 159 rendered charts found 67 specs with at least one axis whose tick labels are all empty. The old stack has 4 such specs, and none of them overlap with the 67. The cause is confirmed in isolation. Since v8, an x axis reserves a 25 px band (a y axis 45 px) and truncates tick labels that don't fit. An axis
labelwithlabelStyleplus an enlargedtickLabelStyleoverflows that band, and every label is emptied. A numericheightorwidthfixes it."auto"did not fix it reliably in the harness.The legend is now HTML outside the SVG and adds about 30 px on top of
height. With the usualheight={window.ANYPLOT_SIZE.height}, the chart root is 932 px in the 900 px mount, and the bottom is cropped from the PNG. This happens to the guard snippet too. It still passes because it checks only the PNG size.hexbin-map-geographicrenders under v9 but logs a NaN polygon console error.Harness changes
None. React 19 still ships CommonJS, so the harness's
import React from "react",createRootandReact.createElemententry bundles unchanged.ThemeProvider/createThemefrom@mui/material/styleswork the same in Material 9. The draw check still finds the<svg>, which v9 wraps in an HTML layer container. The setup-node guard snippet (.github/actions/setup-node/action.yml) renders 3200 × 1800 locally.Breaking changes handled in the prompt
prompts/library/muix.md, verified against the installed 9.16.0 types and by rendering test snippets in the harness:ChartsContainerfrom@mui/x-charts/ChartsContainer. In a composed chart the HTML legend goes insideChartsDataProvider+ChartsWrapperand outsideChartsSurface.hideLegendreplacesslotProps.legend.hidden.directiontakeshorizontalorvertical, andposition.horizontaltakesstart,centerorend. Styling goes throughslotProps.legend.sx. A visible top or bottom legend needs about 40 px subtracted fromheight.position: "none". Fonts go throughlabelStyle/tickLabelStyle. Size the axis band with a numericheight(x) orwidth(y) whenever fonts grow.marginis now the space outside the axes.showMarkdefaults tofalse, marks cycle shapes (shape: "circle"keeps them uniform), and the x domain is strict (domainLimit: "nice")..MuiLineChart-areaand.MuiBarChart-element.[data-series="<id>"]sits on line and area paths, and on the series group for bars.idis a string that is unique across the chart.RadarChartis stable.SparkLineCharttakescolor, notcolors.**API level:**line names MUI X Charts 9. The example header lines keep refactor: derive library versions from pins, install from uv.lock #12240's form without a number.Blast radius
The root
package.jsonandpackage-lock.jsonfeed only the pipeline's render step: impl-generate and impl-repair, and daily-regen through them. The agent-network renderer is Python-only and never loads this stack. The site shows the PNGs and HTML already stored in GCS, and those stay untouched until an implementation is regenerated. After a merge, any regeneration or repair of an existing MUI X implementation starts from v7 code that either fails to bundle or renders with the regressions above. New MUI X implementations are generated against the updated prompt.What a regeneration must do
A forced regeneration (
regen_gate=false, Opus with the repair loop) gets the v9 notes fromprompts/library/muix.md. This is the delta to apply to v7 code:ChartsContainerfrom@mui/x-charts/ChartsContainerin place ofChartContainer(the@mui/x-charts/ChartContainerpath and the root export are gone). ReplaceDefaultChartsLegendwithChartsLegend, andlineElementClasseswith the per-chart classes.label, a numeric band:heighton x axes,widthon y axes. Without it the tick labels come out blank.hideLegendinstead ofslotProps.legend.hidden;direction: "horizontal" | "vertical";position.horizontal: "start" | "center" | "end"; styling viaslotProps.legend.sx. Subtract the legend band (about 40 px) fromheightwhen a legend shows above or below the chart.sxselectors on removed classes (.MuiAreaElement-*,.MuiLineElement-*,.MuiMarkElement-series-*,.MuiBarElement-root, …) to.MuiLineChart-area,.MuiLineChart-line,.MuiLineChart-markor.MuiBarChart-element, plus[data-series="<id>"]for one series.topAxis/leftAxis/bottomAxis/rightAxisprops, includingleftAxis={null}, withpositionin the axis config ("none"hides it). ReplacetickFontSize/labelFontSizewithtickLabelStyle/labelStyle.showMark: truewhere dots are wanted andshape: "circle"for uniform dots. SetdomainLimit: "nice"on the x axis where the old padded domain mattered.0…tick labels.Regeneration candidates
The per-spec classification is in
/tmp/claude-1000/-home-meake-projects-anyplot/cd03bb60-b280-4230-bfe2-83fcd57e888f/scratchpad/bump-muix/muix-9-per-spec.csvon the machine that ran the comparison. It has one row per spec: result, failure class, pixel fraction per theme, whether an axis is blank, and flags for each ignored v7 usage.All 323 MUI X implementations were written against v7. In priority order:
164 specs that fail to bundle
alluvial-basic,alluvial-opinion-flow,arc-basic,bar-3d-categorical,bar-error,bar-pareto,bar-permutation-importance,bifurcation-basic,biplot-pca,box-basic,box-grouped,box-horizontal,box-notched,boxen-basic,bubble-basic,bubble-packed,calibration-beer-lambert,campbell-basic,candlestick-basic,candlestick-volume,cat-box-strip,chernoff-basic,chessboard-basic,chord-basic,circlepacking-basic,circos-basic,climograph-walter-lieth,coefficient-confidence,column-stratigraphic,contour-filled,contour-map-geographic,curve-dose-response,datamatrix-basic,dendrogram-basic,dendrogram-radial,diagnostic-regression-panel,dot-matrix-proportional,dumbbell-basic,energy-level-atomic,errorbar-asymmetric,errorbar-basic,facet-grid,feynman-basic,flamegraph-basic,flowmap-origin-destination,forest-basic,frontier-efficient,funnel-basic,genome-track-multi,heatmap-annotated,heatmap-basic,heatmap-chromagram,heatmap-clustered,heatmap-cohort-retention,heatmap-loss-triangle,heatmap-mandelbrot,heatmap-periodic-table,heatmap-polar,heatmap-risk-matrix,histogram-capability,histogram-density,histogram-epidemic,histogram-kde,histogram-returns-distribution,hive-basic,horizon-basic,icicle-basic,indicator-ichimoku,indicator-macd,indicator-rsi,lightcurve-transit,line-3d-trajectory,line-growth-percentile,line-reaction-coordinate,line-styled,line-tanabe-sugano,line-training-load-pmc,logistic-regression,lollipop-basic,lollipop-grouped,ma-differential-expression,map-connection-lines,map-marker-clustered,map-projections,map-route-path,marimekko-basic,mohr-circle,network-basic,network-bipartite,network-directed,network-force-directed,network-hierarchical,network-transport-static,network-weighted,ohlc-bar,parallel-basic,parallel-categories-basic,parliament-basic,phase-diagram,piano-roll-midi,pie-basic,point-and-figure-basic,point-basic,polar-bar,polar-basic,polar-line,polar-scatter,probability-weibull,qq-basic,qrcode-basic,quiver-basic,radar-basic,radar-innovation-timeline,radar-multi,raincloud-basic,recurrence-basic,renko-basic,ridgeline-basic,rug-basic,sankey-basic,scatter-3d,scatter-ashby-material,scatter-basic,scatter-complex-plane,scatter-embedding,scatter-lag,scatter-pitch-events,scatter-regression-linear,scatter-regression-lowess,scatter-regression-polynomial,scatter-shot-chart,sequence-logo-basic,skewt-logp-atmospheric,smith-chart-basic,sn-curve-basic,spc-xbar-r,spectrogram-basic,spectrogram-mel,spiral-timeseries,star-chart-constellation,stem-basic,stereonet-equal-area,streamline-basic,strip-basic,surface-basic,swarm-basic,ternary-basic,ternary-density,tree-decision,tree-phylogenetic,treemap-basic,venn-basic,venn-labeled-items,violin-basic,violin-box,violin-grouped-swarm,violin-split,violin-swarm,voronoi-basic,waffle-basic,waterfall-basic,windbarb-basic,windrose-basic,wireframe-3d-basic67 rendered specs with an axis whose tick labels are all blank
area-basic,area-cumulative-flow,area-elevation-profile,audiogram-clinical,band-basic,bar-diverging,bar-diverging-likert,bar-feature-importance,barcode-ean13,bland-altman-basic,bubble-map-geographic,bump-basic,chessboard-pieces,confusion-matrix,contour-3d,contour-basic,contour-decision-boundary,contour-density,density-basic,density-rug,ecdf-basic,elbow-curve,funnel-meta-analysis,gain-curve,heatmap-geographic,heatmap-rainflow,hexbin-basic,histogram-2d,histogram-cumulative,histogram-stepwise,indicator-bollinger,indicator-ema,indicator-sma,learning-curve-basic,line-annotated-events,line-arrhenius,line-basic,line-confidence,line-multi,line-pca-variance-cumulative,line-stepwise,line-stock-comparison,line-stress-strain,line-timeseries-rolling,pdp-basic,phase-diagram-pt,psychrometric-basic,pyramid-basic,range-interval,residual-plot,roc-curve,root-locus-basic,scatter-categorical,scatter-color-mapped,scatter-connected-temporal,scatter-constellation-diagram,scatter-hr-diagram,scatter-map-geographic,shap-summary,silhouette-basic,span-basic,spectrum-basic,spectrum-nmr,spirometry-flow-volume,step-basic,titration-curve,waveform-audioReviews
showMark: trueis needed for dots, and namesDefaultChartsLegendamong the removed imports. Two are skipped. The guard snippet's legend overflow doesn't matter because the guard checks only the bundle and PNG size. A selector for all area fills is already covered by the.MuiLineChart-areaclass in the list.Rebased on #12240
The branch is rebased on
mainafter #12240 merged (7a9e411).core/constants.pytakes main's side, because the"version"key no longer exists there.prompts/library/muix.mdtakes main's example header lines, which carry no number, and its**API level:**line now names MUI X Charts 9, whichtests/unit/core/test_version_sources.pychecks against the lock. The branch is then rebased again on the Highcharts bump (#12246, 99010bc).package.jsonandpackage-lock.jsontake main's side, and the four pins are re-applied withnpm install --save-exact. The resulting lock differs from this PR's earlier lock only in main's Highcharts 13.1.1 entry, andnpm ciaccepts it. #12246 also fixed the ready-signal timeout inrender.mjs. MUI X renders are unaffected, because the React entry sets the signal: the guard PNG is byte-identical, and the four pilot specs that render are pixel-identical to the earlier after renders.Plan
N/A
Test plan
[data-series]placement,hideLegend,position: "none", legendsxand the axis truncation fix.uv run ruff check .,ruff format --check,mypy api core,pytest tests/unit tests/integration(12,277 passed), andtools.changelog check.test_version_sources.py,test_constants.pyand the prompt tests (581 passed), ruff, ruff format, mypy and the changelog check.core.library_versionsreads muix 9.16.0, API level 9, and Highcharts 13.1.1 from the lock.