Set of schema names the user has filtered IN. Null means "all".
Use DiagramContextMenu.
The same emitter under the old binding name, so a template still binding (diagramContextMenu) keeps working. Must stay AFTER DiagramContextMenu: class fields initialise in order, and the other way round this captures undefined.
Node IDs the user has clicked "+N more fields" on.
Derived — the Set of IDs in the focus/hover neighbourhood (null when no highlight active).
Node currently being hovered (for highlight preview).
Cached layout — recomputed when nodes, filter, search or expansion changes.
Use LayoutComplete.
The same emitter under the old binding name, so a template still binding (layoutComplete) keeps working. Must stay AFTER LayoutComplete: class fields initialise in order, and the other way round this captures undefined.
Use LinkClick.
The same emitter under the old binding name, so a template still binding (linkClick) keeps working. Must stay AFTER LinkClick: class fields initialise in order, and the other way round this captures undefined.
Use LinkContextMenu.
The same emitter under the old binding name, so a template still binding (linkContextMenu) keeps working. Must stay AFTER LinkContextMenu: class fields initialise in order, and the other way round this captures undefined.
Use LinkHover.
The same emitter under the old binding name, so a template still binding (linkHover) keeps working. Must stay AFTER LinkHover: class fields initialise in order, and the other way round this captures undefined.
Use LinkHoverEnd.
The same emitter under the old binding name, so a template still binding (linkHoverEnd) keeps working. Must stay AFTER LinkHoverEnd: class fields initialise in order, and the other way round this captures undefined.
Use NodeClick.
The same emitter under the old binding name, so a template still binding (nodeClick) keeps working. Must stay AFTER NodeClick: class fields initialise in order, and the other way round this captures undefined.
Use NodeContextMenu.
The same emitter under the old binding name, so a template still binding (nodeContextMenu) keeps working. Must stay AFTER NodeContextMenu: class fields initialise in order, and the other way round this captures undefined.
Use NodeDeselected.
The same emitter under the old binding name, so a template still binding (nodeDeselected) keeps working. Must stay AFTER NodeDeselected: class fields initialise in order, and the other way round this captures undefined.
Use NodeDoubleClick.
The same emitter under the old binding name, so a template still binding (nodeDoubleClick) keeps working. Must stay AFTER NodeDoubleClick: class fields initialise in order, and the other way round this captures undefined.
Use NodeDragEnd.
The same emitter under the old binding name, so a template still binding (nodeDragEnd) keeps working. Must stay AFTER NodeDragEnd: class fields initialise in order, and the other way round this captures undefined.
Use NodeDragStart.
The same emitter under the old binding name, so a template still binding (nodeDragStart) keeps working. Must stay AFTER NodeDragStart: class fields initialise in order, and the other way round this captures undefined.
Use NodeHover.
The same emitter under the old binding name, so a template still binding (nodeHover) keeps working. Must stay AFTER NodeHover: class fields initialise in order, and the other way round this captures undefined.
Use NodeHoverEnd.
The same emitter under the old binding name, so a template still binding (nodeHoverEnd) keeps working. Must stay AFTER NodeHoverEnd: class fields initialise in order, and the other way round this captures undefined.
Use NodeSelected.
The same emitter under the old binding name, so a template still binding (nodeSelected) keeps working. Must stay AFTER NodeSelected: class fields initialise in order, and the other way round this captures undefined.
Use RefreshRequested.
The same emitter under the old binding name, so a template still binding (refreshRequested) keeps working. Must stay AFTER RefreshRequested: class fields initialise in order, and the other way round this captures undefined.
ReadonlyrootDerived schema summary for the chip row.
Search query string.
Derived — the single selected entity, if any.
Use StateChange.
The same emitter under the old binding name, so a template still binding (stateChange) keeps working. Must stay AFTER StateChange: class fields initialise in order, and the other way round this captures undefined.
Derived — total entities in the input, before any filtering.
Current pan + zoom.
Derived — number of entities currently visible.
Use ZoomChange.
The same emitter under the old binding name, so a template still binding (zoomChange) keeps working. Must stay AFTER ZoomChange: class fields initialise in order, and the other way round this captures undefined.
Use ActiveLayout.
Use ActiveSchemas.
Use EmptyStateIcon.
Icon for the empty state — honours config.emptyStateIcon when provided.
Use EmptyStateTitle.
Title for the empty state — distinguishes "nothing here" from "filtered to nothing".
Use FocusDepth.
Use FocusNodeId.
Use HeaderTitle.
Use HighlightedNodeIds.
Use HighlightSet.
Use HoverNodeId.
Use IsRefreshing.
Use Layout.
Use Panning.
Use ReadOnly.
Use SchemaChips.
Use SearchQuery.
Use SelectedEntity.
Use SelectedNodeId.
Use ShowEdgeLabels.
Whether to render FK field labels along edges. Defaults to ON in
both layouts — the zoom-gate (>=0.55x) keeps the labels off when
the user is zoomed out far enough to see hundreds of entities, so
"noise on dense views" isn't a real concern. Consumers can still
force off via config.showRelationshipLabels: false.
Use ShowHeader.
Use TotalCount.
Use TrackByBand.
Use TrackByChip.
Use TrackByEdge.
Use TrackByField.
Use TrackByNode.
Use VisibleCount.
Use ZoomPercent.
Zoom percentage string for the toolbar readout.
Use EdgeLabelPosition.
Pick a point along the edge polyline for a label and approximate its width. Returns null for self-loops (no good place to put text). Uses the longest horizontal segment when one exists; falls back to the segment midpoint otherwise.
Path string for an edge — uses the orthogonal polyline from layout.
Use ExportAsSVG.
Use FitToView.
Number of FK fields — handy aggregate (kept for external API parity).
Short friendly row-count string (e.g. 1248 → "1.2k").
Whether a node should appear dimmed (highlight mode active, node not in set).
Whether an edge is part of the active highlight subgraph.
Whether an edge should appear dimmed.
Whether a node is the current focus (strong border).
Whether a node is a 1-hop neighbour of the focus (medium border).
A callback method that is invoked immediately after Angular has completed initialization of a component's view. It is invoked only once when the view is instantiated.
A callback method that is invoked immediately after the default change detector has checked data-bound properties if at least one has changed, and before the view and content children are checked.
The changed properties.
A callback method that performs custom clean-up, invoked immediately before a directive, pipe, or service instance is destroyed.
Mousedown anywhere on the SVG (background OR a node card). We arm a potential pan and attach window-level move/up listeners so the drag continues even if the cursor leaves the canvas (passes over the focus card, scrollbars, the chrome, etc.).
The actual panning = true flip happens in the move handler once
the cursor crosses DRAG_THRESHOLD — that way short clicks still
register as clicks on cards (no accidental selection-toggle from
a tiny mouse jitter).
Use OnClearSearch.
Use OnRequestRefresh.
Number of PK fields — handy aggregate (kept for external API parity).
Use Refresh.
Use ResetZoom.
Switch between the schema-grid and dagre hierarchical layouts at
runtime. Emits a state change so the consumer can persist the
user's preference (via userStateChange on mj-erd-composite).
Also clears the current focus/selection — switching layouts moves cards to entirely new positions, so the previously-selected entity would otherwise stay highlighted in a different spot with the side panel still open, which is jarring. A clean slate is better.
Optional_restorePositions: booleanUse TriggerResize.
Use ZoomIn.
Use ZoomOut.
Optional_padding: numberOptional_scale: number
Active layout algorithm. Starts from
config.layoutAlgorithm(defaultschema-grid) but can be toggled at runtime viasetLayoutAlgorithm. Exposed so the chrome toggle + saved user state can drive it.