v19.4 removes the dependency tree under the library: @foblex/platform, @foblex/mediator, @foblex/utils, and @foblex/2d are bundled into @foblex/flow, and the peer dependency list is now @angular/common and @angular/core — nothing else.
There are no breaking changes. ng update @foblex/flow performs the dependency migration automatically.
Zero dependencies
npm install @foblex/flowThe geometry types are first-class API now — IPoint, IRect, ISize, RoundedRect, PointExtensions and the rest of the 2d toolkit are imported from the library itself:
import { FFlowModule, IPoint, PointExtensions } from '@foblex/flow';The mediator and utils re-exports keep migrated code compiling, but are marked @deprecated and leave the public API in v20. The standalone packages stay published on npm.
Also fixed along the way: the ng-update migration entry was missing in earlier releases, so ng update @foblex/flow never ran migrations. It does now — imports of all four packages are rewritten to @foblex/flow and the obsolete dependencies are removed from package.json.
Initial View
The flow can appear already fitted or centered on its first visible frame — no jump from the default viewport. It renders invisibly (layout and measurements still happen), the (fFullRendered) handler sets the viewport up, and the flow is revealed only after the transform is applied.
<f-flow fInitialView (fFullRendered)="loaded()">
<f-canvas> ... </f-canvas>
</f-flow>Provider alternative: provideFFlow(withInitialView()). A bound fInitialView input overrides the provider feature in both directions.
Live demo: https://flow.foblex.com/examples/initial-view
Faster load events
fNodesRendered / fFullRendered no longer wait out a fixed 120ms debounce — they fire as soon as the first render settles, about 120ms earlier for synchronously populated flows. The safety the wall clock silently provided is now explicit: an empty-canvas grace for async-loaded flows, a rerun for render passes that land mid-drag, and layer sorting that skips the DOM when the order is already settled, so grouped graphs stop restarting CSS transitions on every pass.
Fixes
- Reflow-on-resize stays alive after a top/left-handle resize. The resize handler never mirrored the moved position back into the model, so the reflow orchestrator treated the node as mid-flight and silently skipped it forever — the axis/delta-source/runtime-config switches looked broken. The model now syncs on pointer-up, and position-changing resizes emit
fNodePositionChange. - SSR:
*fVirtualForrenders synchronously on the server instead of callingrequestAnimationFrame(#340);<f-minimap>guards its transform subscription for the browser (#341). - Connection intersections: a node dropped over a connection it completely covers now counts as intersecting (
fNodeIntersectedWithConnectionsfires); oversized corner radii are clamped CSS-style instead of producing phantom intersections; the per-pointer-move checks stop re-parsing unchanged geometry. - External items: destroyed
[fExternalItem]directives are removed from the service instead of being re-registered, so routed pages with palettes no longer leak (#335). Thanks @arunraja92. - Diagnostics: a node wrapped by its component's host element warns with the new
FF1012instead of breaking the drag (#337). Thanks @i3ene. - External-item preview stays under the pointer on a scrolled page (#339). Thanks @itaishopen-unyx.
getPositionInFlow()is typed truthfully as returningIPoint— it never returned a rect.
Migration
Nothing breaks. Run:
ng update @foblex/flowManual path: rewrite @foblex/platform / @foblex/mediator / @foblex/utils / @foblex/2d imports to @foblex/flow and drop the four packages. If you use @foblex/flow-dagre-layout or @foblex/flow-elk-layout, update them together with the library — they now require @foblex/flow 19.4 or newer.