Release 0.23.0 ยท maxGraph/maxGraph

Version 0.23.0 released on 2026-03-30.

โšก This new version improves modularity, fixes important memory leaks, and adds utilities for better configuration management. โšก

Breaking changes

Tooltip API moved to TooltipHandler

The tooltip-related methods have been moved from AbstractGraph to the TooltipHandler plugin.

This change improves modularity and tree-shaking, and clarifies responsibilities by removing tooltip logic from the core graph.

  • getTooltip
  • getTooltipForCell

are no longer available on AbstractGraph.

Note

Moving these methods out of AbstractGraph means they are no longer included in the bundle unless TooltipHandler is used. This reduces the minified bundle size by about -0.7 kB.

Important

If you were overriding these methods in a subclass of AbstractGraph, you must now extend TooltipHandler instead.

This change mainly impacts advanced usages where tooltips are customized.

Note

See PR #640 for full details and migration examples.

xmlUtils.getViewXml moved

The function xmlUtils.getViewXml has been moved to xmlViewUtils.getViewXml.

This change helps clarify responsibilities around XML view utilities and prepares for better modularization.

Note

The impact should be very limited, as this function was not widely used. It was mainly used internally in the Editor class.

If you were using this function, you only need to update the import path.

Highlights

Reset functions for global configurations

New helper functions are available to reset global configuration objects:

  • resetGlobalConfig()
  • resetStencilShapeConfig()

These functions restore default values, including internal instances like NoOpLogger and NoOpI18n.

They are especially useful for:

  • testing scenarios
  • Storybook environments
  • applications that need to isolate configuration state between runs

Note

See PR #979 for more details.

Fix memory leaks in destroy methods

This release includes an important fix for memory leaks during graph destruction.

Some resources were not properly released, especially in plugins like PanningManager, but the issue was more general.

This update:

  • standardizes destruction flows across components
  • ensures base class cleanup is always executed
  • stops active timers and processes
  • removes event listeners (panning, gestures, etc.)

Important

If you use maxGraph in UI frameworks (React, Angular, etc.), make sure to call graph.destroy() when your component unmounts.

This fix makes teardown more reliable and prevents hidden memory issues in long-running applications.

Note

Initially reported in #994 and fixed in PR #1023.

Resources

What's Changed

๐ŸŽ‰ New Features

  • feat(config): add reset functions for global configurations by @tbouffard in #979

๐Ÿ› Bug Fixes

๐Ÿ“ Documentation

  • docs(HiearchicalLayout): fix copy pasted JSDoc for cache attributes by @le-codeur-rapide in #975
  • docs: improve library presentation in README and website by @tbouffard in #1006
  • docs: improve JSDoc of UndoManager by @tbouffard in #1007
  • docs: fix JSDoc refs pointing to CellRenderer instead of ShapeRegistry by @tbouffard in #1010
  • docs: fix orthogonal projection description and add cross-links by @redfish4ktc in #1030

โš™๏ธ Refactor

  • refactor!: move tooltip methods to TooltipHandler by @tbouffard in #640
  • refactor: introduce internal log() shortcut function by @tbouffard in #974
  • refactor(stories): migrate HelloWorld story to TypeScript by @tbouffard in #984
  • refactor: use singular and kebab-case for source folder names by @tbouffard in #985
  • refactor: simplify the implementation of isNullish by @tbouffard in #989
  • refactor!: move getViewXml from xmlUtils to xmlViewUtils by @tbouffard in #992
  • refactor: use parseXml instead of direct call to DOMParser by @tbouffard in #991
  • refactor(typescript): fix SonarQube issues on extensible string types by @tbouffard in #1009
  • refactor(typescript): introduce the Constructor utility type by @tbouffard in #1011
  • fix: parse HTML instead of XML in SvgCanvas2D.convertHtml by @tbouffard in #1012
  • refactor: improve type guard for domUtils.isNode by @tbouffard in #1000

๐Ÿ›  Chore

  • chore(deps-dev): bump storybook from 9.1.1 to 10.1.0 by @tbouffard in #981
  • chore: add storybook patterns to dependabot configuration by @tbouffard in #987
  • ci: ensure that all workflows define permissions of the GITHUB_TOKEN by @tbouffard in #990
  • ci: attach examples and website assets to GitHub releases by @tbouffard in #996
  • chore: improve Claude Code configuration by @redfish4ktc in #1029

New Contributors

Full Changelog: v0.22.0...v0.23.0