CanvasXpress Changelog

User-facing release notes — Added, Changed, Fixed, Deprecated, Removed, Breaking — newest first.

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 form MAJOR.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 (npm canvasxpress, CRAN canvasXpress, PyPI canvasxpress) 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.0 on 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 MAJOR boundary, with the migration path documented here before release.

[67.7]

Added

  • Notebook, app and publishing integrations, all taking the same {data, config} spec as new CanvasXpress({...}): canvasxpress-anywidget (Jupyter, JupyterLab, Colab, marimo, VS Code), the %%cxplot IPython 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 in canvasxpress-js); and CanvasXpressBio (cxplot() for SummarizedExperiment), 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 existing require(). The package gains a module field and an exports map (import → a small ESM shim, require → the UMD bundle, plus ./style for 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-live status 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 (Tab to 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; Esc clears it. Honors the existing disableKeys/disableArrowKeys flags.
  • 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 on Enter/Space, and menus close on Esc.
  • Visible focus & reduced motion (WCAG 2.4.7, 2.3.3): keyboard focus now shows a clear :focus-visible outline 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 a schemaVersion (starting 1.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) and CanvasXpress.specsEqual(a, b) — a pure structural diff of two serialized figures (added/removed/changed paths; schemaVersion ignored by default). Powers the forthcoming round-trip guarantee and doubles as a reviewer/git figure-diff tool.
  • CanvasXpress.provenanceHash(figure) and canonicalJSON(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 / .zip archives 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

  • OptionsWall graph 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. Adds optionsWallPutMin/Max, optionsWallCallMin/Max, and optionsWallCenterSpot.
  • 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; isDataFiltered no 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

  • isGGMatrix is 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.