All notable, user-facing changes to CanvasXpress are recorded here, curated for people who depend on the library rather than for the maintainer. It follows the spirit of Keep a Changelog: entries are grouped Added / Changed / Fixed / Deprecated / Removed / Breaking, newest first.
The exhaustive per-commit engineering log lives in the Changes comment block at the top of
build/js/canvasXpress.init.js and is rendered on the site at
https://canvasxpress.org/updates.html. This file is the human-readable summary layered on top
of it.
Versioning & release channels
- Version numbers are
MAJOR.MINOR(e.g.67.4); package registries and release tags carry the three-part formMAJOR.MINOR.0(e.g.67.4.0). Minor releases ship on a bi-weekly or less frequent cadence and are backward-compatible: new chart types, new parameters, and bug fixes. Any change that alters existing default behavior or the public API is called out under Changed or Breaking with a migration note. latest(npmcanvasxpress, CRANcanvasXpress, PyPIcanvasxpress) always points at the newest release and can move on any day.- Pinning for stability: enterprises that need a fixed target should pin an exact version
(e.g.
canvasxpress@67.4.0on npm,version="67.4"on CRAN/PyPI) and upgrade deliberately after reading this file. Nothing changes underneath a pinned version. - Breaking changes are rare and only land on a
MAJORboundary, with the migration path documented here before release.
[67.7]
Added
- Notebook, app and publishing integrations, all taking the same
{data, config}spec asnew CanvasXpress({...}):canvasxpress-anywidget(Jupyter, JupyterLab, Colab, marimo, VS Code), the%%cxplotIPython magic (canvasxpress-magic), Streamlit and Dash components (canvasxpress-streamlit,canvasxpress-dash) on PyPI; the CanvasXpress Notebook Renderer on the VS Code Marketplace; a Quarto shortcode extension (quarto add neuhausi/canvasxpress-quarto); an Observable ES module (hosted incanvasxpress-js); and CanvasXpressBio (cxplot()forSummarizedExperiment), submitted to Bioconductor. - Project documents on canvasxpress.org: governance, support, this changelog and the verbatim license text, plus an expanded integration guide.
Changed
- Release tags are three-part (
67.7.0) on GitHub, matching npm, so CDN mirrors that sort by semver (cdnjs) resolve the latest version correctly.
[67.6]
Added
- ESM entry for the npm package:
import CanvasXpress from "canvasxpress"now works under bundlers (Vite, webpack, esbuild) and Observable, alongside the existingrequire(). The package gains amodulefield and anexportsmap (import→ a small ESM shim,require→ the UMD bundle, plus./stylefor the CSS); CommonJS consumers are unchanged. The library remains browser-only. - Accessibility — screen-reader data table (WCAG 1.1.1): every chart now carries a
visually-hidden, screen-reader-navigable table of its data next to the canvas (linked via
aria-describedby, with proper row/column header scope), so assistive technology can read the underlying values. Offscreen only — no visual change. - Live update announcements (WCAG 4.1.3): a polite
aria-livestatus region announces "Chart updated" with the new summary when a chart's data or configuration changes (silent on first render and on unchanged re-renders). Offscreen only — no visual change. - Keyboard navigation of chart data (WCAG 2.1.1/2.1.2/2.1.4): the chart canvas is now
keyboard-focusable (
Tabto it, then arrow keys /Home/End) to move a roving cursor through the data points. Each point announces "<sample>, <variable>: <value>" and shows a visible focus outline;Escclears it. Honors the existingdisableKeys/disableArrowKeysflags. - Keyboard-operable menus & controls (WCAG 2.1.1/2.1.2): the context menus, toolbar, and
customizer are now reachable and operable by keyboard — every control takes focus (
Tab), activates onEnter/Space, and menus close onEsc. - Visible focus & reduced motion (WCAG 2.4.7, 2.3.3): keyboard focus now shows a clear
:focus-visibleoutline on the chart and its controls, and CanvasXpress honors the operating system's "reduce motion" setting by skipping render transitions. - High-contrast theme (WCAG 1.4.1/1.4.3/1.4.11): a new
theme: "highcontrast"renders black text, axes, borders and guides on a white ground, with pattern line decoration so series can be told apart without relying on color. - Accessibility Conformance Report: a public VPAT-style page documents CanvasXpress's WCAG 2.1 A/AA support criterion by criterion — screen-reader, keyboard, high-contrast, reduced-motion — backed by an automated axe-core gate that runs on every release.
[67.5]
Added
- Spec-as-a-standard groundwork: every serialized figure (
getConfig/ "Save as JSON") and the materialized cxplot snapshots now carry aschemaVersion(starting1.0), so a figure is self-describing and version-aware. Additive — rendering is unchanged, and specs without the field load as the pre-1.0 baseline. CanvasXpress.cxdiff(a, b)andCanvasXpress.specsEqual(a, b)— a pure structural diff of two serialized figures (added/removed/changed paths;schemaVersionignored by default). Powers the forthcoming round-trip guarantee and doubles as a reviewer/git figure-diff tool.CanvasXpress.provenanceHash(figure)andcanonicalJSON(value)— an optional, verifiable fingerprint over a canonicalized figure (stable key order, volatile fields stripped), so a figure embedded in a report or filing can be checked by recomputing the hash.- Published JSON Schemas for the figure and grammar specs, served at
/schema/with a stated compatibility policy — see the new Spec page.
[67.4]
Added
- Load compressed and bundled inputs with no new dependency:
.tar/.tgz/.tar.gz/.gz/.ziparchives that contain supported files, a JSON manifest naming a data entry, or a config+data pair — from a drag-drop or a URL. Archive entries in other formats (svg/png/geojson/gml/gexf/xml/esv) load too. New public IO seams:IO.gunzip,IO.decompress,IO.untar,IO.unzipArchive,IO.resolveArchive.
Fixed
- With multiple charts on one page, a chart's hover tooltip could linger for up to 3s after the pointer moved to another chart (#312). The outgoing chart's info span is now reset when the current chart changes.
[67.3] – [67.0]
Added
OptionsWallgraph type: a price + options-chain composite — candlesticks in the center (CanvasXpress's first candlesticks), put/call flanks each with an IV|premium area curve and volume bars on a shared vertical strike axis, and a dashed spot ruler across all three panels. AddsoptionsWallPutMin/Max,optionsWallCallMin/Max, andoptionsWallCenterSpot.- New
transitionType: 'crossfade'(default remains'morph') for smooth transitions on composite charts whose mark count changes.
Fixed
- R / Shiny stability: Network no longer throws or blanks the canvas during layout (#311);
a node no longer sticks to the cursor after release; a CanvasXpress on a page no longer breaks
other draggable widgets such as
sliderInput;isDataFilteredno longer throws on ESC/reset for non-tabular graphs on dashboards. - HiDPI: a same-size re-render no longer occasionally renders at 2× in the top-left corner (pixel ratio is now set with an absolute transform).
- Violin boxplot wheel-zoom no longer throws when leading violins scroll out of view.
[66.9] – [66.7]
Added
- Native multi-panel matrix (ggmatrix / patchwork): a
{datasets, isGGMatrix|isPatchwork}spec now renders its grid in the core engine with perimeter-only axes and aligned panel bodies — no R wrapper required. Faceted cells and axis titles align per column/row. - Meter/Heatmap selection & broadcast: meter tiles broadcast on click and highlight on hover across all meter types; heatmap cell clicks color the row/column axis labels and outline selected cells, participating in cross-chart broadcast.
Changed
isGGMatrixis now a plain boolean flag instead of an R margin-measurement string (alignment is measured at render time). Old string specs still render.- Overlapping ggplot areas/densities now draw in ggplot factor order (last level on top) on the cxplot path, matching ggplot z-order.
Fixed
- Reused gradient-icon ids no longer render blank when several charts share a page.
- Theme label/title colors (sample/variable) now have a consistent baseline before per-theme overrides, fixing legibility on dark panels.
Older releases (66.6 and earlier, back to the project's origin) are recorded in the engineering
log in build/js/canvasXpress.init.js and at
https://canvasxpress.org/updates.html. As this curated changelog matures, earlier releases
will be summarized here as well.