Scopri le novità in ogni release, con dettagli su funzionalità, miglioramenti e problemi risolti.
gen
feb
mar
apr
mag
giu
lug
ago
set
ott
nov
dic
JointJS+ v4.3.313 set 2026
Funzionalità
React-plus
<PaperScroller />
<PaperScroller /> now forwards HTML attributes such as role, tabIndex, aria-*, and data-* to the scroller viewport element, alongside the already supported className and style. The id prop is the exception: it remains the feature id used by usePaperScroller(id) and is never written to the DOM.
Router-avoid
MainThreadProvider
The main-thread provider now fires the processed event (and consequently the RouterService idle event) after every incremental change, not only after a full sync. This matches the behavior of the Web Worker provider.
Correzioni
MVC
Collection
Fixed an issue where a model whose id fell into the client-id namespace (for example 'c12') could be shadowed by another model's auto-generated cid. As a consequence graph.getCell('c12') could return the wrong cell, or a newly added cell could be silently merged away as a duplicate.
Client ids are now stored in a map separate from ids, so the two namespaces can never collide.
UI
Inspector
Fixed an issue where the value of a select option defined as an object ({ content: 'Label', value: 'x' }) was not set correctly on the rendered <option> element, so the selected value could not be read back or matched against the model.
React
<GraphProvider />
Fixed an issue where a layout:update batch that was still pending when a cell was removed could re-create the removed cell's record. This broke undoing a delete, as the resurrected record conflicted with the cell restored by the command manager.
<Paper />
Fixed an issue where links parked with visibility: hidden while waiting for the React content of their endpoint to mount stayed invisible after the content mounted.
React-plus
<Stencil />
Fixed an issue where the stencil drag paper was not shown as a popover, so the dragged clone could be covered by other content of the host page. The clone now renders in the browser top layer, consistent with ui.Stencil.
Router-avoid
RouterService
Fixed a crash where a routeAll() or routeSubgraph() pass that was still queued when start() was called ran after the full sync performed by start(). The late pass reset the engine to the pass's subset while the live graph listener was already attached, and a listener referencing an element the engine no longer held aborted the WASM module irrecoverably. Such a pass now resolves as cancelled instead of running.
JointJS+ v4.3.212 set 2026
Funzionalità
Overview
Introducing @joint/router-avoid
A new open-source package, @joint/router-avoid, brings automatic obstacle-avoiding orthogonal link routing to JointJS. It wraps libavoid - a C++ library for incremental connector routing - compiled to WebAssembly.
Unlike the built-in routers, which compute one link at a time, the avoid router maintains a single incremental engine shared by the whole graph: every element is an obstacle, every link is a connector, and moving an element reroutes only the links affected by it. The package listens to a dia.Graph and writes the computed routes straight onto the links' vertices and anchors. Routing can run on the main thread or in a Web Worker.
Dia
Paper
The guard callback is now consulted for pointerdown events that did not hit a cell view - a press on the blank paper area or on DOM content rendered inside the paper element (an overlay, a popup, a toolbar). Returning true prevents the paper from starting a blank interaction (panning, selection lasso, blank:pointerdown events). Only an explicit veto counts for blank events. The built-in tag-name checks (GUARDED_TAG_NAMES) still apply to cell views only.
Presses on markup nested inside a form control (for example the <span> label inside a <button>, or an <option> inside a <select>) are now treated as presses on the control itself. Previously only the exact event target was tested, so a press on a button's label could start an element drag.
The list of tag names that keep the browser's default action (FORM_CONTROL_TAG_NAMES) is now separate from the list that prevents the default paper interaction (PREVENT_INTERACTION_TAG_NAMES). Both default to TEXTAREA, INPUT, BUTTON, and SELECT. Narrow PREVENT_INTERACTION_TAG_NAMES on a Paper subclass to let a control both be clicked and start a drag - for example, dropping BUTTON makes a button inside a magnet draggable to create a link while it stays clickable.
Routers
RightAngle
The path-finding algorithm of the rightAngle router has been extracted into a standalone utility and duplicated code has been consolidated into helpers. There is no change in routing behavior.
React
<Paper />
Support interactive controls nested inside magnets - Buttons, inputs, and other form controls nested inside a magnet can now be used without the press starting a link drag or an element move. A press on the control is only ever a click.
Account for the arrowhead when a custom link anchor is used - The default anchor connection point of the link routing preset now accounts for the arrowhead length even when the link end defines a custom anchor. Previously the arrowhead of such a link overlapped the target element.
Hooks
Forwarded refs are assigned during the commit phase- Refs forwarded by the @joint/react components are now assigned during React's commit phase rather than during render, so ref callbacks always receive a mounted DOM node.
Other changes
Per-package changelogs - JointJS+ releases are now managed with changesets. Every distributed package carries its own CHANGELOG.md describing the changes in that package. The single CHANGELOG file in the root of the distribution is kept for historical records only.
Correzioni
React
<Paper />
Fix events dispatched at the paper container itself being guarded - Fixed an issue where pointer events whose target was the paper container element itself were treated as events from portaled React content and therefore ignored by the paper.
Fix links connected to other links staying hidden - Fixed an issue where a link connected to another link stayed permanently hidden. The check that waits for the React content of a link's endpoints to mount only looked the endpoint up among elements.
<GraphProvider />
Fix stale cell keys when a single commit swaps ids - Fixed an issue where replacing cells with different ids in a single commit, without changing the number of cells, left subscribers with stale cell keys. Membership changes now notify key-list subscribers, and large-graph rendering no longer defers id updates.
Hooks
Fixed an issue where useCell() threw when the cell it observed was removed from the graph while React was rendering.
useMarkup - tolerate a cell view whose markup has not been rendered yet - Fixed an issue where useMarkup() failed for a cell view whose markup had not been rendered yet, which could happen with synchronous rendering in development.
React-plus
<Stencil />
Fix drag paper styling when rendered as a popover - Fixed the styling of the stencil drag paper now that ui.Stencil renders the dragged clone as a popover in the browser top layer.
JointJS+ v4.3.111 set 2026
Funzionalità
GraphUtils
The ConstructTreeNode, ConstructTreeConfig, ShortestPathOptions, and AdjacencyList types are now exported from the graphUtils namespace, and the ComputedStylesCopyOptions and UseComputedStylesOption types are exported from the format namespace. They were previously referenced by the public type declarations without being importable.
Correzioni
Routers
Fixed an issue where margin, sourceMargin, and targetMargin set to 0 were silently replaced by their defaults (20, or the value of margin). A zero-value margin is now honored, so a link can be routed flush against the element boundary.
The minPathMargin option is no longer clamped to the smaller of itself and the side margin. The value you pass is now used as-is when the router decides whether to route through the gap between two elements or to detour around it.
UI
Stencil
Fixed an issue where the clone dragged out of the stencil could be covered by other content on the host page (for example a sidebar with a higher z-index, or a container that creates its own stacking context).
When no custom container option is set, the drag paper is now promoted to the browser top layer via the Popover API, so no stacking context of the host page can obscure it. A custom container keeps the previous behaviour, since it implies you want the clone positioned (and possibly clipped) inside that container. Browsers without Popover API support fall back to the previous rendering.
Format
Visio
Fixed an issue where SVG filters (for example shadows) generated for imported Visio shapes were defined with filterUnits="userSpaceOnUse" and therefore did not scale with the shape. Filters now use the default objectBoundingBox units, so they are scaled correctly regardless of the shape size.
Shapes
VSM
Fixed the type attribute of the VSMWorkcell and VSMProductionBatchKanban shapes, which was set to 'VSMCustomerSupplier' and 'VSMProductionKanban' respectively. A diagram containing these shapes is now correctly restored from JSON via graph.fromJSON().
Fixed an issue where an ElectronicInformationFlow link whose source and target were at the same position threw an error while rendering.
React
<Paper />
Fixed an issue where changing the drawGrid, drawGridSize, or gridSize props after the paper was created did not redraw the visual grid. Grid options set through the options escape hatch are now picked up as well. The grid is redrawn only when one of these values actually changes, not on unrelated re-renders.
Hooks
Fixed an issue where, under React 18 StrictMode, paper features (such as selection or drag interactions) were registered twice, which caused interactions to fire twice.
Fixed an issue where useCells() kept reporting cells that had been removed from the graph by graph.resetCells().
Other changes
Separate ESM distribution for add-on packages - The @joint/format-visio, @joint/format-bpmn-import, @joint/format-bpmn-export, and @joint/shapes-vsm packages are now distributed as separate ESM files. This prevents bundlers from pulling in a second copy of @joint/core alongside the one used by @joint/plus, which could lead to instanceof checks failing and events not being delivered.
Exports and main configuration for all distributed packages - All distributed JointJS+ packages now declare exports and main fields in their package.json, so that both ESM and CommonJS consumers resolve the correct entry points and type declarations.
JointJS+ v4.3.09 lug 2026
Funzionalità
Introduced JointJS for React - JointJS for React is an idiomatic React API built on the JointJS engine - not a wrapper around the existing API. Components and hooks map the diagram lifecycle onto React's, so you manage graphs, papers, and elements with the same rendering and state patterns you already use across your app, with the full power of the core library behind it.
Dedicated repository for JointJS demos - A dedicated repository has been created for JointJS demos, which can be found at clientIO/joint-demos. This repository contains a collection of example projects that demonstrate various use cases and integrations of JointJS, including Angular, React, and other frameworks. The demos are organized into separate folders for easy navigation and exploration. You can easily browse and scaffold these demo projects using the new @joint/cli command-line tool, which allows you to quickly set up a demo project without cloning the entire repository.
SVG export - The toSVG() function has gained two new options for producing self-contained exports. Both options are forwarded through toDataURL() for raster exports:
useComputedStyles: 'full' - Copies the entire computed style of every element onto the exported SVG clone as inline styles, including ::before / ::after pseudo-elements. The previous behavior (diffing against browser defaults) is now called 'minimal' and remains the default.
embedFonts - Fetches all font-face URLs referenced by the paper and embeds them as base-64 data URIs, making the exported file fully self-contained when viewed outside the browser.
HTML elements support for magnets and highlighters - Introduced a new feature that allows HTML elements to be used as magnets and highlighters. This means that you can now use HTML elements as magnets for links, and also use them with highlighters. This opens up new possibilities for creating more interactive and visually appealing diagrams using HTML instead of SVG.
Packaging and developer tooling - Improved the packaging and developer tooling to make it easier to use JointJS+ in modern web development environments:
Tree-shaking - @joint/core and @joint/plus now include ES module entry points and sideEffects configuration, enabling bundlers to eliminate unused exports.
@joint/cli - A new command-line tool for browsing and scaffolding JointJS demo projects from the clientIO/joint-demos repository without cloning the entire repo.
Apps
Angular components in JointJS elements - You can now integrate JointJS with Angular using custom element views that render Angular components inside the views.
Genogram - A genogram is an extended family tree diagram used in medicine, psychology, and social work. Beyond basic lineage, genograms encode additional information through standardized symbols - males as rectangles, females as ellipses, deceased persons marked with an X, and adopted persons shown with brackets. JointJS can be used with the @joint/layout-directed-graph package to automatically lay out multi-generational family data.
HTML form ports - Added support for HTML form ports. A form element has a port directly under each of its fields; interface elements (input and output) are lists of items with a port next to each row. All ports belong to a single ports group with an absolute position layout - the port coordinates are measured from the rendered HTML, so they stay aligned with the content regardless of the layout. Values propagate along the mapping links: from the input interface into the form's input fields, through the form's computed fields (filled dynamically from the input fields), and on to the output interface.
Microservice architecture - Added the ability to model microservices with services, databases, and groups organized into containers, with links that intelligently route between groups.
Format
SVG
format.SVG – Added a new 'full' mode for useComputedStyles with pseudo-element capture and embedFonts support.
The toSVG() function now accepts useComputedStyles: 'full' (or a ComputedStylesCopyOptions object) to copy the entire computed style of every element in the paper - including ::before and ::after pseudo-elements - directly onto the exported SVG clone as inline styles.
The previous default behavior (diffing against browser defaults, now called 'minimal') is unchanged for callers that pass true or omit the option.
A new embedFonts boolean option fetches all font-face URLs used by the paper and embeds them as base-64 data URIs in the exported SVG, making the file fully self-contained when viewed outside the browser.
Both options are also forwarded through toDataURL() for raster exports.
UI
Navigator
The Navigator now tracks its own DOM size via ResizeObserver and automatically recomputes the content ratio whenever the element is resized by CSS (calc(), flex, %, etc.). Previously the Navigator only recalculated on graph events, so CSS-driven resizes were ignored.
A new protected method getInnerSize() returns the inner pixel dimensions of the navigator element - the outer DOM size minus the uniform padding option - and stays accurate across CSS-driven resizes.
The width and height options now accept string values (e.g. CSS units) in addition to numbers.
Selection
Several new features which mimic Halo overlay handles have been added to Selection handles:
Handle groups (options.groups): handles can now be organized into named position groups (e.g. 'top', 'bottom', 'left', 'right'). Each group renders its handles using a CSS grid layout. Built-in position groups matching the default handle positions are provided by default. To enable default groups provide options.groups = {}.
getHandle(name): retrieves a handle descriptor by name, making it easier to inspect or modify individual handles after initialization.
hideOnDrag: when set on a handle, the handle is hidden during drag operations.
className: an optional extra CSS class can be added to individual handle elements.
Handle data: arbitrary data can be attached to handles and read back via the existing handle event context.
SelectionWrapper now declares a DEFAULT_VISIBILITY class property (default: true) that controls whether the selection wrapper is shown by default when a selection exists. Previously the fallback value was hardcoded to true inside shouldBeVisible(). It can now be overridden by a subclass to change the default without replacing the full method.
Snaplines
The filter callback option now receives the elementView being dragged as its second argument.
Previously the callback only received the candidate snap target (targetElement), making it impossible to apply per-dragged-element filtering logic (e.g. hiding snap guides when dragging specific element types). The dragging elementView is now passed so filters can make decisions based on both the candidate and the dragging element.
Stencil
Two new overridable class properties have been added to Stencil. Both default to dia.Paper. Extending Stencil and overriding these properties allows you to substitute a custom Paper subclass - for example, a React-aware paper - without overriding the full stencil rendering logic:
PAPER_GROUP_CONSTRUCTOR - the constructor used when creating the internal dia.Paper for each stencil group (and for the single ungrouped paper).
PAPER_DRAG_CONSTRUCTOR - the constructor used when creating the transient drag paper.
The defaultCellNamespace getter now calls paper.model.getCellNamespace() instead of reading the internal layerCollection.cellNamespace property directly, making it compatible with new getCellNamespace() implementations.
Layout
TreeLayout - Added support for nested property paths in attributeNames.
The attributeNames option of TreeLayout now resolves values with element.prop() instead of element.get().
This means attributes like offset, margin, prevSiblingGap, nextSiblingGap, siblingRank, firstChildGap, and layout can now be stored at nested paths (e.g. 'custom/layout') rather than only at top-level model attributes.
StackLayout - Added support for nested attribute paths for stackIndex properties.
StackLayout now uses element.prop() and element.prop(path, value) instead of element.get() / element.set() when reading and writing the stackIndexAttributeName and stackElementIndexAttributeName attributes.
Nested paths (e.g. 'stack/index') are now supported for both properties.
Dia
Paper
originX / originY options for getFitToContentArea() - Two new options - originX and originY - can be passed to paper.getFitToContentArea() to shift the grid anchor to a specific paper-local coordinate before the fit rectangle is computed. The returned Rect is translated back into absolute coordinates so callers receive a result consistent with the rest of the paper coordinate system. When omitted, both default to 0, reproducing the previous behavior exactly.
Typed EventMap for IDE autocomplete on on() calls - New exported types dia.Paper.EventMap and dia.Graph.EventMap map every built-in event name to its handler signature. paper.on(...) and graph.on(...) now produce IDE autocomplete suggestions and compile-time checks on event names and callback arguments. Untyped string calls continue to compile unchanged via a fallback overload.
New getCellView() method for strict view lookup - A new paper.getCellView(cell) method returns the CellView instance for a cell only if it has already been instantiated. Unlike paper.findViewByModel(), it does not resolve placeholder views and does not schedule any rendering updates - making it safe to call from pointer-event handlers or during virtual rendering. Returns null if no real view exists for the cell (e.g. the cell is outside the virtual rendering viewport or has not been rendered yet).
setDragging() and isDragging() for drag-state access
Two new public methods expose the paper's internal drag state:
paper.isDragging(evt) - returns true if the paper is currently tracking a pointer drag for the given event.
paper.setDragging(evt) - marks the active pointer event as a confirmed drag. Called internally by ElementView, LinkView, and CellView as soon as a drag action is confirmed (element move, link move, label drag, arrowhead drag, new-link creation from a magnet).
These are primarily for plugin and tool authors who manage pointer capture outside the paper's built-in event pipeline.
auto-emit 'resize' event on CSS-driven size changes
dia.Paper now attaches a ResizeObserver to its host element on render() and automatically emits the 'resize' event whenever the host container's dimensions change due to external CSS - flex, percentage units, viewport units, media queries, etc.
Previously the 'resize' event only fired when paper.setDimensions() was called explicitly. Existing 'resize' handlers that call fitToContent() or similar will now fire on CSS-driven resizes as well. The observer is torn down on paper.remove().
The event payload includes a { source: 'observer' } option flag that distinguishes auto-resize events from explicit setDimensions() calls.
elementView / linkView receive nsView as second argument - A new type dia.Paper.CellViewCallback<V> captures the factory function signature used by paper.options.elementView and paper.options.linkView. The callback now receives (model, nsView) - where nsView is the namespace-resolved view class - instead of only (model). Existing callbacks that declare only one argument still compile (extra arguments are ignored in TypeScript).
GridLayerView
Read built-in patterns from the paper constructor's static field - GridLayerView now reads its built-in pattern definitions from paper.constructor.gridPatterns (the actual constructor of the paper instance) rather than a hardcoded module-level reference. A Paper subclass that defines static gridPatterns = { .. } will have those patterns automatically picked up by the grid renderer without any monkey-patching.
CellView
getNodeBoundingRect() and new computeNodeBoundingRect() support HTML elements
cellView.getNodeBoundingRect(node) now correctly handles HTML elements in addition to SVG elements. For non-SVG nodes it falls back to getBoundingClientRect() and converts to local paper coordinates via paper.clientToLocalRect().
A new protected method computeNodeBoundingRect(node) provides this behavior and can be overridden in subclasses to customize bounding-rect computation for specific nodes. Passing an HTML node that is not visible or not attached to the document logs a warning and returns an empty Rect.
Four new methods make the cell namespace a stable, first-class part of the Graph API:
graph.getCellNamespace() - returns the namespace object used to resolve cell type strings. Previously accessible only via graph.options.cellNamespace directly.
graph.setCellNamespace(namespace) - replaces the namespace and invalidates the type-defaults cache.
graph.getTypeConstructor(type) - resolves a dotted type string (e.g. 'standard.Rectangle') to its constructor using the namespace. Returns null if not found.
graph.getTypeDefaults(type) - returns a frozen object of default attributes for the given type, cached per graph instance.
CellCollection.cellNamespace is now a read-only getter and is deprecated - use graph.getCellNamespace() and graph.setCellNamespace() instead.
Typed EventMap for IDE autocomplete on on() calls - New exported types dia.Graph.EventMap map every built-in event name to its handler signature. graph.on(...) now produces IDE autocomplete suggestions and compile-time checks on event names and callback arguments. Untyped string calls continue to compile unchanged via a fallback overload.
Added port and magnet options to getConnectedLinks() - Restrict the links returned by graph.getConnectedLinks(cell, options) to only those connected to a specific port or magnet.
Cell
Predicate form for toJSON({ ignoreEmptyAttributes })
The ignoreEmptyAttributes option of cell.toJSON() now accepts a predicate function in addition to true/false.
The predicate receives the attribute key name and its full path array. It is applied in a bottom-up walk, so a parent object emptied by child removal becomes a candidate in the same pass.
Two new TypeScript types replace the overloaded GenericAttributes alias:
dia.Cell.JSON - the serialized form returned by cell.toJSON(). Includes a required id and type.
dia.Cell.JSONInit - the initialization form passed to constructors and graph.fromJSON(). id is optional.
dia.Cell.GenericAttributes (and the matching Element.GenericAttributes / Link.GenericAttributes) remain exported for backwards compatibility but are now marked @deprecated. Use dia.Cell.Attributes, dia.Cell.JSON, or dia.Cell.JSONInit depending on context.
Anchors
midSide
Added new direction modes for axis-locked link exits
The midSide anchor now accepts four additional mode values for pinning link exits to a specific axis:
'top-bottom' - source exits from the top, target enters from the bottom.
'bottom-top' - source exits from the bottom, target enters from the top.
'left-right' - source exits from the left, target enters from the right.
'right-left' - source exits from the right, target enters from the left.
These directional modes ignore the relative positions of the elements entirely. The existing 'auto', 'horizontal', 'vertical', 'prefer-horizontal', and 'prefer-vertical' values are unchanged.
Highlighters
Added HTML element support in mask highlighter - When a highlighter is applied to an HTML element (e.g. a foreignObject child), the mask highlighter now returns a Rect in paper coordinates that bounds the HTML element's getBoundingClientRect() instead of returning an empty rectangle.
Routers
rightAngle
Added new minPathMargin, sourceMargin, and targetMargin options - Three new routing options give finer control over clearance margins:
sourceMargin / targetMargin - independent per-side margin overrides. When set, each side uses its own value instead of the global margin.
minPathMargin - a cap applied only to the overlap-detection step. When the gap between source and target margin areas is smaller than minPathMargin, the router routes through rather than detouring. This prevents unnecessary zig-zag detours when two elements are placed close together. Set to 0 to restore the previous behavior where all margin overlaps still trigger a detour.
MVC
View
Added classNamePrefix instance property to override the joint- CSS class prefix.
A new classNamePrefix instance property on mvc.View controls the CSS class prefix applied to JointJS view elements. It defaults to 'joint-', preserving existing behavior.
Any existing CSS selectors using joint-* class names must be updated if you change the prefix.
Config
Added a new storeEmbeds option to suppress embeds attribute - A new config.storeEmbeds boolean (default true) controls whether the embeds attribute is still written to parent cells for backwards compatibility. When set to false, embeds is never written - the hierarchy is maintained entirely via the parent attribute and GraphHierarchyIndex, and change:embeds events are suppressed.
Other changes
Layout CSS properties moved to inline JS style objects
The layout-critical CSS properties (position, pointer-events, touch-action, user-select) previously declared in the package CSS files for FreeTransform, Halo, Navigator, and Selection have been moved to inline JS style objects on the respective views.
These properties are no longer applied via CSS class selectors, which means external CSS overrides targeting these specific properties on the component root element will no longer take effect. Functional overrides (colors, borders, fonts, sizes, z-index) remain in CSS and are unaffected.
Correzioni
Visio
Fixed two issues in the B-spline curve renderer used when importing Visio diagrams:
Floating-point accumulation: the loop stepping (t += step) could overshoot 1.0 due to floating-point rounding, silently dropping the curve's endpoint. The loop now uses integer steps (i / steps) to guarantee the endpoint is always included.
Rounding during control-point derivation: intermediate coordinates were rounded before being passed to the Bézier fitting algorithm, which compounded the error. Rounding is now deferred to the final SVG output.
Fixed an off-by-one error in the geometry-section curve deduplication logic. When removing a duplicate trailing segment, the wrong segment index was used, leaving the duplicate in place instead of removing it.
UI
Selection
Fixed an issue where the Selection constructor wasn't calling the static getDefaultHandle() method during initialization, preventing subclasses from overriding the default handle definitions.
Halo
Fixed an issue where the Halo constructor wasn't calling the static getDefaultHandle() method during initialization, preventing subclasses from overriding the default handle definitions.
FreeTransform
Fixed a visual flicker that occurred when the paper's transform changed (e.g. during zoom) while a FreeTransform widget was active. The widget now synchronously updates its position when the paper transform changes, eliminating the one-frame delay.
PaperScroller
Fixed an issue where starting a blank-drag pan could trigger native browser text or element selection.
In Firefox in particular, this selection would autoscroll the container when the pointer approached a scrollbar or the edge of the viewport, causing the paper to drift in the opposite direction to the user's pan gesture. The fix temporarily sets user-select: none on the scroller element for the duration of the pan and restores the previous value when panning ends.
Dia
Paper
Fixed an issue where a cell view's pending update flags were silently discarded if the cell became hidden (via cellVisibility) while the paper was processing a batch of view updates. If the cell was later made visible again its view would appear stale, not reflecting changes that accumulated while it was hidden. Applies when viewManagement.disposeHidden is false (the default).
Routers
rightAngle
Fixed a routing issue where the bounding-box union used to compute clearance gaps around source and target elements did not include the link's anchor points. When an anchor was offset outside an element's bounding box (e.g. via a custom anchor), the router could produce paths that passed through the anchor area. Anchor points are now included in the union.
Vectorizer
Fixed an error in getRelativeTransformation() when the browser returns a singular (non-invertible) screen CTM for an SVG element - for example, when the element is hidden via display: none or has a zero-area transform. The function now checks whether the matrix is invertible before calling matrix.inverse() and returns null in those cases, consistent with how it already handled a missing CTM.
JointJS+ v4.2.41 lug 2026
Correzioni
Util
Fixed a security issue where merge(), omit(), pick(), and assign() utility functions could be exploited via prototype pollution attacks (e.g. by passing an object with a __proto__ key). All four functions now guard against attempts to overwrite properties on Object.prototype.
JointJS+ v4.2.330 giu 2026
Correzioni
Dia - Paper
Fixed an issue where removing an element from the graph during a pointer event (e.g. inside a pointerdown or pointermove handler) could cause an error or leave the paper in an inconsistent state.
Dia - Graph
Fixed an inconsistency where options passed to batch operations were not forwarded to the batch:start and batch:stop events in all code paths.
Dia - CommandManager
Fixed an edge case where undoing a batch that contained both an add and a change command for the same cell would throw an error.
MVC - Model
Fixed an issue where the changeId event was fired even when the new ID was identical to the previous one. The event is now only triggered when the ID value genuinely changes.
Vectorizer
Fixed an issue where getTransformToElement() returned an incorrect transform matrix when the target node was contained inside a nested <svg> element rather than at the top-level SVG document.
UI - Halo
Fixed an issue where the Halo was using its own simplified logic to resolve a link end from a magnet element, ignoring the joint-selector attribute set by the element view.
Fixed an issue where Halo handle icons were set as unquoted url(...) values in the CSS background-image property.
UI - Selection
Fixed the unquoted URL issue in the Selection component. Handle icons set via the icon option are now rendered with a properly quoted url("...") value.
JointJS+ v4.2.223 gen 2026
Funzionalità
AI Agent
Improved the AI Agent source code and refreshed its styling.
Marketing Automation
Created a new Marketing Automation application template that allows users to design and interactively visualize marketing automation workflows.
The application uses the ELK automatic layout to automatically arrange elements and route links orthogonally, and the diagram is fully animated (including transition between states and addition of new nodes).
You can click the "Test flow" button to run a simulation of the marketing automation workflow.
Workflow Builder
Created a new Workflow Builder application template that allows users to design and interactively visualize workflows. The application features the ELK automatic layout for arranging diagrams with ports.
Correzioni
Dia - Paper
Fixed an edge case where an error could occur if a cell view requests an update of another cell view while being mounted.
Made sure that an async paper with initializeUnmounted: true wakes up from idle state when a new cell is added to the graph.
Dia - Element
Made sure that getPortBBox() returns a valid bounding box even when the port has no size defined.
The default is now a size of { width: 0, height: 0 } when the port size is not set.
Layout - DirectedGraph
Fixed an issue where the clusterPadding option of the layout() method did not accept a padding object with individual values for top, right, bottom, and left.
Selezione prodotto
Guida alle funzionalità
Competenza nelle licenze
Fornitore ufficiale
Servizio clienti 24/5
Fidato dal 1995
Contattaci
Chiamaci
Il nostro team è disponibile dal lunedì al venerdì, dalle 9:00 alle 17:00