All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Event handlers now run with live
chartandechartsin scope — callchart.convertFromPixel(...),chart.dispatchAction(...),echarts.format.addCommas(...), etc. directly inside aneventshandler - New
zr:prefix binds a handler to ZRender / canvas-wide events (e.g.zr:click,zr:mousemove), including clicks on the blank canvas, not just on series - Both
eventsvalues andJsCode(...)now accept astr | Pathpointing at a.js/.mjsfile on_selectaccepts a callable that fires when the selection changes- Double-clicking the blank canvas clears the current point selection
just bump X.Y.Zrecipe — syncs the version across the root and innerpyproject.toml,uv.lock, and the frontendpackage.json/package-lock.jsonin one guarded step
- Event handlers that return
undefinedskip the Streamlit rerun (client-only interaction); any other return value — includingnull— is sent back to Python asresult.chart_event publish-testnow readsUV_PUBLISH_TOKEN_TEST- Demo app reorganized into dedicated
on_selectandeventspages, with examples for file-loaded handlers,convertFromPixel,dispatchAction,echarts.format.addCommas,zr:click/zr:mousemove, and editable scatter points
- Content-hash custom theme names so multiple charts on one page no longer collide on theme registration
- Serialize tuples correctly, including tuples that embed
JsCode - Preserve x/y coordinates for object-form selection points whose
valueis an array - Clear the brush/toolbox UI properly when brush selection is disabled or switched to points-only
- Use
echarts.color.modifyAlphafor the Streamlit "subtle" theme color instead of string-appending"33" - Single-quote SVG export font names to avoid corrupted output
- Bump ECharts to 6.1.0 and
echarts-glto 2.1.0 - Numerous dependency bumps (postcss, vite, pytest, pillow, gitpython, urllib3, idna, requests, tornado, and more)
justfilewith setup, lint/format, test, e2e, build, and publish recipes- Release pipeline:
tag-releaserecipe + guardedpublish/publish-test merge-dependabotrecipe to batch-merge dependency PRs- Python unit test workflow
- Pin line endings to LF via
.gitattributes - Use
bundlermoduleResolution in tsconfig
- Structured selection support via
on_selectandselection_mode("points"click,"box"rect brush,"lasso"polygon brush), returningresult["selection"] "streamlit"theme (the new default) for automatic light/dark mode support, plus a"dark"themest_pyechartsas an optional dependency extra (streamlit-echarts[pyecharts])replace_mergeparameter foruniversalTransitionsupportJsCodesupports arrow functions, andechartsis injected into the eval scope (enablesLinearGradient, etc.)
- BREAKING: Rewrote the frontend on the native ECharts API (replacing
echarts-for-react) - Dispose and re-init the chart on renderer change; preserve entry animations on mount and theme change
- Reorganized the demo app into a multipage gallery
- BREAKING: Migrated to Streamlit Components v2 API
- BREAKING: Removed
st_pyechartswrapper — usejson.loads(chart.dump_options())+st_echartsinstead - Dropped
pyechartsandsimplejsonas package dependencies (user installs them separately) - Upgraded frontend build toolchain from Create React App to Vite + TypeScript
- Upgraded ECharts from v5 to v6
- Event return values now use
result.chart_eventon the Python side
- In
eventsargument, on event return value is sent back to Python - Internal: we now reference the echarts instance so anyone forking the project is able to call it back for further actions.
- Upgraded to echarts v5!
- Added a
mapargument to register a custom geoJSON map
- Add liquidfill and wordcloud extensions
- Use streamlit-component-lib package
- Extracted demo examples to their own repo
- Initial release of
st_echartsandst_pyecharts