@memberjunction/ng-flow-editor 6.2.0-edge.0 → 6.2.0-edge.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"flow-editor.component.js","sourceRoot":"","sources":["../../../src/lib/components/flow-editor.component.ts","../../../src/lib/components/flow-editor.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component, Input, Output, EventEmitter, ViewChild, OnInit, OnDestroy,\n ChangeDetectorRef, ElementRef, ViewEncapsulation, ChangeDetectionStrategy, HostListener\n} from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { FFlowComponent, FCanvasComponent, FZoomDirective, FCreateConnectionEvent,\n FCreateNodeEvent, FSelectionChangeEvent, FCanvasChangeEvent, FMoveNodesEvent,\n FReassignConnectionEvent } from '@foblex/flow';\nimport {\n FlowNode, FlowConnection, FlowNodeTypeConfig, FlowNodeAddedEvent,\n FlowNodeMovedEvent, FlowConnectionCreatedEvent, FlowConnectionReassignedEvent,\n FlowSelectionChangedEvent,\n FlowCanvasClickEvent, FlowPosition, FlowLayoutDirection,\n FlowContextMenuTarget, FlowContextMenuAction, FlowContextMenuItem,\n FlowBeforeContextMenuEventArgs, FlowAfterContextMenuActionEventArgs,\n FlowToolbarAlign, FlowToolbarVisibility,\n} from '../interfaces/flow-types';\nimport { FlowStateService } from '../services/flow-state.service';\nimport { FlowLayoutService } from '../services/flow-layout.service';\nimport { UUIDsEqual, NormalizeUUID } from '@memberjunction/global';\n\n/**\n * Generic, entity-agnostic visual flow editor component.\n * Wraps Foblex Flow to provide a clean MJ-style API.\n *\n * Usage:\n * ```html\n * <mj-flow-editor\n * [Nodes]=\"myNodes\"\n * [Connections]=\"myConnections\"\n * [NodeTypes]=\"myNodeTypes\"\n * (NodeSelected)=\"onNodeSelected($event)\"\n * (ConnectionCreated)=\"onConnectionCreated($event)\">\n * </mj-flow-editor>\n * ```\n */\n@Component({\n standalone: false,\n selector: 'mj-flow-editor',\n templateUrl: './flow-editor.component.html',\n styleUrls: ['./flow-editor.component.css'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.Default,\n providers: [FlowStateService, FlowLayoutService]\n})\nexport class FlowEditorComponent implements OnInit, OnDestroy {\n // ── Inputs ──────────────────────────────────────────────────\n @Input() Nodes: FlowNode[] = [];\n @Input() Connections: FlowConnection[] = [];\n @Input() NodeTypes: FlowNodeTypeConfig[] = [];\n @Input() ReadOnly = false;\n @Input() ShowMinimap = true;\n @Input() ShowPalette = true;\n @Input() ShowGrid = true;\n @Input() ShowStatusBar = true;\n /**\n * Legacy on/off. `false` forces the toolbar fully off (no recover tab). Prefer\n * `ToolbarVisibility` when the host wants shown / minimized / hidden with a way back.\n */\n @Input() ShowToolbar = true;\n /** Full bar, a restore chip, or a recover tab. Ignored when `ShowToolbar` is false. */\n @Input() ToolbarVisibility: FlowToolbarVisibility = 'shown';\n /** Left / center / right along the top of the canvas. */\n @Input() ToolbarAlign: FlowToolbarAlign = 'center';\n @Input() ShowLegend = true;\n @Input() GridSize = 20;\n @Input() AutoLayoutDirection: FlowLayoutDirection = 'vertical';\n /** Background color for connection labels */\n // Design tokens, not literals — the canvas renders on both themes, and a near-white pill on a\n // dark canvas made the least important element the most visually dominant thing on screen.\n @Input() ConnectionLabelBackground = 'var(--mj-bg-surface)';\n /** Border color for connection labels */\n @Input() ConnectionLabelBorderColor = 'var(--mj-border-default)';\n /** Text color for connection labels */\n @Input() ConnectionLabelTextColor = 'var(--mj-text-secondary)';\n\n /** Title for the canvas empty-state overlay — depends on read-only mode. */\n public get EmptyStateTitle(): string {\n return this.ReadOnly\n ? 'No steps defined for this flow'\n : 'Click a step in the palette — or drag one onto the canvas — to start building your flow';\n }\n\n // ── Outputs ─────────────────────────────────────────────────\n @Output() NodeSelected = new EventEmitter<FlowNode | null>();\n @Output() NodeAdded = new EventEmitter<FlowNodeAddedEvent>();\n @Output() NodeRemoved = new EventEmitter<FlowNode>();\n @Output() NodeMoved = new EventEmitter<FlowNodeMovedEvent>();\n @Output() ConnectionCreated = new EventEmitter<FlowConnectionCreatedEvent>();\n @Output() ConnectionRemoved = new EventEmitter<FlowConnection>();\n @Output() ConnectionReassigned = new EventEmitter<FlowConnectionReassignedEvent>();\n @Output() ConnectionSelected = new EventEmitter<FlowConnection | null>();\n @Output() SelectionChanged = new EventEmitter<FlowSelectionChangedEvent>();\n @Output() CanvasClicked = new EventEmitter<FlowCanvasClickEvent>();\n @Output() NodesChanged = new EventEmitter<FlowNode[]>();\n @Output() ConnectionsChanged = new EventEmitter<FlowConnection[]>();\n @Output() NodeEditRequested = new EventEmitter<FlowNode>();\n @Output() ConnectionEditRequested = new EventEmitter<FlowConnection>();\n /** Host may replace `Items` or `Cancel` the menu. Debug attaches here — the canvas stays blind. */\n @Output() BeforeContextMenu = new EventEmitter<FlowBeforeContextMenuEventArgs>();\n @Output() AfterContextMenuAction = new EventEmitter<FlowAfterContextMenuActionEventArgs>();\n @Output() GridToggled = new EventEmitter<boolean>();\n @Output() MinimapToggled = new EventEmitter<boolean>();\n @Output() LegendToggled = new EventEmitter<boolean>();\n /** The person changed shown / minimized / hidden from the canvas chrome. */\n @Output() ToolbarVisibilityChanged = new EventEmitter<FlowToolbarVisibility>();\n\n /** What the template actually paints — `ShowToolbar === false` is a hard hide. */\n public get EffectiveToolbarVisibility(): FlowToolbarVisibility {\n return this.ShowToolbar ? this.ToolbarVisibility : 'hidden';\n }\n\n public SetToolbarVisibility(next: FlowToolbarVisibility): void {\n if (!this.ShowToolbar) return;\n if (this.ToolbarVisibility === next) return;\n this.ToolbarVisibility = next;\n this.ToolbarVisibilityChanged.emit(next);\n }\n\n // ── View Children ───────────────────────────────────────────\n @ViewChild(FFlowComponent) protected fFlow: FFlowComponent | undefined;\n @ViewChild(FCanvasComponent) protected fCanvas: FCanvasComponent | undefined;\n @ViewChild('fZoomRef') protected fZoom: FZoomDirective | undefined;\n @ViewChild('canvasArea') protected canvasArea: ElementRef<HTMLElement> | undefined;\n\n // ── Internal State ──────────────────────────────────────────\n protected zoomLevel = 100;\n protected canvasPosition = { x: 0, y: 0 };\n protected canvasScale = 1;\n /** After the first auto-fit, later fLoaded events must not snap the viewport back. */\n private hasAutoFitted = false;\n /** True once the person zooms or pans — remounts restore this viewport instead of fitting. */\n private viewportOwnedByUser = false;\n private applyingProgrammaticViewport = false;\n protected selectedNodeIDs: string[] = [];\n protected selectedConnectionIDs: string[] = [];\n protected panMode = false;\n\n /** Trigger function for canvas panning — only allows panning in pan mode */\n protected canvasMoveTriggerFn = (_event: MouseEvent | TouchEvent): boolean => {\n return this.panMode;\n };\n\n /* Context menu state */\n protected contextMenuVisible = false;\n protected contextMenuX = 0;\n protected contextMenuY = 0;\n protected contextMenuTargetType: FlowContextMenuTarget = 'node';\n protected contextMenuNode: FlowNode | null = null;\n protected contextMenuConnection: FlowConnection | null = null;\n protected contextMenuItems: FlowContextMenuItem[] = [];\n\n private destroy$ = new Subject<void>();\n private initialized = false;\n private lastConnectionClickTime = 0;\n\n /** How many click-placed nodes are cascaded before the offset wraps back to the viewport centre. */\n private static readonly CLICK_CASCADE_STEPS = 6;\n /** Pixels (canvas units) each cascaded click-placed node is offset by. */\n private static readonly CLICK_CASCADE_OFFSET = 40;\n private clickPlacementIndex = 0;\n\n constructor(\n private cdr: ChangeDetectorRef,\n private stateService: FlowStateService,\n private layoutService: FlowLayoutService\n ) {}\n\n // ── Lifecycle ───────────────────────────────────────────────\n\n ngOnInit(): void {\n this.initialized = true;\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // ── Public Methods ──────────────────────────────────────────\n\n /** Fit all nodes within the viewport */\n ZoomToFit(): void {\n this.applyingProgrammaticViewport = true;\n this.fCanvas?.fitToScreen({ x: 150, y: 150 }, true);\n this.hasAutoFitted = true;\n queueMicrotask(() => { this.applyingProgrammaticViewport = false; });\n }\n\n /** Zoom in one step */\n ZoomIn(): void {\n this.viewportOwnedByUser = true;\n if (this.fZoom) {\n this.fZoom.zoomIn();\n } else {\n const newScale = Math.min(this.canvasScale + 0.15, 3);\n this.fCanvas?.setScale(newScale);\n this.updateZoomLevel(newScale);\n }\n }\n\n /** Zoom out one step */\n ZoomOut(): void {\n this.viewportOwnedByUser = true;\n if (this.fZoom) {\n this.fZoom.zoomOut();\n } else {\n const newScale = Math.max(this.canvasScale - 0.15, 0.1);\n this.fCanvas?.setScale(newScale);\n this.updateZoomLevel(newScale);\n }\n }\n\n /** Run auto-layout using dagre */\n AutoArrange(direction?: FlowLayoutDirection): void {\n const dir = direction ?? this.AutoLayoutDirection;\n this.pushUndoState();\n const result = this.layoutService.CalculateLayout(this.Nodes, this.Connections, dir);\n for (const node of this.Nodes) {\n const newPos = result.Positions.get(node.ID);\n if (newPos) {\n node.Position = { ...newPos };\n }\n }\n this.NodesChanged.emit(this.Nodes);\n this.cdr.detectChanges();\n // Fit to screen after layout\n setTimeout(() => this.ZoomToFit(), 100);\n }\n\n /** Center the canvas on a specific node */\n CenterOnNode(nodeId: string): void {\n this.fCanvas?.centerGroupOrNode(nodeId, true);\n }\n\n /** Programmatically select a node */\n SelectNode(nodeId: string): void {\n this.fFlow?.select([nodeId], []);\n const node = this.Nodes.find(n => UUIDsEqual(n.ID, nodeId)) ?? null;\n this.NodeSelected.emit(node);\n }\n\n /** Clear all selection */\n ClearSelection(): void {\n this.fFlow?.clearSelection();\n this.selectedNodeIDs = [];\n this.selectedConnectionIDs = [];\n this.NodeSelected.emit(null);\n this.ConnectionSelected.emit(null);\n }\n\n /** Update a node's visual status */\n SetNodeStatus(nodeId: string, status: FlowNode['Status'], message?: string): void {\n const node = this.Nodes.find(n => UUIDsEqual(n.ID, nodeId));\n if (node) {\n node.Status = status;\n node.StatusMessage = message;\n this.cdr.detectChanges();\n }\n }\n\n /** Update a node's visual properties and push a new object reference so\n * OnPush child components (FlowNodeComponent) detect the change. */\n UpdateNode(nodeId: string, changes: Partial<Pick<FlowNode, 'Label' | 'Subtitle' | 'Icon' | 'Status' | 'StatusMessage' | 'IsStartNode' | 'Badges' | 'Data'>>): void {\n const idx = this.Nodes.findIndex(n => UUIDsEqual(n.ID, nodeId));\n if (idx === -1) return;\n // Create a new object reference so the OnPush FlowNodeComponent picks up the change\n this.Nodes[idx] = { ...this.Nodes[idx], ...changes };\n this.cdr.detectChanges();\n }\n\n /** Update a connection's visual properties in-place (label, color, style, etc.) */\n UpdateConnection(connId: string, changes: Partial<Pick<FlowConnection, 'Label' | 'LabelIcon' | 'LabelIconColor' | 'LabelDetail' | 'Color' | 'StrokeWidth' | 'Style' | 'Animated'>>): void {\n const conn = this.Connections.find(c => UUIDsEqual(c.ID, connId));\n if (!conn) return;\n Object.assign(conn, changes);\n this.cdr.detectChanges();\n }\n\n /** Highlight a sequence of nodes (e.g., execution path) */\n HighlightPath(nodeIds: string[]): void {\n for (const node of this.Nodes) {\n if (nodeIds.some(id => UUIDsEqual(id, node.ID))) {\n node.Status = 'running';\n }\n }\n // Highlight connections along the path\n for (const conn of this.Connections) {\n const srcIdx = nodeIds.findIndex(id => UUIDsEqual(id, conn.SourceNodeID));\n const tgtIdx = nodeIds.findIndex(id => UUIDsEqual(id, conn.TargetNodeID));\n if (srcIdx >= 0 && tgtIdx >= 0 && tgtIdx === srcIdx + 1) {\n conn.Animated = true;\n }\n }\n this.cdr.detectChanges();\n }\n\n /** Clear all node status highlights */\n ClearHighlights(): void {\n for (const node of this.Nodes) {\n node.Status = 'default';\n node.StatusMessage = undefined;\n }\n for (const conn of this.Connections) {\n conn.Animated = false;\n }\n this.cdr.detectChanges();\n }\n\n /** Undo the last operation */\n Undo(): void {\n const snapshot = this.stateService.Undo(this.Nodes, this.Connections);\n if (snapshot) {\n this.Nodes = snapshot.Nodes;\n this.Connections = snapshot.Connections;\n this.NodesChanged.emit(this.Nodes);\n this.ConnectionsChanged.emit(this.Connections);\n this.cdr.detectChanges();\n }\n }\n\n /** Redo the last undone operation */\n Redo(): void {\n const snapshot = this.stateService.Redo(this.Nodes, this.Connections);\n if (snapshot) {\n this.Nodes = snapshot.Nodes;\n this.Connections = snapshot.Connections;\n this.NodesChanged.emit(this.Nodes);\n this.ConnectionsChanged.emit(this.Connections);\n this.cdr.detectChanges();\n }\n }\n\n get CanUndo(): boolean {\n return this.stateService.CanUndo;\n }\n\n get CanRedo(): boolean {\n return this.stateService.CanRedo;\n }\n\n /** Delete the currently selected nodes and connections */\n DeleteSelected(): void {\n if (this.ReadOnly || (this.selectedNodeIDs.length === 0 && this.selectedConnectionIDs.length === 0)) {\n return;\n }\n this.pushUndoState();\n this.removeSelectedItems();\n this.ClearSelection();\n }\n\n // ── Foblex Event Handlers ──────────────────────────────────\n\n /** Called when Foblex flow finishes loading */\n protected onFlowLoaded(): void {\n if (this.Nodes.length === 0) return;\n if (this.viewportOwnedByUser || this.hasAutoFitted) {\n this.restoreViewport();\n return;\n }\n this.hasAutoFitted = true;\n setTimeout(() => this.ZoomToFit(), 200);\n }\n\n /** Canvas zoom/pan changed */\n protected onCanvasChange(event: FCanvasChangeEvent): void {\n this.canvasPosition = event.position;\n this.canvasScale = event.scale;\n this.updateZoomLevel(event.scale);\n if (!this.applyingProgrammaticViewport) this.viewportOwnedByUser = true;\n }\n\n private restoreViewport(): void {\n if (!this.fCanvas) return;\n this.applyingProgrammaticViewport = true;\n this.fCanvas.setScale(this.canvasScale);\n queueMicrotask(() => { this.applyingProgrammaticViewport = false; });\n }\n\n /** User drew a new connection */\n protected onCreateConnection(event: FCreateConnectionEvent): void {\n if (!event.fInputId || this.ReadOnly) return;\n this.pushUndoState();\n\n // Derive node IDs from port IDs (ports are named nodeID-input / nodeID-output)\n const sourceNodeID = this.findNodeByPortId(event.fOutputId);\n const targetNodeID = this.findNodeByPortId(event.fInputId);\n\n if (!sourceNodeID || !targetNodeID) return;\n\n // Resolve actual port IDs — when fConnectOnNode is enabled, Foblex may\n // send the node ID itself instead of a port ID. Map to the correct port.\n const sourcePortID = this.resolvePortId(event.fOutputId, sourceNodeID, 'output');\n const targetPortID = this.resolvePortId(event.fInputId, targetNodeID, 'input');\n\n // Prevent duplicate connections\n const exists = this.Connections.some(\n c => UUIDsEqual(c.SourcePortID, sourcePortID) && UUIDsEqual(c.TargetPortID, targetPortID)\n );\n if (exists) return;\n\n this.ConnectionCreated.emit({\n SourceNodeID: sourceNodeID,\n SourcePortID: sourcePortID,\n TargetNodeID: targetNodeID,\n TargetPortID: targetPortID\n });\n }\n\n /** User reassigned (dragged) an existing connection endpoint to a new node */\n protected onReassignConnection(event: FReassignConnectionEvent): void {\n if (this.ReadOnly) return;\n\n const conn = this.Connections.find(c => UUIDsEqual(c.ID, event.connectionId));\n if (!conn) return;\n\n // If dropped on empty space (no new target/source), discard the reassignment\n if (event.isTargetReassign && !event.newTargetId) return;\n if (event.isSourceReassign && !event.newSourceId) return;\n\n this.pushUndoState();\n\n const oldSourceNodeID = conn.SourceNodeID;\n const oldSourcePortID = conn.SourcePortID;\n const oldTargetNodeID = conn.TargetNodeID;\n const oldTargetPortID = conn.TargetPortID;\n\n // Resolve new endpoints\n let newSourceNodeID = oldSourceNodeID;\n let newSourcePortID = oldSourcePortID;\n let newTargetNodeID = oldTargetNodeID;\n let newTargetPortID = oldTargetPortID;\n\n if (event.isSourceReassign && event.newSourceId) {\n newSourceNodeID = this.findNodeByPortId(event.newSourceId) ?? oldSourceNodeID;\n newSourcePortID = this.resolvePortId(event.newSourceId, newSourceNodeID, 'output');\n }\n\n if (event.isTargetReassign && event.newTargetId) {\n newTargetNodeID = this.findNodeByPortId(event.newTargetId) ?? oldTargetNodeID;\n newTargetPortID = this.resolvePortId(event.newTargetId, newTargetNodeID, 'input');\n }\n\n // Prevent self-connections\n if (newSourceNodeID === newTargetNodeID) return;\n\n // Prevent duplicates\n const duplicate = this.Connections.some(\n c => !UUIDsEqual(c.ID, conn.ID) &&\n UUIDsEqual(c.SourcePortID, newSourcePortID) &&\n UUIDsEqual(c.TargetPortID, newTargetPortID)\n );\n if (duplicate) return;\n\n // Update the connection in-place\n conn.SourceNodeID = newSourceNodeID;\n conn.SourcePortID = newSourcePortID;\n conn.TargetNodeID = newTargetNodeID;\n conn.TargetPortID = newTargetPortID;\n\n this.ConnectionReassigned.emit({\n ConnectionID: conn.ID,\n OldSourceNodeID: oldSourceNodeID,\n OldSourcePortID: oldSourcePortID,\n OldTargetNodeID: oldTargetNodeID,\n OldTargetPortID: oldTargetPortID,\n NewSourceNodeID: newSourceNodeID,\n NewSourcePortID: newSourcePortID,\n NewTargetNodeID: newTargetNodeID,\n NewTargetPortID: newTargetPortID\n });\n\n this.ConnectionsChanged.emit(this.Connections);\n this.cdr.detectChanges();\n }\n\n /** External item dropped from palette */\n protected onCreateNode(event: FCreateNodeEvent): void {\n const config = this.NodeTypes.find(nt => nt.Type === (event.data as string));\n if (!config) return;\n\n // event.rect is already normalized to canvas coordinates by Foblex's\n // GetNormalizedElementRectExecution (via RoundedRect.fromCenter).\n // Do NOT pass it through getPositionInFlow() again — that double-normalizes\n // and places the node far from the actual drop point.\n // Use the center of the preview rect (≈ cursor position at drop time).\n this.addNodeFromPalette(config, {\n X: event.rect.x + event.rect.width / 2,\n Y: event.rect.y + event.rect.height / 2\n });\n }\n\n /**\n * A palette entry was clicked (or activated from the keyboard) rather than dragged.\n *\n * Deliberately routed into the SAME `addNodeFromPalette` the drop path uses. A separate\n * click-only creation path would be a second way for a node to come into existence, and the two\n * would drift — which is exactly the failure this fixes, one level up.\n */\n protected onPaletteNodeTypeActivated(config: FlowNodeTypeConfig): void {\n this.addNodeFromPalette(config, this.nextClickDropPosition());\n }\n\n /** The one place a palette-originated node is created and announced. */\n private addNodeFromPalette(config: FlowNodeTypeConfig, dropPosition: FlowPosition): void {\n if (this.ReadOnly) return;\n this.pushUndoState();\n const newNode = this.createDefaultNode(config, dropPosition);\n this.NodeAdded.emit({ Node: newNode, DropPosition: dropPosition });\n }\n\n /**\n * Where a clicked step lands: the middle of what the author is currently looking at, cascaded so\n * consecutive clicks don't bury each other under one box.\n *\n * A click carries no coordinates, so *some* position has to be invented. The viewport centre is\n * the only choice that is guaranteed on screen at any zoom or pan — placing at the canvas origin\n * would drop steps off-screen the moment the author has scrolled anywhere.\n */\n private nextClickDropPosition(): FlowPosition {\n const rect = this.canvasArea?.nativeElement.getBoundingClientRect();\n const scale = this.canvasScale || 1;\n const centerX = ((rect?.width ?? 800) / 2 - this.canvasPosition.x) / scale;\n const centerY = ((rect?.height ?? 600) / 2 - this.canvasPosition.y) / scale;\n\n const step = (this.clickPlacementIndex++ % FlowEditorComponent.CLICK_CASCADE_STEPS) * FlowEditorComponent.CLICK_CASCADE_OFFSET;\n return { X: Math.round(centerX + step), Y: Math.round(centerY + step) };\n }\n\n /** Selection changed in Foblex */\n protected onSelectionChange(event: FSelectionChangeEvent): void {\n const timeSinceClick = Date.now() - this.lastConnectionClickTime;\n\n // If a direct connection click just fired, skip this Foblex callback\n // to avoid double-processing / overwriting the direct click result.\n if (timeSinceClick < 200) {\n return;\n }\n\n this.selectedNodeIDs = event.fNodeIds ?? [];\n this.selectedConnectionIDs = event.fConnectionIds ?? [];\n\n this.SelectionChanged.emit({\n SelectedNodeIDs: this.selectedNodeIDs,\n SelectedConnectionIDs: this.selectedConnectionIDs\n });\n\n // Emit specific node/connection selection events.\n // IMPORTANT: When selecting a connection, emit NodeSelected(null) FIRST so\n // that consumers clear their node state before the connection event opens\n // the connection properties panel.\n if (this.selectedNodeIDs.length === 1) {\n const node = this.Nodes.find(n => UUIDsEqual(n.ID, this.selectedNodeIDs[0]));\n this.ConnectionSelected.emit(null);\n this.NodeSelected.emit(node ?? null);\n } else if (this.selectedConnectionIDs.length === 1) {\n const conn = this.Connections.find(c => UUIDsEqual(c.ID, this.selectedConnectionIDs[0]));\n this.NodeSelected.emit(null);\n this.ConnectionSelected.emit(conn ?? null);\n } else if (this.selectedNodeIDs.length === 0 && this.selectedConnectionIDs.length === 0) {\n this.NodeSelected.emit(null);\n this.ConnectionSelected.emit(null);\n }\n }\n\n /** Nodes moved on canvas */\n protected onNodesMoved(event: FMoveNodesEvent): void {\n if (this.ReadOnly || !event.fNodes || event.fNodes.length === 0) return;\n this.pushUndoState();\n\n for (const moved of event.fNodes) {\n const node = this.Nodes.find(n => UUIDsEqual(n.ID, moved.id));\n if (node) {\n const oldPosition = { ...node.Position };\n node.Position = { X: moved.position.x, Y: moved.position.y };\n this.NodeMoved.emit({\n NodeID: node.ID,\n OldPosition: oldPosition,\n NewPosition: node.Position\n });\n }\n }\n this.NodesChanged.emit(this.Nodes);\n }\n\n // ── Toolbar Event Handlers ─────────────────────────────────\n\n protected onGridToggled(show: boolean): void {\n this.ShowGrid = show;\n this.GridToggled.emit(show);\n this.cdr.detectChanges();\n }\n\n protected onMinimapToggled(show: boolean): void {\n this.ShowMinimap = show;\n this.MinimapToggled.emit(show);\n this.cdr.detectChanges();\n }\n\n protected onLegendToggled(show: boolean): void {\n this.ShowLegend = show;\n this.LegendToggled.emit(show);\n this.cdr.detectChanges();\n }\n\n protected onPanModeToggled(enabled: boolean): void {\n this.panMode = enabled;\n this.cdr.detectChanges();\n }\n\n // ── Context Menu ───────────────────────────────────────────\n\n protected onNodeContextMenu(event: MouseEvent, node: FlowNode): void {\n event.preventDefault();\n event.stopPropagation();\n this.openContextMenu(event, 'node', node, null);\n }\n\n /** Direct click on a connection — ensures ConnectionSelected fires reliably */\n protected onConnectionClicked(event: MouseEvent, conn: FlowConnection): void {\n // Do NOT stopPropagation — let Foblex handle its own visual selection.\n // Record the time so onSelectionChange can skip double-processing.\n this.lastConnectionClickTime = Date.now();\n this.selectedConnectionIDs = [conn.ID];\n this.selectedNodeIDs = [];\n this.NodeSelected.emit(null);\n this.ConnectionSelected.emit(conn);\n this.cdr.detectChanges();\n }\n\n protected onConnectionContextMenu(event: MouseEvent, conn: FlowConnection): void {\n event.preventDefault();\n event.stopPropagation();\n this.openContextMenu(event, 'connection', null, conn);\n }\n\n protected onContextMenuAction(action: FlowContextMenuAction): void {\n // Capture the target BEFORE closing: hideContextMenu() nulls contextMenuNode and\n // contextMenuConnection, so reading them afterwards found nothing and every branch below fell\n // through — the menu closed and neither Remove nor Edit did anything, for nodes or connections.\n const targetType = this.contextMenuTargetType;\n const node = this.contextMenuNode;\n const connection = this.contextMenuConnection;\n\n this.hideContextMenu();\n\n if (!this.ReadOnly && action === 'edit') {\n if (targetType === 'node' && node) {\n this.NodeEditRequested.emit(node);\n } else if (targetType === 'connection' && connection) {\n this.ConnectionEditRequested.emit(connection);\n }\n } else if (!this.ReadOnly && action === 'remove') {\n if (targetType === 'node' && node) {\n this.pushUndoState();\n this.removeNodeById(node.ID);\n } else if (targetType === 'connection' && connection) {\n this.pushUndoState();\n this.removeConnectionById(connection.ID);\n }\n }\n\n this.AfterContextMenuAction.emit(\n new FlowAfterContextMenuActionEventArgs(action, targetType, node, connection),\n );\n }\n\n @HostListener('document:click')\n protected onDocumentClick(): void {\n if (this.contextMenuVisible) {\n this.hideContextMenu();\n }\n }\n\n private openContextMenu(\n event: MouseEvent,\n targetType: FlowContextMenuTarget,\n node: FlowNode | null,\n connection: FlowConnection | null\n ): void {\n const defaults = this.ReadOnly ? [] : defaultContextMenuItems(targetType);\n const before = new FlowBeforeContextMenuEventArgs(targetType, node, connection, event, defaults);\n this.BeforeContextMenu.emit(before);\n if (before.Cancel || before.Items.length === 0) return;\n\n this.contextMenuTargetType = targetType;\n this.contextMenuNode = node;\n this.contextMenuConnection = connection;\n this.contextMenuItems = before.Items;\n this.contextMenuX = event.clientX;\n this.contextMenuY = event.clientY;\n this.contextMenuVisible = true;\n this.cdr.detectChanges();\n }\n\n private hideContextMenu(): void {\n this.contextMenuVisible = false;\n this.contextMenuNode = null;\n this.contextMenuConnection = null;\n this.cdr.detectChanges();\n }\n\n private removeNodeById(nodeId: string): void {\n const node = this.Nodes.find(n => UUIDsEqual(n.ID, nodeId));\n if (!node) return;\n\n this.Nodes = this.Nodes.filter(n => !UUIDsEqual(n.ID, nodeId));\n\n /* Remove connections attached to this node */\n const orphaned = this.Connections.filter(\n c => UUIDsEqual(c.SourceNodeID, nodeId) || UUIDsEqual(c.TargetNodeID, nodeId)\n );\n this.Connections = this.Connections.filter(\n c => !UUIDsEqual(c.SourceNodeID, nodeId) && !UUIDsEqual(c.TargetNodeID, nodeId)\n );\n for (const conn of orphaned) {\n this.ConnectionRemoved.emit(conn);\n }\n this.NodeRemoved.emit(node);\n this.NodesChanged.emit(this.Nodes);\n this.ConnectionsChanged.emit(this.Connections);\n this.cdr.detectChanges();\n }\n\n private removeConnectionById(connId: string): void {\n const conn = this.Connections.find(c => UUIDsEqual(c.ID, connId));\n if (!conn) return;\n\n this.Connections = this.Connections.filter(c => !UUIDsEqual(c.ID, connId));\n this.ConnectionRemoved.emit(conn);\n this.ConnectionsChanged.emit(this.Connections);\n this.cdr.detectChanges();\n }\n\n // ── Keyboard Shortcuts ─────────────────────────────────────\n\n @HostListener('keydown', ['$event'])\n protected onKeyDown(event: KeyboardEvent): void {\n if (this.ReadOnly) return;\n\n const isCtrlOrMeta = event.ctrlKey || event.metaKey;\n\n if (event.key === 'Delete' || event.key === 'Backspace') {\n // Don't delete if user is typing in an input\n const target = event.target as HTMLElement;\n if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.tagName === 'SELECT') {\n return;\n }\n event.preventDefault();\n this.DeleteSelected();\n } else if (isCtrlOrMeta && event.key === 'z' && !event.shiftKey) {\n event.preventDefault();\n this.Undo();\n } else if (isCtrlOrMeta && (event.key === 'y' || (event.key === 'z' && event.shiftKey))) {\n event.preventDefault();\n this.Redo();\n } else if (isCtrlOrMeta && event.key === 'a') {\n event.preventDefault();\n this.fFlow?.selectAll();\n }\n }\n\n // ── TrackBy Functions ───────────────────────────────────────\n\n protected trackNodeById(_index: number, node: FlowNode): string {\n return node.ID;\n }\n\n protected trackConnectionById(_index: number, conn: FlowConnection): string {\n return conn.ID;\n }\n\n // ── Helper Methods ─────────────────────────────────────────\n\n GetTypeConfig(type: string): FlowNodeTypeConfig | null {\n return this.NodeTypes.find(nt => nt.Type === type) ?? null;\n }\n\n /** Get the connectable side string for Foblex based on port side */\n GetConnectableSide(side: string | undefined): string {\n switch (side) {\n case 'left': return 'left';\n case 'right': return 'right';\n case 'top': return 'top';\n case 'bottom': return 'bottom';\n default: return 'auto';\n }\n }\n\n get selectedCount(): number {\n return this.selectedNodeIDs.length + this.selectedConnectionIDs.length;\n }\n\n private pushUndoState(): void {\n this.stateService.PushState(this.Nodes, this.Connections);\n }\n\n private updateZoomLevel(scale: number): void {\n this.zoomLevel = Math.round(scale * 100);\n this.cdr.detectChanges();\n }\n\n private findNodeByPortId(portId: string): string | null {\n for (const node of this.Nodes) {\n for (const port of node.Ports) {\n if (UUIDsEqual(port.ID, portId)) {\n return node.ID;\n }\n }\n }\n // When fConnectOnNode is enabled, Foblex may send the node ID itself\n // instead of a port ID. Check for a direct node ID match as fallback.\n const directMatch = this.Nodes.find(n => UUIDsEqual(n.ID, portId));\n if (directMatch) {\n return directMatch.ID;\n }\n return null;\n }\n\n /**\n * When fConnectOnNode is enabled, Foblex may send a node ID instead of a port ID.\n * This resolves the raw ID to the correct port ID for the given direction.\n */\n private resolvePortId(rawId: string, nodeId: string, direction: 'input' | 'output'): string {\n const node = this.Nodes.find(n => UUIDsEqual(n.ID, nodeId));\n if (!node) return rawId;\n\n // If the rawId already matches a port on this node, use it as-is\n const exactPort = node.Ports.find(p => UUIDsEqual(p.ID, rawId));\n if (exactPort) return rawId;\n\n // Otherwise, find the first port matching the expected direction\n const dirPort = node.Ports.find(p => p.Direction === direction);\n return dirPort ? dirPort.ID : rawId;\n }\n\n private createDefaultNode(config: FlowNodeTypeConfig, position: FlowPosition): FlowNode {\n const id = this.generateId();\n const defaultPorts = config.DefaultPorts ?? [\n { ID: `${id}-input`, Direction: 'input' as const, Side: 'top' as const, Multiple: true },\n { ID: `${id}-output`, Direction: 'output' as const, Side: 'bottom' as const, Multiple: true }\n ];\n\n return {\n ID: id,\n Type: config.Type,\n Label: config.Label,\n Icon: config.Icon,\n Status: 'default',\n Position: position,\n Ports: defaultPorts.map(p => ({\n ...p,\n ID: p.ID.startsWith(id) ? p.ID : `${id}-${p.ID}`\n }))\n };\n }\n\n private removeSelectedItems(): void {\n // Remove selected connections\n const removedConnections = this.Connections.filter(c => this.selectedConnectionIDs.some(id => UUIDsEqual(id, c.ID)));\n this.Connections = this.Connections.filter(c => !this.selectedConnectionIDs.some(id => UUIDsEqual(id, c.ID)));\n for (const conn of removedConnections) {\n this.ConnectionRemoved.emit(conn);\n }\n\n // Remove selected nodes and their connections\n const removedNodes = this.Nodes.filter(n => this.selectedNodeIDs.some(id => UUIDsEqual(id, n.ID)));\n this.Nodes = this.Nodes.filter(n => !this.selectedNodeIDs.some(id => UUIDsEqual(id, n.ID)));\n\n // Also remove connections attached to deleted nodes\n const deletedNodeIDs = new Set(this.selectedNodeIDs.map(id => NormalizeUUID(id)));\n const orphanedConnections = this.Connections.filter(\n c => deletedNodeIDs.has(NormalizeUUID(c.SourceNodeID)) || deletedNodeIDs.has(NormalizeUUID(c.TargetNodeID))\n );\n this.Connections = this.Connections.filter(\n c => !deletedNodeIDs.has(NormalizeUUID(c.SourceNodeID)) && !deletedNodeIDs.has(NormalizeUUID(c.TargetNodeID))\n );\n\n for (const conn of orphanedConnections) {\n this.ConnectionRemoved.emit(conn);\n }\n for (const node of removedNodes) {\n this.NodeRemoved.emit(node);\n }\n\n this.NodesChanged.emit(this.Nodes);\n this.ConnectionsChanged.emit(this.Connections);\n this.cdr.detectChanges();\n }\n\n private generateId(): string {\n return 'flow-' + Math.random().toString(36).substring(2, 11);\n }\n}\n\nfunction defaultContextMenuItems(target: FlowContextMenuTarget): FlowContextMenuItem[] {\n const noun = target === 'node' ? 'Node' : 'Connection';\n return [\n { ID: 'edit', Label: `Edit ${noun}`, Icon: 'fa-pen-to-square' },\n { ID: 'remove', Label: `Remove ${noun}`, Icon: 'fa-trash-can', Danger: true },\n ];\n}\n","<div class=\"mj-flow-editor\" [class.mj-flow-editor--readonly]=\"ReadOnly\" tabindex=\"0\">\n\n <!-- Canvas Toolbar — shown / minimized / hidden (recover tab). Align is left/center/right. -->\n @if (ShowToolbar && EffectiveToolbarVisibility === 'shown') {\n <div class=\"mj-flow-editor-toolbar-area\" [attr.data-align]=\"ToolbarAlign\">\n <mj-flow-toolbar\n [ZoomLevel]=\"zoomLevel\"\n [ShowGrid]=\"ShowGrid\"\n [ShowMinimap]=\"ShowMinimap\"\n [ShowLegend]=\"ShowLegend\"\n [ReadOnly]=\"ReadOnly\"\n [PanMode]=\"panMode\"\n (ZoomInClicked)=\"ZoomIn()\"\n (ZoomOutClicked)=\"ZoomOut()\"\n (FitToScreenClicked)=\"ZoomToFit()\"\n (AutoLayoutClicked)=\"AutoArrange()\"\n (GridToggled)=\"onGridToggled($event)\"\n (MinimapToggled)=\"onMinimapToggled($event)\"\n (LegendToggled)=\"onLegendToggled($event)\"\n (PanModeToggled)=\"onPanModeToggled($event)\"\n (MinimizeClicked)=\"SetToolbarVisibility('minimized')\"\n (HideClicked)=\"SetToolbarVisibility('hidden')\">\n </mj-flow-toolbar>\n </div>\n } @else if (ShowToolbar && EffectiveToolbarVisibility === 'minimized') {\n <button type=\"button\" class=\"mj-flow-editor-toolbar-chip\" [attr.data-align]=\"ToolbarAlign\"\n (click)=\"SetToolbarVisibility('shown')\"\n title=\"Show canvas tools\" aria-label=\"Show canvas tools\">\n <i class=\"fa-solid fa-wrench\" aria-hidden=\"true\"></i>\n </button>\n } @else if (ShowToolbar && EffectiveToolbarVisibility === 'hidden') {\n <button type=\"button\" class=\"mj-flow-editor-toolbar-tab\" [attr.data-align]=\"ToolbarAlign\"\n (click)=\"SetToolbarVisibility('shown')\"\n title=\"Show canvas tools\" aria-label=\"Show canvas tools\">\n <i class=\"fa-solid fa-ellipsis\" aria-hidden=\"true\"></i>\n </button>\n }\n\n <!-- Main Canvas Area -->\n <div class=\"mj-flow-editor-canvas-area\">\n\n <!-- Palette Sidebar -->\n @if (ShowPalette && !ReadOnly) {\n <mj-flow-palette\n [NodeTypes]=\"NodeTypes\"\n (NodeTypeActivated)=\"onPaletteNodeTypeActivated($event)\">\n </mj-flow-palette>\n }\n\n <!-- Foblex Canvas -->\n <div class=\"mj-flow-editor-canvas\" #canvasArea\n [class.mj-flow-editor-canvas--pan-mode]=\"panMode\">\n <f-flow fDraggable\n [fDraggableDisabled]=\"false\"\n [fCanvasMoveTrigger]=\"canvasMoveTriggerFn\"\n [vCellSize]=\"GridSize\"\n [hCellSize]=\"GridSize\"\n [fCellSizeWhileDragging]=\"ShowGrid\"\n (fLoaded)=\"onFlowLoaded()\"\n (fCreateConnection)=\"onCreateConnection($event)\"\n (fReassignConnection)=\"onReassignConnection($event)\"\n (fCreateNode)=\"onCreateNode($event)\"\n (fSelectionChange)=\"onSelectionChange($event)\"\n (fMoveNodes)=\"onNodesMoved($event)\">\n\n <!-- Background grid — MUST be direct child of f-flow (Foblex content projection requires it) -->\n @if (ShowGrid) {\n <f-background>\n <f-circle-pattern [color]=\"'#94a3b8'\" [radius]=\"24\"></f-circle-pattern>\n </f-background>\n }\n\n <!-- Alignment snap lines — direct child of f-flow -->\n @if (!ReadOnly) {\n <f-line-alignment [fAlignThreshold]=\"10\"></f-line-alignment>\n }\n\n <f-canvas fZoom #fZoomRef=\"fComponent\"\n [fZoomMinimum]=\"0.15\"\n [fZoomMaximum]=\"3\"\n [fZoomStep]=\"0.1\"\n [position]=\"canvasPosition\"\n [scale]=\"canvasScale\"\n (fCanvasChange)=\"onCanvasChange($event)\">\n\n <!-- Interactive connection drawing -->\n @if (!ReadOnly) {\n <f-connection-for-create\n fType=\"bezier\"\n [fRadius]=\"8\"\n [fOffset]=\"12\">\n <svg viewBox=\"0 0 10 10\" fMarker type=\"end\"\n orient=\"auto\" [refX]=\"9\" [refY]=\"5\" [height]=\"10\" [width]=\"10\">\n <path d=\"M0 0L10 5L0 10Z\" fill=\"#94a3b8\"/>\n </svg>\n </f-connection-for-create>\n }\n\n <!-- Connections -->\n @for (conn of Connections; track trackConnectionById($index, conn)) {\n <f-connection\n [fConnectionId]=\"conn.ID\"\n [fOutputId]=\"conn.SourcePortID\"\n [fInputId]=\"conn.TargetPortID\"\n fType=\"bezier\"\n fBehavior=\"fixed\"\n [fRadius]=\"8\"\n [fOffset]=\"12\"\n [fSelectionDisabled]=\"false\"\n [fReassignDisabled]=\"ReadOnly\"\n [style.--connection-color]=\"conn.Color || '#94a3b8'\"\n [style.--connection-width.px]=\"conn.StrokeWidth || 2\"\n [class.mj-flow-connection-colored]=\"!!conn.Color\"\n [class.mj-flow-connection-dashed]=\"conn.Style === 'dashed'\"\n [class.mj-flow-connection-dotted]=\"conn.Style === 'dotted'\"\n [class.mj-flow-connection-animated]=\"!!conn.Animated\"\n (click)=\"onConnectionClicked($event, conn)\"\n (contextmenu)=\"onConnectionContextMenu($event, conn)\">\n <!-- Arrow marker -->\n <svg viewBox=\"0 0 10 10\" fMarker type=\"end\"\n orient=\"auto\" [refX]=\"9\" [refY]=\"5\"\n [height]=\"conn.Animated ? 16 : 10\"\n [width]=\"conn.Animated ? 16 : 10\">\n <path d=\"M0 0L10 5L0 10Z\" [attr.fill]=\"conn.Color || '#94a3b8'\"/>\n </svg>\n <!-- Connection label -->\n @if (conn.Label) {\n <div fConnectionContent [position]=\"0.5\"\n class=\"mj-flow-connection-label\"\n [style.backgroundColor]=\"ConnectionLabelBackground\"\n [style.borderColor]=\"ConnectionLabelBorderColor\"\n [style.color]=\"ConnectionLabelTextColor\"\n [title]=\"conn.LabelDetail || conn.Label || ''\">\n @if (conn.LabelIcon) {\n <i\n class=\"fa-solid mj-flow-connection-label-icon\"\n [ngClass]=\"conn.LabelIcon\"\n [style.color]=\"conn.LabelIconColor || 'inherit'\"></i>\n }\n {{ conn.Label }}\n </div>\n }\n </f-connection>\n }\n\n <!-- Nodes -->\n @for (node of Nodes; track trackNodeById($index, node)) {\n <mj-flow-node\n fNode\n fDragHandle\n [fNodeId]=\"node.ID\"\n [fNodePosition]=\"{ x: node.Position.X, y: node.Position.Y }\"\n [fNodeDraggingDisabled]=\"ReadOnly || panMode || node.Locked === true\"\n [fNodeSelectionDisabled]=\"panMode\"\n [fConnectOnNode]=\"!ReadOnly && !panMode\"\n [Node]=\"node\"\n [TypeConfig]=\"GetTypeConfig(node.Type)\"\n [ReadOnly]=\"ReadOnly\"\n (contextmenu)=\"onNodeContextMenu($event, node)\">\n </mj-flow-node>\n }\n\n </f-canvas>\n\n <!-- Rubber-band selection — direct child of f-flow -->\n @if (!ReadOnly) {\n <f-selection-area></f-selection-area>\n }\n\n <!-- Minimap -->\n @if (ShowMinimap) {\n <div class=\"mj-flow-editor-minimap\" fDragBlocker>\n <f-minimap [fMinSize]=\"1500\"></f-minimap>\n </div>\n }\n </f-flow>\n\n <!-- Legend -->\n @if (ShowLegend && Nodes.length > 0) {\n <div class=\"mj-flow-editor-legend\">\n <div class=\"mj-flow-editor-legend-title\">Legend</div>\n <div class=\"mj-flow-editor-legend-section\">\n <div class=\"mj-flow-editor-legend-heading\">Connections</div>\n <div class=\"mj-flow-editor-legend-item\">\n <svg class=\"mj-flow-editor-legend-line-svg\" width=\"28\" height=\"10\"><line x1=\"0\" y1=\"5\" x2=\"28\" y2=\"5\" stroke=\"#64748b\" stroke-width=\"2\"/></svg>\n <span>Only exit path</span>\n </div>\n <div class=\"mj-flow-editor-legend-item\">\n <svg class=\"mj-flow-editor-legend-line-svg\" width=\"28\" height=\"10\"><line x1=\"0\" y1=\"5\" x2=\"28\" y2=\"5\" stroke=\"#16a34a\" stroke-width=\"2\"/></svg>\n <i class=\"fa-solid fa-circle-check\" style=\"color:#16a34a;font-size:10px;\"></i>\n <span>Default (fallback)</span>\n </div>\n <div class=\"mj-flow-editor-legend-item\">\n <svg class=\"mj-flow-editor-legend-line-svg\" width=\"28\" height=\"10\"><line x1=\"0\" y1=\"5\" x2=\"28\" y2=\"5\" stroke=\"#f59e0b\" stroke-width=\"2\" stroke-dasharray=\"5 3\"/></svg>\n <span>Conditional</span>\n </div>\n <div class=\"mj-flow-editor-legend-item\">\n <svg class=\"mj-flow-editor-legend-line-svg\" width=\"28\" height=\"10\"><line x1=\"0\" y1=\"5\" x2=\"28\" y2=\"5\" stroke=\"#ef4444\" stroke-width=\"2\"/></svg>\n <i class=\"fa-solid fa-triangle-exclamation\" style=\"color:#ef4444;font-size:10px;\"></i>\n <span>Duplicate defaults</span>\n </div>\n </div>\n <div class=\"mj-flow-editor-legend-section\">\n <div class=\"mj-flow-editor-legend-heading\">Step Types</div>\n <div class=\"mj-flow-editor-legend-item\">\n <span class=\"mj-flow-editor-legend-swatch\" style=\"background:#3B82F6\"></span>\n <span>Action</span>\n </div>\n <div class=\"mj-flow-editor-legend-item\">\n <span class=\"mj-flow-editor-legend-swatch\" style=\"background:#8B5CF6\"></span>\n <span>Prompt</span>\n </div>\n <div class=\"mj-flow-editor-legend-item\">\n <span class=\"mj-flow-editor-legend-swatch\" style=\"background:#10B981\"></span>\n <span>Sub-Agent</span>\n </div>\n <div class=\"mj-flow-editor-legend-item\">\n <span class=\"mj-flow-editor-legend-swatch\" style=\"background:#F59E0B\"></span>\n <span>For Each</span>\n </div>\n <div class=\"mj-flow-editor-legend-item\">\n <span class=\"mj-flow-editor-legend-swatch\" style=\"background:#F97316\"></span>\n <span>While</span>\n </div>\n </div>\n <div class=\"mj-flow-editor-legend-section\">\n <div class=\"mj-flow-editor-legend-heading\">Borders</div>\n <div class=\"mj-flow-editor-legend-item\">\n <span class=\"mj-flow-editor-legend-box\" style=\"border-color:#16a34a;background:#f0fdf4;\"></span>\n <span>Start node</span>\n </div>\n <div class=\"mj-flow-editor-legend-item\">\n <span class=\"mj-flow-editor-legend-box\" style=\"border-color:#ef4444;background:#fef2f2;\"></span>\n <i class=\"fa-solid fa-triangle-exclamation\" style=\"color:#ea580c;font-size:10px;\"></i>\n <span>Missing config</span>\n </div>\n </div>\n </div>\n }\n\n <!-- Empty state overlay -->\n @if (Nodes.length === 0) {\n <div class=\"mj-flow-editor-empty\">\n <mj-empty-state\n Icon=\"fa-solid fa-diagram-project\"\n [Title]=\"EmptyStateTitle\">\n @if (!ReadOnly) {\n <p class=\"mj-flow-editor-empty-subtitle\">\n Or use auto-layout after adding steps to arrange them automatically\n </p>\n }\n </mj-empty-state>\n </div>\n }\n </div>\n </div>\n\n <!-- Context Menu -->\n @if (contextMenuVisible) {\n <div\n class=\"mj-flow-context-menu\"\n [style.left.px]=\"contextMenuX\"\n [style.top.px]=\"contextMenuY\"\n (click)=\"$event.stopPropagation()\">\n @for (item of contextMenuItems; track item.ID; let last = $last) {\n <button type=\"button\" class=\"mj-flow-context-menu-item\"\n [class.mj-flow-context-menu-item--danger]=\"item.Danger\"\n [disabled]=\"item.Disabled\"\n (click)=\"onContextMenuAction(item.ID)\">\n @if (item.Icon) {\n <i class=\"fa-solid\" [ngClass]=\"item.Icon\"></i>\n }\n <span>{{ item.Label }}</span>\n @if (item.Shortcut) {\n <kbd class=\"mj-flow-context-menu-shortcut\">{{ item.Shortcut }}</kbd>\n }\n </button>\n @if (!last && item.Danger !== contextMenuItems[$index + 1]?.Danger) {\n <div class=\"mj-flow-context-menu-divider\"></div>\n }\n }\n </div>\n }\n\n <!-- Status Bar -->\n @if (ShowStatusBar) {\n <mj-flow-status-bar\n [NodeCount]=\"Nodes.length\"\n [ConnectionCount]=\"Connections.length\"\n [SelectedCount]=\"selectedCount\"\n [ZoomLevel]=\"zoomLevel\">\n </mj-flow-status-bar>\n }\n</div>\n"]}
1
+ {"version":3,"file":"flow-editor.component.js","sourceRoot":"","sources":["../../../src/lib/components/flow-editor.component.ts","../../../src/lib/components/flow-editor.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component, Input, Output, EventEmitter, ViewChild, OnInit, OnDestroy,\n ChangeDetectorRef, ElementRef, ViewEncapsulation, ChangeDetectionStrategy, HostListener\n} from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { FFlowComponent, FCanvasComponent, FZoomDirective, FCreateConnectionEvent,\n FCreateNodeEvent, FSelectionChangeEvent, FCanvasChangeEvent, FMoveNodesEvent,\n FReassignConnectionEvent } from '@foblex/flow';\nimport {\n FlowNode, FlowConnection, FlowNodeTypeConfig, FlowNodeAddedEvent,\n FlowNodeMovedEvent, FlowConnectionCreatedEvent, FlowConnectionReassignedEvent,\n FlowSelectionChangedEvent,\n FlowCanvasClickEvent, FlowPosition, FlowLayoutDirection,\n FlowContextMenuTarget, FlowContextMenuAction, FlowContextMenuItem,\n FlowBeforeContextMenuEventArgs, FlowAfterContextMenuActionEventArgs,\n FlowToolbarAlign, FlowToolbarVisibility,\n} from '../interfaces/flow-types';\nimport { FlowStateService } from '../services/flow-state.service';\nimport { FlowLayoutService } from '../services/flow-layout.service';\nimport { UUIDsEqual, NormalizeUUID } from '@memberjunction/global';\n\n/**\n * Generic, entity-agnostic visual flow editor component.\n * Wraps Foblex Flow to provide a clean MJ-style API.\n *\n * Usage:\n * ```html\n * <mj-flow-editor\n * [Nodes]=\"myNodes\"\n * [Connections]=\"myConnections\"\n * [NodeTypes]=\"myNodeTypes\"\n * (NodeSelected)=\"onNodeSelected($event)\"\n * (ConnectionCreated)=\"onConnectionCreated($event)\">\n * </mj-flow-editor>\n * ```\n */\n@Component({\n standalone: false,\n selector: 'mj-flow-editor',\n templateUrl: './flow-editor.component.html',\n styleUrls: ['./flow-editor.component.css'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.Default,\n providers: [FlowStateService, FlowLayoutService]\n})\nexport class FlowEditorComponent implements OnInit, OnDestroy {\n // ── Inputs ──────────────────────────────────────────────────\n @Input() Nodes: FlowNode[] = [];\n @Input() Connections: FlowConnection[] = [];\n @Input() NodeTypes: FlowNodeTypeConfig[] = [];\n @Input() ReadOnly = false;\n @Input() ShowMinimap = true;\n @Input() ShowPalette = true;\n @Input() ShowGrid = true;\n @Input() ShowStatusBar = true;\n /**\n * Legacy on/off. `false` forces the toolbar fully off (no recover tab). Prefer\n * `ToolbarVisibility` when the host wants shown / minimized / hidden with a way back.\n */\n @Input() ShowToolbar = true;\n /** Full bar, a restore chip, or a recover tab. Ignored when `ShowToolbar` is false. */\n @Input() ToolbarVisibility: FlowToolbarVisibility = 'shown';\n /** Left / center / right along the top of the canvas. */\n @Input() ToolbarAlign: FlowToolbarAlign = 'center';\n @Input() ShowLegend = true;\n @Input() GridSize = 20;\n @Input() AutoLayoutDirection: FlowLayoutDirection = 'vertical';\n /** Background color for connection labels */\n // Design tokens, not literals — the canvas renders on both themes, and a near-white pill on a\n // dark canvas made the least important element the most visually dominant thing on screen.\n @Input() ConnectionLabelBackground = 'var(--mj-bg-surface)';\n /** Border color for connection labels */\n @Input() ConnectionLabelBorderColor = 'var(--mj-border-default)';\n /** Text color for connection labels */\n @Input() ConnectionLabelTextColor = 'var(--mj-text-secondary)';\n\n /** Title for the canvas empty-state overlay — depends on read-only mode. */\n public get EmptyStateTitle(): string {\n return this.ReadOnly\n ? 'No steps defined for this flow'\n : 'Click a step in the palette — or drag one onto the canvas — to start building your flow';\n }\n\n // ── Outputs ─────────────────────────────────────────────────\n @Output() NodeSelected = new EventEmitter<FlowNode | null>();\n @Output() NodeAdded = new EventEmitter<FlowNodeAddedEvent>();\n @Output() NodeRemoved = new EventEmitter<FlowNode>();\n @Output() NodeMoved = new EventEmitter<FlowNodeMovedEvent>();\n @Output() ConnectionCreated = new EventEmitter<FlowConnectionCreatedEvent>();\n @Output() ConnectionRemoved = new EventEmitter<FlowConnection>();\n @Output() ConnectionReassigned = new EventEmitter<FlowConnectionReassignedEvent>();\n @Output() ConnectionSelected = new EventEmitter<FlowConnection | null>();\n @Output() SelectionChanged = new EventEmitter<FlowSelectionChangedEvent>();\n @Output() CanvasClicked = new EventEmitter<FlowCanvasClickEvent>();\n @Output() NodesChanged = new EventEmitter<FlowNode[]>();\n @Output() ConnectionsChanged = new EventEmitter<FlowConnection[]>();\n @Output() NodeEditRequested = new EventEmitter<FlowNode>();\n @Output() ConnectionEditRequested = new EventEmitter<FlowConnection>();\n /** Host may replace `Items` or `Cancel` the menu. Debug attaches here — the canvas stays blind. */\n @Output() BeforeContextMenu = new EventEmitter<FlowBeforeContextMenuEventArgs>();\n @Output() AfterContextMenuAction = new EventEmitter<FlowAfterContextMenuActionEventArgs>();\n @Output() GridToggled = new EventEmitter<boolean>();\n @Output() MinimapToggled = new EventEmitter<boolean>();\n @Output() LegendToggled = new EventEmitter<boolean>();\n /** The person changed shown / minimized / hidden from the canvas chrome. */\n @Output() ToolbarVisibilityChanged = new EventEmitter<FlowToolbarVisibility>();\n\n /** What the template actually paints — `ShowToolbar === false` is a hard hide. */\n public get EffectiveToolbarVisibility(): FlowToolbarVisibility {\n return this.ShowToolbar ? this.ToolbarVisibility : 'hidden';\n }\n\n public SetToolbarVisibility(next: FlowToolbarVisibility): void {\n if (!this.ShowToolbar) return;\n if (this.ToolbarVisibility === next) return;\n this.ToolbarVisibility = next;\n this.ToolbarVisibilityChanged.emit(next);\n }\n\n // ── View Children ───────────────────────────────────────────\n @ViewChild(FFlowComponent) protected fFlow: FFlowComponent | undefined;\n @ViewChild(FCanvasComponent) protected fCanvas: FCanvasComponent | undefined;\n @ViewChild('fZoomRef') protected fZoom: FZoomDirective | undefined;\n @ViewChild('canvasArea') protected canvasArea: ElementRef<HTMLElement> | undefined;\n\n // ── Internal State ──────────────────────────────────────────\n protected zoomLevel = 100;\n protected canvasPosition = { x: 0, y: 0 };\n protected canvasScale = 1;\n /** After the first auto-fit, later fLoaded events must not snap the viewport back. */\n private hasAutoFitted = false;\n /** True once the person zooms or pans — remounts restore this viewport instead of fitting. */\n private viewportOwnedByUser = false;\n private applyingProgrammaticViewport = false;\n protected selectedNodeIDs: string[] = [];\n protected selectedConnectionIDs: string[] = [];\n protected panMode = false;\n\n /** Trigger function for canvas panning — only allows panning in pan mode */\n protected canvasMoveTriggerFn = (_event: MouseEvent | TouchEvent): boolean => {\n return this.panMode;\n };\n\n /* Context menu state */\n protected contextMenuVisible = false;\n protected contextMenuX = 0;\n protected contextMenuY = 0;\n protected contextMenuTargetType: FlowContextMenuTarget = 'node';\n protected contextMenuNode: FlowNode | null = null;\n protected contextMenuConnection: FlowConnection | null = null;\n protected contextMenuItems: FlowContextMenuItem[] = [];\n\n private destroy$ = new Subject<void>();\n private initialized = false;\n private lastConnectionClickTime = 0;\n\n /** How many click-placed nodes are cascaded before the offset wraps back to the viewport centre. */\n private static readonly CLICK_CASCADE_STEPS = 6;\n /** Pixels (canvas units) each cascaded click-placed node is offset by. */\n private static readonly CLICK_CASCADE_OFFSET = 40;\n private clickPlacementIndex = 0;\n\n constructor(\n private cdr: ChangeDetectorRef,\n private stateService: FlowStateService,\n private layoutService: FlowLayoutService\n ) {}\n\n // ── Lifecycle ───────────────────────────────────────────────\n\n ngOnInit(): void {\n this.initialized = true;\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // ── Public Methods ──────────────────────────────────────────\n\n /** Fit all nodes within the viewport */\n ZoomToFit(): void {\n this.applyingProgrammaticViewport = true;\n this.fCanvas?.fitToScreen({ x: 150, y: 150 }, true);\n this.hasAutoFitted = true;\n queueMicrotask(() => { this.applyingProgrammaticViewport = false; });\n }\n\n /** Zoom in one step */\n ZoomIn(): void {\n this.viewportOwnedByUser = true;\n if (this.fZoom) {\n this.fZoom.zoomIn();\n } else {\n const newScale = Math.min(this.canvasScale + 0.15, 3);\n this.fCanvas?.setScale(newScale);\n this.updateZoomLevel(newScale);\n }\n }\n\n /** Zoom out one step */\n ZoomOut(): void {\n this.viewportOwnedByUser = true;\n if (this.fZoom) {\n this.fZoom.zoomOut();\n } else {\n const newScale = Math.max(this.canvasScale - 0.15, 0.1);\n this.fCanvas?.setScale(newScale);\n this.updateZoomLevel(newScale);\n }\n }\n\n /** Run auto-layout using dagre */\n AutoArrange(direction?: FlowLayoutDirection): void {\n const dir = direction ?? this.AutoLayoutDirection;\n this.pushUndoState();\n const result = this.layoutService.CalculateLayout(this.Nodes, this.Connections, dir);\n for (const node of this.Nodes) {\n const newPos = result.Positions.get(node.ID);\n if (newPos) {\n node.Position = { ...newPos };\n }\n }\n this.NodesChanged.emit(this.Nodes);\n this.cdr.detectChanges();\n // Fit to screen after layout\n setTimeout(() => this.ZoomToFit(), 100);\n }\n\n /** Center the canvas on a specific node */\n CenterOnNode(nodeId: string): void {\n this.fCanvas?.centerGroupOrNode(nodeId, true);\n }\n\n /** Programmatically select a node */\n SelectNode(nodeId: string): void {\n this.fFlow?.select([nodeId], []);\n const node = this.Nodes.find(n => UUIDsEqual(n.ID, nodeId)) ?? null;\n this.NodeSelected.emit(node);\n }\n\n /** Clear all selection */\n ClearSelection(): void {\n this.fFlow?.clearSelection();\n this.selectedNodeIDs = [];\n this.selectedConnectionIDs = [];\n this.NodeSelected.emit(null);\n this.ConnectionSelected.emit(null);\n }\n\n /** Update a node's visual status */\n SetNodeStatus(nodeId: string, status: FlowNode['Status'], message?: string): void {\n const node = this.Nodes.find(n => UUIDsEqual(n.ID, nodeId));\n if (node) {\n node.Status = status;\n node.StatusMessage = message;\n this.cdr.detectChanges();\n }\n }\n\n /** Update a node's visual properties and push a new object reference so\n * OnPush child components (FlowNodeComponent) detect the change. */\n UpdateNode(nodeId: string, changes: Partial<Pick<FlowNode, 'Label' | 'Subtitle' | 'Icon' | 'Status' | 'StatusMessage' | 'IsStartNode' | 'Badges' | 'Data'>>): void {\n const idx = this.Nodes.findIndex(n => UUIDsEqual(n.ID, nodeId));\n if (idx === -1) return;\n // Create a new object reference so the OnPush FlowNodeComponent picks up the change\n this.Nodes[idx] = { ...this.Nodes[idx], ...changes };\n this.cdr.detectChanges();\n }\n\n /** Update a connection's visual properties in-place (label, color, style, etc.) */\n UpdateConnection(connId: string, changes: Partial<Pick<FlowConnection, 'Label' | 'LabelIcon' | 'LabelIconColor' | 'LabelDetail' | 'Color' | 'StrokeWidth' | 'Style' | 'Animated'>>): void {\n const conn = this.Connections.find(c => UUIDsEqual(c.ID, connId));\n if (!conn) return;\n Object.assign(conn, changes);\n this.cdr.detectChanges();\n }\n\n /** Highlight a sequence of nodes (e.g., execution path) */\n HighlightPath(nodeIds: string[]): void {\n // First index of each normalized ID (same answer as findIndex), built once so the node and\n // connection passes are linear rather than nodes x path and connections x path.\n const pathIndex = new Map<string, number>();\n nodeIds.forEach((id, i) => {\n const key = NormalizeUUID(id);\n if (!pathIndex.has(key)) pathIndex.set(key, i);\n });\n for (const node of this.Nodes) {\n if (pathIndex.has(NormalizeUUID(node.ID))) {\n node.Status = 'running';\n }\n }\n // Highlight connections along the path\n for (const conn of this.Connections) {\n const srcIdx = pathIndex.get(NormalizeUUID(conn.SourceNodeID)) ?? -1;\n const tgtIdx = pathIndex.get(NormalizeUUID(conn.TargetNodeID)) ?? -1;\n if (srcIdx >= 0 && tgtIdx >= 0 && tgtIdx === srcIdx + 1) {\n conn.Animated = true;\n }\n }\n this.cdr.detectChanges();\n }\n\n /** Clear all node status highlights */\n ClearHighlights(): void {\n for (const node of this.Nodes) {\n node.Status = 'default';\n node.StatusMessage = undefined;\n }\n for (const conn of this.Connections) {\n conn.Animated = false;\n }\n this.cdr.detectChanges();\n }\n\n /** Undo the last operation */\n Undo(): void {\n const snapshot = this.stateService.Undo(this.Nodes, this.Connections);\n if (snapshot) {\n this.Nodes = snapshot.Nodes;\n this.Connections = snapshot.Connections;\n this.NodesChanged.emit(this.Nodes);\n this.ConnectionsChanged.emit(this.Connections);\n this.cdr.detectChanges();\n }\n }\n\n /** Redo the last undone operation */\n Redo(): void {\n const snapshot = this.stateService.Redo(this.Nodes, this.Connections);\n if (snapshot) {\n this.Nodes = snapshot.Nodes;\n this.Connections = snapshot.Connections;\n this.NodesChanged.emit(this.Nodes);\n this.ConnectionsChanged.emit(this.Connections);\n this.cdr.detectChanges();\n }\n }\n\n get CanUndo(): boolean {\n return this.stateService.CanUndo;\n }\n\n get CanRedo(): boolean {\n return this.stateService.CanRedo;\n }\n\n /** Delete the currently selected nodes and connections */\n DeleteSelected(): void {\n if (this.ReadOnly || (this.selectedNodeIDs.length === 0 && this.selectedConnectionIDs.length === 0)) {\n return;\n }\n this.pushUndoState();\n this.removeSelectedItems();\n this.ClearSelection();\n }\n\n // ── Foblex Event Handlers ──────────────────────────────────\n\n /** Called when Foblex flow finishes loading */\n protected onFlowLoaded(): void {\n if (this.Nodes.length === 0) return;\n if (this.viewportOwnedByUser || this.hasAutoFitted) {\n this.restoreViewport();\n return;\n }\n this.hasAutoFitted = true;\n setTimeout(() => this.ZoomToFit(), 200);\n }\n\n /** Canvas zoom/pan changed */\n protected onCanvasChange(event: FCanvasChangeEvent): void {\n this.canvasPosition = event.position;\n this.canvasScale = event.scale;\n this.updateZoomLevel(event.scale);\n if (!this.applyingProgrammaticViewport) this.viewportOwnedByUser = true;\n }\n\n private restoreViewport(): void {\n if (!this.fCanvas) return;\n this.applyingProgrammaticViewport = true;\n this.fCanvas.setScale(this.canvasScale);\n queueMicrotask(() => { this.applyingProgrammaticViewport = false; });\n }\n\n /** User drew a new connection */\n protected onCreateConnection(event: FCreateConnectionEvent): void {\n if (!event.fInputId || this.ReadOnly) return;\n this.pushUndoState();\n\n // Derive node IDs from port IDs (ports are named nodeID-input / nodeID-output)\n const sourceNodeID = this.findNodeByPortId(event.fOutputId);\n const targetNodeID = this.findNodeByPortId(event.fInputId);\n\n if (!sourceNodeID || !targetNodeID) return;\n\n // Resolve actual port IDs — when fConnectOnNode is enabled, Foblex may\n // send the node ID itself instead of a port ID. Map to the correct port.\n const sourcePortID = this.resolvePortId(event.fOutputId, sourceNodeID, 'output');\n const targetPortID = this.resolvePortId(event.fInputId, targetNodeID, 'input');\n\n // Prevent duplicate connections\n const exists = this.Connections.some(\n c => UUIDsEqual(c.SourcePortID, sourcePortID) && UUIDsEqual(c.TargetPortID, targetPortID)\n );\n if (exists) return;\n\n this.ConnectionCreated.emit({\n SourceNodeID: sourceNodeID,\n SourcePortID: sourcePortID,\n TargetNodeID: targetNodeID,\n TargetPortID: targetPortID\n });\n }\n\n /** User reassigned (dragged) an existing connection endpoint to a new node */\n protected onReassignConnection(event: FReassignConnectionEvent): void {\n if (this.ReadOnly) return;\n\n const conn = this.Connections.find(c => UUIDsEqual(c.ID, event.connectionId));\n if (!conn) return;\n\n // If dropped on empty space (no new target/source), discard the reassignment\n if (event.isTargetReassign && !event.newTargetId) return;\n if (event.isSourceReassign && !event.newSourceId) return;\n\n this.pushUndoState();\n\n const oldSourceNodeID = conn.SourceNodeID;\n const oldSourcePortID = conn.SourcePortID;\n const oldTargetNodeID = conn.TargetNodeID;\n const oldTargetPortID = conn.TargetPortID;\n\n // Resolve new endpoints\n let newSourceNodeID = oldSourceNodeID;\n let newSourcePortID = oldSourcePortID;\n let newTargetNodeID = oldTargetNodeID;\n let newTargetPortID = oldTargetPortID;\n\n if (event.isSourceReassign && event.newSourceId) {\n newSourceNodeID = this.findNodeByPortId(event.newSourceId) ?? oldSourceNodeID;\n newSourcePortID = this.resolvePortId(event.newSourceId, newSourceNodeID, 'output');\n }\n\n if (event.isTargetReassign && event.newTargetId) {\n newTargetNodeID = this.findNodeByPortId(event.newTargetId) ?? oldTargetNodeID;\n newTargetPortID = this.resolvePortId(event.newTargetId, newTargetNodeID, 'input');\n }\n\n // Prevent self-connections\n if (newSourceNodeID === newTargetNodeID) return;\n\n // Prevent duplicates\n const duplicate = this.Connections.some(\n c => !UUIDsEqual(c.ID, conn.ID) &&\n UUIDsEqual(c.SourcePortID, newSourcePortID) &&\n UUIDsEqual(c.TargetPortID, newTargetPortID)\n );\n if (duplicate) return;\n\n // Update the connection in-place\n conn.SourceNodeID = newSourceNodeID;\n conn.SourcePortID = newSourcePortID;\n conn.TargetNodeID = newTargetNodeID;\n conn.TargetPortID = newTargetPortID;\n\n this.ConnectionReassigned.emit({\n ConnectionID: conn.ID,\n OldSourceNodeID: oldSourceNodeID,\n OldSourcePortID: oldSourcePortID,\n OldTargetNodeID: oldTargetNodeID,\n OldTargetPortID: oldTargetPortID,\n NewSourceNodeID: newSourceNodeID,\n NewSourcePortID: newSourcePortID,\n NewTargetNodeID: newTargetNodeID,\n NewTargetPortID: newTargetPortID\n });\n\n this.ConnectionsChanged.emit(this.Connections);\n this.cdr.detectChanges();\n }\n\n /** External item dropped from palette */\n protected onCreateNode(event: FCreateNodeEvent): void {\n const config = this.NodeTypes.find(nt => nt.Type === (event.data as string));\n if (!config) return;\n\n // event.rect is already normalized to canvas coordinates by Foblex's\n // GetNormalizedElementRectExecution (via RoundedRect.fromCenter).\n // Do NOT pass it through getPositionInFlow() again — that double-normalizes\n // and places the node far from the actual drop point.\n // Use the center of the preview rect (≈ cursor position at drop time).\n this.addNodeFromPalette(config, {\n X: event.rect.x + event.rect.width / 2,\n Y: event.rect.y + event.rect.height / 2\n });\n }\n\n /**\n * A palette entry was clicked (or activated from the keyboard) rather than dragged.\n *\n * Deliberately routed into the SAME `addNodeFromPalette` the drop path uses. A separate\n * click-only creation path would be a second way for a node to come into existence, and the two\n * would drift — which is exactly the failure this fixes, one level up.\n */\n protected onPaletteNodeTypeActivated(config: FlowNodeTypeConfig): void {\n this.addNodeFromPalette(config, this.nextClickDropPosition());\n }\n\n /** The one place a palette-originated node is created and announced. */\n private addNodeFromPalette(config: FlowNodeTypeConfig, dropPosition: FlowPosition): void {\n if (this.ReadOnly) return;\n this.pushUndoState();\n const newNode = this.createDefaultNode(config, dropPosition);\n this.NodeAdded.emit({ Node: newNode, DropPosition: dropPosition });\n }\n\n /**\n * Where a clicked step lands: the middle of what the author is currently looking at, cascaded so\n * consecutive clicks don't bury each other under one box.\n *\n * A click carries no coordinates, so *some* position has to be invented. The viewport centre is\n * the only choice that is guaranteed on screen at any zoom or pan — placing at the canvas origin\n * would drop steps off-screen the moment the author has scrolled anywhere.\n */\n private nextClickDropPosition(): FlowPosition {\n const rect = this.canvasArea?.nativeElement.getBoundingClientRect();\n const scale = this.canvasScale || 1;\n const centerX = ((rect?.width ?? 800) / 2 - this.canvasPosition.x) / scale;\n const centerY = ((rect?.height ?? 600) / 2 - this.canvasPosition.y) / scale;\n\n const step = (this.clickPlacementIndex++ % FlowEditorComponent.CLICK_CASCADE_STEPS) * FlowEditorComponent.CLICK_CASCADE_OFFSET;\n return { X: Math.round(centerX + step), Y: Math.round(centerY + step) };\n }\n\n /** Selection changed in Foblex */\n protected onSelectionChange(event: FSelectionChangeEvent): void {\n const timeSinceClick = Date.now() - this.lastConnectionClickTime;\n\n // If a direct connection click just fired, skip this Foblex callback\n // to avoid double-processing / overwriting the direct click result.\n if (timeSinceClick < 200) {\n return;\n }\n\n this.selectedNodeIDs = event.fNodeIds ?? [];\n this.selectedConnectionIDs = event.fConnectionIds ?? [];\n\n this.SelectionChanged.emit({\n SelectedNodeIDs: this.selectedNodeIDs,\n SelectedConnectionIDs: this.selectedConnectionIDs\n });\n\n // Emit specific node/connection selection events.\n // IMPORTANT: When selecting a connection, emit NodeSelected(null) FIRST so\n // that consumers clear their node state before the connection event opens\n // the connection properties panel.\n if (this.selectedNodeIDs.length === 1) {\n const node = this.Nodes.find(n => UUIDsEqual(n.ID, this.selectedNodeIDs[0]));\n this.ConnectionSelected.emit(null);\n this.NodeSelected.emit(node ?? null);\n } else if (this.selectedConnectionIDs.length === 1) {\n const conn = this.Connections.find(c => UUIDsEqual(c.ID, this.selectedConnectionIDs[0]));\n this.NodeSelected.emit(null);\n this.ConnectionSelected.emit(conn ?? null);\n } else if (this.selectedNodeIDs.length === 0 && this.selectedConnectionIDs.length === 0) {\n this.NodeSelected.emit(null);\n this.ConnectionSelected.emit(null);\n }\n }\n\n /** Nodes moved on canvas */\n protected onNodesMoved(event: FMoveNodesEvent): void {\n if (this.ReadOnly || !event.fNodes || event.fNodes.length === 0) return;\n this.pushUndoState();\n\n for (const moved of event.fNodes) {\n const node = this.Nodes.find(n => UUIDsEqual(n.ID, moved.id));\n if (node) {\n const oldPosition = { ...node.Position };\n node.Position = { X: moved.position.x, Y: moved.position.y };\n this.NodeMoved.emit({\n NodeID: node.ID,\n OldPosition: oldPosition,\n NewPosition: node.Position\n });\n }\n }\n this.NodesChanged.emit(this.Nodes);\n }\n\n // ── Toolbar Event Handlers ─────────────────────────────────\n\n protected onGridToggled(show: boolean): void {\n this.ShowGrid = show;\n this.GridToggled.emit(show);\n this.cdr.detectChanges();\n }\n\n protected onMinimapToggled(show: boolean): void {\n this.ShowMinimap = show;\n this.MinimapToggled.emit(show);\n this.cdr.detectChanges();\n }\n\n protected onLegendToggled(show: boolean): void {\n this.ShowLegend = show;\n this.LegendToggled.emit(show);\n this.cdr.detectChanges();\n }\n\n protected onPanModeToggled(enabled: boolean): void {\n this.panMode = enabled;\n this.cdr.detectChanges();\n }\n\n // ── Context Menu ───────────────────────────────────────────\n\n protected onNodeContextMenu(event: MouseEvent, node: FlowNode): void {\n event.preventDefault();\n event.stopPropagation();\n this.openContextMenu(event, 'node', node, null);\n }\n\n /** Direct click on a connection — ensures ConnectionSelected fires reliably */\n protected onConnectionClicked(event: MouseEvent, conn: FlowConnection): void {\n // Do NOT stopPropagation — let Foblex handle its own visual selection.\n // Record the time so onSelectionChange can skip double-processing.\n this.lastConnectionClickTime = Date.now();\n this.selectedConnectionIDs = [conn.ID];\n this.selectedNodeIDs = [];\n this.NodeSelected.emit(null);\n this.ConnectionSelected.emit(conn);\n this.cdr.detectChanges();\n }\n\n protected onConnectionContextMenu(event: MouseEvent, conn: FlowConnection): void {\n event.preventDefault();\n event.stopPropagation();\n this.openContextMenu(event, 'connection', null, conn);\n }\n\n protected onContextMenuAction(action: FlowContextMenuAction): void {\n // Capture the target BEFORE closing: hideContextMenu() nulls contextMenuNode and\n // contextMenuConnection, so reading them afterwards found nothing and every branch below fell\n // through — the menu closed and neither Remove nor Edit did anything, for nodes or connections.\n const targetType = this.contextMenuTargetType;\n const node = this.contextMenuNode;\n const connection = this.contextMenuConnection;\n\n this.hideContextMenu();\n\n if (!this.ReadOnly && action === 'edit') {\n if (targetType === 'node' && node) {\n this.NodeEditRequested.emit(node);\n } else if (targetType === 'connection' && connection) {\n this.ConnectionEditRequested.emit(connection);\n }\n } else if (!this.ReadOnly && action === 'remove') {\n if (targetType === 'node' && node) {\n this.pushUndoState();\n this.removeNodeById(node.ID);\n } else if (targetType === 'connection' && connection) {\n this.pushUndoState();\n this.removeConnectionById(connection.ID);\n }\n }\n\n this.AfterContextMenuAction.emit(\n new FlowAfterContextMenuActionEventArgs(action, targetType, node, connection),\n );\n }\n\n @HostListener('document:click')\n protected onDocumentClick(): void {\n if (this.contextMenuVisible) {\n this.hideContextMenu();\n }\n }\n\n private openContextMenu(\n event: MouseEvent,\n targetType: FlowContextMenuTarget,\n node: FlowNode | null,\n connection: FlowConnection | null\n ): void {\n const defaults = this.ReadOnly ? [] : defaultContextMenuItems(targetType);\n const before = new FlowBeforeContextMenuEventArgs(targetType, node, connection, event, defaults);\n this.BeforeContextMenu.emit(before);\n if (before.Cancel || before.Items.length === 0) return;\n\n this.contextMenuTargetType = targetType;\n this.contextMenuNode = node;\n this.contextMenuConnection = connection;\n this.contextMenuItems = before.Items;\n this.contextMenuX = event.clientX;\n this.contextMenuY = event.clientY;\n this.contextMenuVisible = true;\n this.cdr.detectChanges();\n }\n\n private hideContextMenu(): void {\n this.contextMenuVisible = false;\n this.contextMenuNode = null;\n this.contextMenuConnection = null;\n this.cdr.detectChanges();\n }\n\n private removeNodeById(nodeId: string): void {\n const node = this.Nodes.find(n => UUIDsEqual(n.ID, nodeId));\n if (!node) return;\n\n this.Nodes = this.Nodes.filter(n => !UUIDsEqual(n.ID, nodeId));\n\n /* Remove connections attached to this node */\n const orphaned = this.Connections.filter(\n c => UUIDsEqual(c.SourceNodeID, nodeId) || UUIDsEqual(c.TargetNodeID, nodeId)\n );\n this.Connections = this.Connections.filter(\n c => !UUIDsEqual(c.SourceNodeID, nodeId) && !UUIDsEqual(c.TargetNodeID, nodeId)\n );\n for (const conn of orphaned) {\n this.ConnectionRemoved.emit(conn);\n }\n this.NodeRemoved.emit(node);\n this.NodesChanged.emit(this.Nodes);\n this.ConnectionsChanged.emit(this.Connections);\n this.cdr.detectChanges();\n }\n\n private removeConnectionById(connId: string): void {\n const conn = this.Connections.find(c => UUIDsEqual(c.ID, connId));\n if (!conn) return;\n\n this.Connections = this.Connections.filter(c => !UUIDsEqual(c.ID, connId));\n this.ConnectionRemoved.emit(conn);\n this.ConnectionsChanged.emit(this.Connections);\n this.cdr.detectChanges();\n }\n\n // ── Keyboard Shortcuts ─────────────────────────────────────\n\n @HostListener('keydown', ['$event'])\n protected onKeyDown(event: KeyboardEvent): void {\n if (this.ReadOnly) return;\n\n const isCtrlOrMeta = event.ctrlKey || event.metaKey;\n\n if (event.key === 'Delete' || event.key === 'Backspace') {\n // Don't delete if user is typing in an input\n const target = event.target as HTMLElement;\n if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.tagName === 'SELECT') {\n return;\n }\n event.preventDefault();\n this.DeleteSelected();\n } else if (isCtrlOrMeta && event.key === 'z' && !event.shiftKey) {\n event.preventDefault();\n this.Undo();\n } else if (isCtrlOrMeta && (event.key === 'y' || (event.key === 'z' && event.shiftKey))) {\n event.preventDefault();\n this.Redo();\n } else if (isCtrlOrMeta && event.key === 'a') {\n event.preventDefault();\n this.fFlow?.selectAll();\n }\n }\n\n // ── TrackBy Functions ───────────────────────────────────────\n\n protected trackNodeById(_index: number, node: FlowNode): string {\n return node.ID;\n }\n\n protected trackConnectionById(_index: number, conn: FlowConnection): string {\n return conn.ID;\n }\n\n // ── Helper Methods ─────────────────────────────────────────\n\n GetTypeConfig(type: string): FlowNodeTypeConfig | null {\n return this.NodeTypes.find(nt => nt.Type === type) ?? null;\n }\n\n /** Get the connectable side string for Foblex based on port side */\n GetConnectableSide(side: string | undefined): string {\n switch (side) {\n case 'left': return 'left';\n case 'right': return 'right';\n case 'top': return 'top';\n case 'bottom': return 'bottom';\n default: return 'auto';\n }\n }\n\n get SelectedCount(): number {\n return this.selectedNodeIDs.length + this.selectedConnectionIDs.length;\n }\n\n /** @deprecated Use {@link SelectedCount}. */\n get selectedCount(): number {\n return this.SelectedCount;\n }\n\n private pushUndoState(): void {\n this.stateService.PushState(this.Nodes, this.Connections);\n }\n\n private updateZoomLevel(scale: number): void {\n this.zoomLevel = Math.round(scale * 100);\n this.cdr.detectChanges();\n }\n\n private findNodeByPortId(portId: string): string | null {\n for (const node of this.Nodes) {\n for (const port of node.Ports) {\n if (UUIDsEqual(port.ID, portId)) {\n return node.ID;\n }\n }\n }\n // When fConnectOnNode is enabled, Foblex may send the node ID itself\n // instead of a port ID. Check for a direct node ID match as fallback.\n const directMatch = this.Nodes.find(n => UUIDsEqual(n.ID, portId));\n if (directMatch) {\n return directMatch.ID;\n }\n return null;\n }\n\n /**\n * When fConnectOnNode is enabled, Foblex may send a node ID instead of a port ID.\n * This resolves the raw ID to the correct port ID for the given direction.\n */\n private resolvePortId(rawId: string, nodeId: string, direction: 'input' | 'output'): string {\n const node = this.Nodes.find(n => UUIDsEqual(n.ID, nodeId));\n if (!node) return rawId;\n\n // If the rawId already matches a port on this node, use it as-is\n const exactPort = node.Ports.find(p => UUIDsEqual(p.ID, rawId));\n if (exactPort) return rawId;\n\n // Otherwise, find the first port matching the expected direction\n const dirPort = node.Ports.find(p => p.Direction === direction);\n return dirPort ? dirPort.ID : rawId;\n }\n\n private createDefaultNode(config: FlowNodeTypeConfig, position: FlowPosition): FlowNode {\n const id = this.generateId();\n const defaultPorts = config.DefaultPorts ?? [\n { ID: `${id}-input`, Direction: 'input' as const, Side: 'top' as const, Multiple: true },\n { ID: `${id}-output`, Direction: 'output' as const, Side: 'bottom' as const, Multiple: true }\n ];\n\n return {\n ID: id,\n Type: config.Type,\n Label: config.Label,\n Icon: config.Icon,\n Status: 'default',\n Position: position,\n Ports: defaultPorts.map(p => ({\n ...p,\n ID: p.ID.startsWith(id) ? p.ID : `${id}-${p.ID}`\n }))\n };\n }\n\n private removeSelectedItems(): void {\n // Remove selected connections\n const selectedConnections = new Set(this.selectedConnectionIDs.map(id => NormalizeUUID(id)));\n const removedConnections = this.Connections.filter(c => selectedConnections.has(NormalizeUUID(c.ID)));\n this.Connections = this.Connections.filter(c => !selectedConnections.has(NormalizeUUID(c.ID)));\n for (const conn of removedConnections) {\n this.ConnectionRemoved.emit(conn);\n }\n\n // Remove selected nodes and their connections\n const deletedNodeIDs = new Set(this.selectedNodeIDs.map(id => NormalizeUUID(id)));\n const removedNodes = this.Nodes.filter(n => deletedNodeIDs.has(NormalizeUUID(n.ID)));\n this.Nodes = this.Nodes.filter(n => !deletedNodeIDs.has(NormalizeUUID(n.ID)));\n\n // Also remove connections attached to deleted nodes\n const orphanedConnections = this.Connections.filter(\n c => deletedNodeIDs.has(NormalizeUUID(c.SourceNodeID)) || deletedNodeIDs.has(NormalizeUUID(c.TargetNodeID))\n );\n this.Connections = this.Connections.filter(\n c => !deletedNodeIDs.has(NormalizeUUID(c.SourceNodeID)) && !deletedNodeIDs.has(NormalizeUUID(c.TargetNodeID))\n );\n\n for (const conn of orphanedConnections) {\n this.ConnectionRemoved.emit(conn);\n }\n for (const node of removedNodes) {\n this.NodeRemoved.emit(node);\n }\n\n this.NodesChanged.emit(this.Nodes);\n this.ConnectionsChanged.emit(this.Connections);\n this.cdr.detectChanges();\n }\n\n private generateId(): string {\n return 'flow-' + Math.random().toString(36).substring(2, 11);\n }\n}\n\nfunction defaultContextMenuItems(target: FlowContextMenuTarget): FlowContextMenuItem[] {\n const noun = target === 'node' ? 'Node' : 'Connection';\n return [\n { ID: 'edit', Label: `Edit ${noun}`, Icon: 'fa-pen-to-square' },\n { ID: 'remove', Label: `Remove ${noun}`, Icon: 'fa-trash-can', Danger: true },\n ];\n}\n","<div class=\"mj-flow-editor\" [class.mj-flow-editor--readonly]=\"ReadOnly\" tabindex=\"0\">\n\n <!-- Canvas Toolbar — shown / minimized / hidden (recover tab). Align is left/center/right. -->\n @if (ShowToolbar && EffectiveToolbarVisibility === 'shown') {\n <div class=\"mj-flow-editor-toolbar-area\" [attr.data-align]=\"ToolbarAlign\">\n <mj-flow-toolbar\n [ZoomLevel]=\"zoomLevel\"\n [ShowGrid]=\"ShowGrid\"\n [ShowMinimap]=\"ShowMinimap\"\n [ShowLegend]=\"ShowLegend\"\n [ReadOnly]=\"ReadOnly\"\n [PanMode]=\"panMode\"\n (ZoomInClicked)=\"ZoomIn()\"\n (ZoomOutClicked)=\"ZoomOut()\"\n (FitToScreenClicked)=\"ZoomToFit()\"\n (AutoLayoutClicked)=\"AutoArrange()\"\n (GridToggled)=\"onGridToggled($event)\"\n (MinimapToggled)=\"onMinimapToggled($event)\"\n (LegendToggled)=\"onLegendToggled($event)\"\n (PanModeToggled)=\"onPanModeToggled($event)\"\n (MinimizeClicked)=\"SetToolbarVisibility('minimized')\"\n (HideClicked)=\"SetToolbarVisibility('hidden')\">\n </mj-flow-toolbar>\n </div>\n } @else if (ShowToolbar && EffectiveToolbarVisibility === 'minimized') {\n <button type=\"button\" class=\"mj-flow-editor-toolbar-chip\" [attr.data-align]=\"ToolbarAlign\"\n (click)=\"SetToolbarVisibility('shown')\"\n title=\"Show canvas tools\" aria-label=\"Show canvas tools\">\n <i class=\"fa-solid fa-wrench\" aria-hidden=\"true\"></i>\n </button>\n } @else if (ShowToolbar && EffectiveToolbarVisibility === 'hidden') {\n <button type=\"button\" class=\"mj-flow-editor-toolbar-tab\" [attr.data-align]=\"ToolbarAlign\"\n (click)=\"SetToolbarVisibility('shown')\"\n title=\"Show canvas tools\" aria-label=\"Show canvas tools\">\n <i class=\"fa-solid fa-ellipsis\" aria-hidden=\"true\"></i>\n </button>\n }\n\n <!-- Main Canvas Area -->\n <div class=\"mj-flow-editor-canvas-area\">\n\n <!-- Palette Sidebar -->\n @if (ShowPalette && !ReadOnly) {\n <mj-flow-palette\n [NodeTypes]=\"NodeTypes\"\n (NodeTypeActivated)=\"onPaletteNodeTypeActivated($event)\">\n </mj-flow-palette>\n }\n\n <!-- Foblex Canvas -->\n <div class=\"mj-flow-editor-canvas\" #canvasArea\n [class.mj-flow-editor-canvas--pan-mode]=\"panMode\">\n <f-flow fDraggable\n [fDraggableDisabled]=\"false\"\n [fCanvasMoveTrigger]=\"canvasMoveTriggerFn\"\n [vCellSize]=\"GridSize\"\n [hCellSize]=\"GridSize\"\n [fCellSizeWhileDragging]=\"ShowGrid\"\n (fLoaded)=\"onFlowLoaded()\"\n (fCreateConnection)=\"onCreateConnection($event)\"\n (fReassignConnection)=\"onReassignConnection($event)\"\n (fCreateNode)=\"onCreateNode($event)\"\n (fSelectionChange)=\"onSelectionChange($event)\"\n (fMoveNodes)=\"onNodesMoved($event)\">\n\n <!-- Background grid — MUST be direct child of f-flow (Foblex content projection requires it) -->\n @if (ShowGrid) {\n <f-background>\n <f-circle-pattern [color]=\"'#94a3b8'\" [radius]=\"24\"></f-circle-pattern>\n </f-background>\n }\n\n <!-- Alignment snap lines — direct child of f-flow -->\n @if (!ReadOnly) {\n <f-line-alignment [fAlignThreshold]=\"10\"></f-line-alignment>\n }\n\n <f-canvas fZoom #fZoomRef=\"fComponent\"\n [fZoomMinimum]=\"0.15\"\n [fZoomMaximum]=\"3\"\n [fZoomStep]=\"0.1\"\n [position]=\"canvasPosition\"\n [scale]=\"canvasScale\"\n (fCanvasChange)=\"onCanvasChange($event)\">\n\n <!-- Interactive connection drawing -->\n @if (!ReadOnly) {\n <f-connection-for-create\n fType=\"bezier\"\n [fRadius]=\"8\"\n [fOffset]=\"12\">\n <svg viewBox=\"0 0 10 10\" fMarker type=\"end\"\n orient=\"auto\" [refX]=\"9\" [refY]=\"5\" [height]=\"10\" [width]=\"10\">\n <path d=\"M0 0L10 5L0 10Z\" fill=\"#94a3b8\"/>\n </svg>\n </f-connection-for-create>\n }\n\n <!-- Connections -->\n @for (conn of Connections; track trackConnectionById($index, conn)) {\n <f-connection\n [fConnectionId]=\"conn.ID\"\n [fOutputId]=\"conn.SourcePortID\"\n [fInputId]=\"conn.TargetPortID\"\n fType=\"bezier\"\n fBehavior=\"fixed\"\n [fRadius]=\"8\"\n [fOffset]=\"12\"\n [fSelectionDisabled]=\"false\"\n [fReassignDisabled]=\"ReadOnly\"\n [style.--connection-color]=\"conn.Color || '#94a3b8'\"\n [style.--connection-width.px]=\"conn.StrokeWidth || 2\"\n [class.mj-flow-connection-colored]=\"!!conn.Color\"\n [class.mj-flow-connection-dashed]=\"conn.Style === 'dashed'\"\n [class.mj-flow-connection-dotted]=\"conn.Style === 'dotted'\"\n [class.mj-flow-connection-animated]=\"!!conn.Animated\"\n (click)=\"onConnectionClicked($event, conn)\"\n (contextmenu)=\"onConnectionContextMenu($event, conn)\">\n <!-- Arrow marker -->\n <svg viewBox=\"0 0 10 10\" fMarker type=\"end\"\n orient=\"auto\" [refX]=\"9\" [refY]=\"5\"\n [height]=\"conn.Animated ? 16 : 10\"\n [width]=\"conn.Animated ? 16 : 10\">\n <path d=\"M0 0L10 5L0 10Z\" [attr.fill]=\"conn.Color || '#94a3b8'\"/>\n </svg>\n <!-- Connection label -->\n @if (conn.Label) {\n <div fConnectionContent [position]=\"0.5\"\n class=\"mj-flow-connection-label\"\n [style.backgroundColor]=\"ConnectionLabelBackground\"\n [style.borderColor]=\"ConnectionLabelBorderColor\"\n [style.color]=\"ConnectionLabelTextColor\"\n [title]=\"conn.LabelDetail || conn.Label || ''\">\n @if (conn.LabelIcon) {\n <i\n class=\"fa-solid mj-flow-connection-label-icon\"\n [ngClass]=\"conn.LabelIcon\"\n [style.color]=\"conn.LabelIconColor || 'inherit'\"></i>\n }\n {{ conn.Label }}\n </div>\n }\n </f-connection>\n }\n\n <!-- Nodes -->\n @for (node of Nodes; track trackNodeById($index, node)) {\n <mj-flow-node\n fNode\n fDragHandle\n [fNodeId]=\"node.ID\"\n [fNodePosition]=\"{ x: node.Position.X, y: node.Position.Y }\"\n [fNodeDraggingDisabled]=\"ReadOnly || panMode || node.Locked === true\"\n [fNodeSelectionDisabled]=\"panMode\"\n [fConnectOnNode]=\"!ReadOnly && !panMode\"\n [Node]=\"node\"\n [TypeConfig]=\"GetTypeConfig(node.Type)\"\n [ReadOnly]=\"ReadOnly\"\n (contextmenu)=\"onNodeContextMenu($event, node)\">\n </mj-flow-node>\n }\n\n </f-canvas>\n\n <!-- Rubber-band selection — direct child of f-flow -->\n @if (!ReadOnly) {\n <f-selection-area></f-selection-area>\n }\n\n <!-- Minimap -->\n @if (ShowMinimap) {\n <div class=\"mj-flow-editor-minimap\" fDragBlocker>\n <f-minimap [fMinSize]=\"1500\"></f-minimap>\n </div>\n }\n </f-flow>\n\n <!-- Legend -->\n @if (ShowLegend && Nodes.length > 0) {\n <div class=\"mj-flow-editor-legend\">\n <div class=\"mj-flow-editor-legend-title\">Legend</div>\n <div class=\"mj-flow-editor-legend-section\">\n <div class=\"mj-flow-editor-legend-heading\">Connections</div>\n <div class=\"mj-flow-editor-legend-item\">\n <svg class=\"mj-flow-editor-legend-line-svg\" width=\"28\" height=\"10\"><line x1=\"0\" y1=\"5\" x2=\"28\" y2=\"5\" stroke=\"#64748b\" stroke-width=\"2\"/></svg>\n <span>Only exit path</span>\n </div>\n <div class=\"mj-flow-editor-legend-item\">\n <svg class=\"mj-flow-editor-legend-line-svg\" width=\"28\" height=\"10\"><line x1=\"0\" y1=\"5\" x2=\"28\" y2=\"5\" stroke=\"#16a34a\" stroke-width=\"2\"/></svg>\n <i class=\"fa-solid fa-circle-check\" style=\"color:#16a34a;font-size:10px;\"></i>\n <span>Default (fallback)</span>\n </div>\n <div class=\"mj-flow-editor-legend-item\">\n <svg class=\"mj-flow-editor-legend-line-svg\" width=\"28\" height=\"10\"><line x1=\"0\" y1=\"5\" x2=\"28\" y2=\"5\" stroke=\"#f59e0b\" stroke-width=\"2\" stroke-dasharray=\"5 3\"/></svg>\n <span>Conditional</span>\n </div>\n <div class=\"mj-flow-editor-legend-item\">\n <svg class=\"mj-flow-editor-legend-line-svg\" width=\"28\" height=\"10\"><line x1=\"0\" y1=\"5\" x2=\"28\" y2=\"5\" stroke=\"#ef4444\" stroke-width=\"2\"/></svg>\n <i class=\"fa-solid fa-triangle-exclamation\" style=\"color:#ef4444;font-size:10px;\"></i>\n <span>Duplicate defaults</span>\n </div>\n </div>\n <div class=\"mj-flow-editor-legend-section\">\n <div class=\"mj-flow-editor-legend-heading\">Step Types</div>\n <div class=\"mj-flow-editor-legend-item\">\n <span class=\"mj-flow-editor-legend-swatch\" style=\"background:#3B82F6\"></span>\n <span>Action</span>\n </div>\n <div class=\"mj-flow-editor-legend-item\">\n <span class=\"mj-flow-editor-legend-swatch\" style=\"background:#8B5CF6\"></span>\n <span>Prompt</span>\n </div>\n <div class=\"mj-flow-editor-legend-item\">\n <span class=\"mj-flow-editor-legend-swatch\" style=\"background:#10B981\"></span>\n <span>Sub-Agent</span>\n </div>\n <div class=\"mj-flow-editor-legend-item\">\n <span class=\"mj-flow-editor-legend-swatch\" style=\"background:#F59E0B\"></span>\n <span>For Each</span>\n </div>\n <div class=\"mj-flow-editor-legend-item\">\n <span class=\"mj-flow-editor-legend-swatch\" style=\"background:#F97316\"></span>\n <span>While</span>\n </div>\n </div>\n <div class=\"mj-flow-editor-legend-section\">\n <div class=\"mj-flow-editor-legend-heading\">Borders</div>\n <div class=\"mj-flow-editor-legend-item\">\n <span class=\"mj-flow-editor-legend-box\" style=\"border-color:#16a34a;background:#f0fdf4;\"></span>\n <span>Start node</span>\n </div>\n <div class=\"mj-flow-editor-legend-item\">\n <span class=\"mj-flow-editor-legend-box\" style=\"border-color:#ef4444;background:#fef2f2;\"></span>\n <i class=\"fa-solid fa-triangle-exclamation\" style=\"color:#ea580c;font-size:10px;\"></i>\n <span>Missing config</span>\n </div>\n </div>\n </div>\n }\n\n <!-- Empty state overlay -->\n @if (Nodes.length === 0) {\n <div class=\"mj-flow-editor-empty\">\n <mj-empty-state\n Icon=\"fa-solid fa-diagram-project\"\n [Title]=\"EmptyStateTitle\">\n @if (!ReadOnly) {\n <p class=\"mj-flow-editor-empty-subtitle\">\n Or use auto-layout after adding steps to arrange them automatically\n </p>\n }\n </mj-empty-state>\n </div>\n }\n </div>\n </div>\n\n <!-- Context Menu -->\n @if (contextMenuVisible) {\n <div\n class=\"mj-flow-context-menu\"\n [style.left.px]=\"contextMenuX\"\n [style.top.px]=\"contextMenuY\"\n (click)=\"$event.stopPropagation()\">\n @for (item of contextMenuItems; track item.ID; let last = $last) {\n <button type=\"button\" class=\"mj-flow-context-menu-item\"\n [class.mj-flow-context-menu-item--danger]=\"item.Danger\"\n [disabled]=\"item.Disabled\"\n (click)=\"onContextMenuAction(item.ID)\">\n @if (item.Icon) {\n <i class=\"fa-solid\" [ngClass]=\"item.Icon\"></i>\n }\n <span>{{ item.Label }}</span>\n @if (item.Shortcut) {\n <kbd class=\"mj-flow-context-menu-shortcut\">{{ item.Shortcut }}</kbd>\n }\n </button>\n @if (!last && item.Danger !== contextMenuItems[$index + 1]?.Danger) {\n <div class=\"mj-flow-context-menu-divider\"></div>\n }\n }\n </div>\n }\n\n <!-- Status Bar -->\n @if (ShowStatusBar) {\n <mj-flow-status-bar\n [NodeCount]=\"Nodes.length\"\n [ConnectionCount]=\"Connections.length\"\n [SelectedCount]=\"selectedCount\"\n [ZoomLevel]=\"zoomLevel\">\n </mj-flow-status-bar>\n }\n</div>\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"flow-node.component.js","sourceRoot":"","sources":["../../../src/lib/components/flow-node.component.ts","../../../src/lib/components/flow-node.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, ViewEncapsulation, ChangeDetectionStrategy } from '@angular/core';\nimport { FlowNode, FlowNodeTypeConfig } from '../interfaces/flow-types';\n\n/**\n * Renders a single node in the flow canvas.\n * Applied with Foblex's fNode directive in the parent FlowEditorComponent template.\n * Contains input/output ports via Foblex's fNodeInput/fNodeOutput directives.\n */\n@Component({\n standalone: false,\n selector: 'mj-flow-node',\n templateUrl: './flow-node.component.html',\n styleUrls: ['./flow-node.component.css'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class FlowNodeComponent {\n @Input() Node!: FlowNode;\n @Input() TypeConfig: FlowNodeTypeConfig | null = null;\n @Input() ReadOnly = false;\n @Input() Compact = false;\n\n get headerColor(): string {\n return this.TypeConfig?.Color ?? '#6B7280';\n }\n\n get nodeIcon(): string {\n return this.Node?.Icon ?? this.TypeConfig?.Icon ?? 'fa-circle-nodes';\n }\n\n get logoURL(): string | null {\n return (this.Node?.Data?.['LogoURL'] as string) ?? null;\n }\n\n get statusClass(): string {\n return this.Node?.Status ?? 'default';\n }\n\n get statusIcon(): string {\n switch (this.Node?.Status) {\n case 'success': return 'fa-check-circle';\n case 'error': return 'fa-times-circle';\n case 'warning': return 'fa-exclamation-triangle';\n case 'running': return 'fa-spinner fa-spin';\n case 'disabled': return 'fa-ban';\n case 'pending': return 'fa-clock';\n default: return '';\n }\n }\n\n get hasStatus(): boolean {\n return this.Node?.Status != null && this.Node.Status !== 'default';\n }\n\n /** Debugger chrome: this step is waiting for Continue / Step, not executing. */\n get isAwaitingUser(): boolean {\n return this.Node?.Data?.['AwaitingUser'] === true;\n }\n\n /** Prerequisites are done; the dispatcher has not claimed it yet. */\n get isQueued(): boolean {\n return !this.isAwaitingUser && this.Node?.Data?.['NextToRun'] === true;\n }\n\n get isExecuting(): boolean {\n return !this.isAwaitingUser && this.Node?.Status === 'running';\n }\n\n get inputPort(): { ID: string; Side: string; Multiple: boolean; Disabled: boolean } | null {\n const port = this.Node?.Ports?.find(p => p.Direction === 'input');\n if (!port) return null;\n return {\n ID: port.ID,\n Side: port.Side ?? 'top',\n Multiple: port.Multiple !== false,\n Disabled: port.Disabled === true\n };\n }\n\n get outputPort(): { ID: string; Side: string; Multiple: boolean; Disabled: boolean } | null {\n const port = this.Node?.Ports?.find(p => p.Direction === 'output');\n if (!port) return null;\n return {\n ID: port.ID,\n Side: port.Side ?? 'bottom',\n Multiple: port.Multiple !== false,\n Disabled: port.Disabled === true\n };\n }\n\n // ── Loop Node Properties ───────────────────────────────────\n\n /** Whether this node represents a loop (ForEach or While) */\n get isLoopNode(): boolean {\n return this.Node?.Type === 'ForEach' || this.Node?.Type === 'While';\n }\n\n /** Loop body type label (e.g., 'Action', 'Prompt', 'Sub-Agent') */\n get loopBodyType(): string | null {\n return (this.Node?.Data?.['LoopBodyType'] as string) ?? null;\n }\n\n /** Resolved name of the loop body operation */\n get loopBodyName(): string | null {\n return (this.Node?.Data?.['LoopBodyName'] as string) ?? null;\n }\n\n /** Icon for the loop body type */\n get loopBodyIcon(): string {\n return (this.Node?.Data?.['LoopBodyIcon'] as string) ?? 'fa-circle-nodes';\n }\n\n /** Color for the loop body type */\n get loopBodyColor(): string {\n return (this.Node?.Data?.['LoopBodyColor'] as string) ?? '#6B7280';\n }\n\n /** Short iteration summary (e.g., \"over items\" or \"while condition\") */\n get loopIterationSummary(): string {\n return (this.Node?.Data?.['LoopIterationSummary'] as string) ?? '';\n }\n\n /** Max iterations limit, if configured */\n get loopMaxIterations(): number | null {\n const val = this.Node?.Data?.['MaxIterations'];\n return typeof val === 'number' ? val : null;\n }\n\n /** Loop item variable name */\n get loopItemVariable(): string | null {\n return (this.Node?.Data?.['LoopItemVariable'] as string) ?? null;\n }\n}\n","<!-- Input Port -->\n@if (inputPort) {\n <div\n class=\"mj-flow-node-port mj-flow-node-port--input\"\n [class]=\"'mj-flow-node-port--' + inputPort.Side\"\n fNodeInput\n [fInputId]=\"inputPort.ID\"\n [fInputDisabled]=\"inputPort.Disabled\"\n [fInputMultiple]=\"inputPort.Multiple\">\n </div>\n}\n\n<!-- Node Body -->\n<div class=\"mj-flow-node-body\"\n [class.mj-flow-node-body--start]=\"Node.IsStartNode\"\n [class.mj-flow-node-body--loop]=\"isLoopNode\"\n [class.mj-flow-node-body--disabled]=\"Node.Status === 'disabled'\"\n [class.mj-flow-node-body--pending]=\"Node.Status === 'pending'\"\n [class.mj-flow-node-body--skipped]=\"Node.Status === 'skipped'\"\n [class.mj-flow-node-body--running]=\"isExecuting\"\n [class.mj-flow-node-body--queued]=\"isQueued\"\n [class.mj-flow-node-body--awaiting]=\"isAwaitingUser\"\n [class.mj-flow-node-body--warning]=\"Node.Status === 'warning'\"\n [class.mj-flow-node-body--error]=\"Node.Status === 'error'\"\n [class.mj-flow-node-body--success]=\"Node.Status === 'success'\">\n\n <!-- Color accent bar -->\n <div class=\"mj-flow-node-accent\" [style.backgroundColor]=\"headerColor\"></div>\n\n <!-- Header -->\n <div class=\"mj-flow-node-header\">\n <div class=\"mj-flow-node-header-left\">\n @if (logoURL) {\n <img class=\"mj-flow-node-logo\" [src]=\"logoURL\" [alt]=\"Node.Label\" />\n }\n @if (!logoURL) {\n <i class=\"fa-solid mj-flow-node-icon\" [ngClass]=\"nodeIcon\" [style.color]=\"headerColor\"></i>\n }\n <span class=\"mj-flow-node-label\">{{ Node.Label }}</span>\n </div>\n <div class=\"mj-flow-node-header-right\">\n @if (Node.IsStartNode) {\n <span class=\"mj-flow-node-start-badge\">START</span>\n }\n @if (hasStatus) {\n <i\n class=\"fa-solid mj-flow-node-status\"\n [ngClass]=\"statusIcon\"\n [class]=\"'mj-flow-node-status--' + statusClass\"\n [title]=\"Node.StatusMessage || ''\"></i>\n }\n </div>\n </div>\n\n <!-- Subtitle / Configured Item (hidden for loop nodes — they use the body card instead) -->\n @if (Node.Subtitle && !isLoopNode) {\n <div class=\"mj-flow-node-subtitle\">\n {{ Node.Subtitle }}\n </div>\n }\n\n <!-- Type badge -->\n <div class=\"mj-flow-node-type-badge\" [style.color]=\"headerColor\">\n {{ TypeConfig?.Label || Node.Type }}\n </div>\n\n <!-- ═══ Loop Body Card — shown only for ForEach/While nodes ═══ -->\n @if (isLoopNode) {\n <div class=\"mj-flow-loop-section\">\n <!-- Iteration summary line -->\n @if (loopIterationSummary) {\n <div class=\"mj-flow-loop-iteration\">\n <i class=\"fa-solid fa-repeat mj-flow-loop-iteration-icon\"></i>\n <span>{{ loopIterationSummary }}</span>\n @if (loopMaxIterations != null) {\n <span class=\"mj-flow-loop-max\">(max {{ loopMaxIterations }})</span>\n }\n </div>\n }\n <!-- Body type inner card -->\n <div class=\"mj-flow-loop-body\"\n [class.mj-flow-loop-body--empty]=\"!loopBodyType\">\n @if (loopBodyType) {\n <div class=\"mj-flow-loop-body-inner\">\n <div class=\"mj-flow-loop-body-header\">\n <i class=\"fa-solid\" [ngClass]=\"loopBodyIcon\" [style.color]=\"loopBodyColor\"></i>\n <span class=\"mj-flow-loop-body-type\" [style.color]=\"loopBodyColor\">{{ loopBodyType }}</span>\n </div>\n @if (loopBodyName) {\n <div class=\"mj-flow-loop-body-name\" [title]=\"loopBodyName\">\n {{ loopBodyName }}\n </div>\n }\n @if (!loopBodyName) {\n <div class=\"mj-flow-loop-body-name mj-flow-loop-body-name--empty\">\n Not configured\n </div>\n }\n </div>\n }\n @if (!loopBodyType) {\n <div class=\"mj-flow-loop-body-empty\">\n <i class=\"fa-solid fa-circle-question\"></i>\n <span>No body type selected</span>\n </div>\n }\n </div>\n <!-- Item variable badge -->\n @if (loopItemVariable) {\n <div class=\"mj-flow-loop-variable\">\n <i class=\"fa-solid fa-tag\"></i>\n <span>{{ loopItemVariable }}</span>\n </div>\n }\n </div>\n }\n\n @if (isAwaitingUser) {\n <div class=\"mj-flow-node-awaiting-banner\">\n <i class=\"fa-solid fa-pause\" aria-hidden=\"true\"></i>\n <span>Waiting on you — Continue or Step</span>\n </div>\n } @else if (isExecuting) {\n <div class=\"mj-flow-node-running-banner\">\n <i class=\"fa-solid fa-spinner fa-spin\" aria-hidden=\"true\"></i>\n <span>Running</span>\n </div>\n } @else if (isQueued) {\n <div class=\"mj-flow-node-queued-banner\">\n <i class=\"fa-solid fa-hourglass-start\" aria-hidden=\"true\"></i>\n <span>Next — waiting for the engine</span>\n </div>\n }\n\n <!-- Warning banner (shown inline when step is misconfigured) -->\n @if (Node.Status === 'warning' && Node.StatusMessage) {\n <div\n class=\"mj-flow-node-warning-banner\"\n [title]=\"Node.StatusMessage\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <span>{{ Node.StatusMessage }}</span>\n </div>\n }\n\n <!-- Badges row -->\n @if (Node.Badges && Node.Badges.length > 0) {\n <div class=\"mj-flow-node-badges\">\n @for (badge of Node.Badges; track badge) {\n <span\n class=\"mj-flow-node-badge\"\n [style.borderColor]=\"badge.Color || headerColor\"\n [title]=\"badge.Label\">\n @if (badge.Icon) {\n <i class=\"fa-solid\" [ngClass]=\"badge.Icon\"></i>\n }\n {{ badge.Value }}\n </span>\n }\n </div>\n }\n</div>\n\n<!-- Output Port -->\n@if (outputPort) {\n <div\n class=\"mj-flow-node-port mj-flow-node-port--output\"\n [class]=\"'mj-flow-node-port--' + outputPort.Side\"\n fNodeOutput\n [fOutputId]=\"outputPort.ID\"\n [fOutputDisabled]=\"outputPort.Disabled\"\n [fOutputMultiple]=\"outputPort.Multiple\"\n [isSelfConnectable]=\"false\">\n </div>\n}\n"]}
1
+ {"version":3,"file":"flow-node.component.js","sourceRoot":"","sources":["../../../src/lib/components/flow-node.component.ts","../../../src/lib/components/flow-node.component.html"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;;;;;ICE3F,0BAOM;;;IALJ,4DAAgD;IAIhD,AADA,AADA,8CAAyB,6CACY,6CACA;;;IAyBjC,yBAAoE;;;IAArB,AAAhB,sDAAe,0BAAmB;;;IAGjE,wBAA2F;;;IAAhC,2CAA2B;IAAhD,yCAAoB;;;IAM1D,+BAAuC;IAAA,qBAAK;IAAA,iBAAO;;;IAGnD,wBAIuC;;;IADrC,2DAA+C;IACjD,AAFE,2CAAsB,0CAEU;;;IAOtC,+BAAmC;IACjC,YACF;IAAA,iBAAM;;;IADJ,cACF;IADE,qDACF;;;IAiBQ,gCAA+B;IAAA,YAA6B;IAAA,iBAAO;;;IAApC,cAA6B;IAA7B,6DAA6B;;;IAJhE,+BAAoC;IAClC,wBAA8D;IAC9D,4BAAM;IAAA,YAA0B;IAAA,iBAAO;IACvC,kHAAiC;IAGnC,iBAAM;;;IAJE,eAA0B;IAA1B,iDAA0B;IAChC,cAEC;IAFD,2DAEC;;;IAaG,+BAA2D;IACzD,YACF;IAAA,iBAAM;;;IAF8B,2CAAsB;IACxD,cACF;IADE,oDACF;;;IAGA,+BAAkE;IAChE,gCACF;IAAA,iBAAM;;;IAZR,AADF,+BAAqC,cACG;IACpC,wBAA+E;IAC/E,gCAAmE;IAAA,YAAkB;IACvF,AADuF,iBAAO,EACxF;IACN,iHAAoB;IAKpB,iHAAqB;IAKvB,iBAAM;;;IAb2C,eAA6B;IAA7B,6CAA6B;IAAtD,6CAAwB;IACP,cAA6B;IAA7B,6CAA6B;IAAC,cAAkB;IAAlB,yCAAkB;IAEvF,cAIC;IAJD,8CAIC;IACD,cAIC;IAJD,+CAIC;;;IAIH,+BAAqC;IACnC,wBAA2C;IAC3C,4BAAM;IAAA,qCAAqB;IAC7B,AAD6B,iBAAO,EAC9B;;;IAKR,+BAAmC;IACjC,wBAA+B;IAC/B,4BAAM;IAAA,YAAsB;IAC9B,AAD8B,iBAAO,EAC/B;;;IADE,eAAsB;IAAtB,6CAAsB;;;IA3ClC,+BAAkC;IAEhC,mGAA4B;IAU5B,+BACmD;IACjD,mGAAoB;IAkBpB,mGAAqB;IAMvB,iBAAM;IAEN,mGAAwB;IAM1B,iBAAM;;;IA5CJ,cAQC;IARD,sDAQC;IAGC,cAAgD;IAAhD,gEAAgD;IAChD,cAiBC;IAjBD,8CAiBC;IACD,cAKC;IALD,+CAKC;IAGH,cAKC;IALD,kDAKC;;;IAKH,+BAA0C;IACxC,wBAAoD;IACpD,4BAAM;IAAA,sDAAiC;IACzC,AADyC,iBAAO,EAC1C;;;IAEN,+BAAyC;IACvC,wBAA8D;IAC9D,4BAAM;IAAA,uBAAO;IACf,AADe,iBAAO,EAChB;;;IAEN,+BAAwC;IACtC,wBAA8D;IAC9D,4BAAM;IAAA,kDAA6B;IACrC,AADqC,iBAAO,EACtC;;;IAKN,+BAE+B;IAC7B,wBAAgD;IAChD,4BAAM;IAAA,YAAwB;IAChC,AADgC,iBAAO,EACjC;;;IAHJ,iDAA4B;IAEtB,eAAwB;IAAxB,+CAAwB;;;IAaxB,wBAA+C;;;IAA3B,uCAAsB;;;IAL9C,gCAGwB;IACtB,uGAAkB;IAGlB,YACF;IAAA,iBAAO;;;;IANL,oEAAgD;IAChD,sCAAqB;IACrB,cAEC;IAFD,wCAEC;IACD,cACF;IADE,+CACF;;;IAVJ,+BAAiC;IAC/B,uHAUC;IACH,iBAAM;;;IAXJ,cAUC;IAVD,iCAUC;;;IAOL,0BAQM;;;IANJ,6DAAiD;IAKjD,AADA,AADA,AADA,gDAA2B,+CACY,+CACA,4BACZ;;ADxK/B;;;;GAIG;AASH,MAAM,OAAO,iBAAiB;IACnB,IAAI,CAAY;IAChB,UAAU,GAA8B,IAAI,CAAC;IAC7C,QAAQ,GAAG,KAAK,CAAC;IACjB,OAAO,GAAG,KAAK,CAAC;IAEzB,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,UAAU,EAAE,KAAK,IAAI,SAAS,CAAC;IAC7C,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,iBAAiB,CAAC;IACvE,CAAC;IAED,IAAI,OAAO;QACT,OAAQ,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,SAAS,CAAY,IAAI,IAAI,CAAC;IAC1D,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,IAAI,EAAE,MAAM,IAAI,SAAS,CAAC;IACxC,CAAC;IAED,IAAI,UAAU;QACZ,QAAQ,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;YAC1B,KAAK,SAAS,CAAC,CAAC,OAAO,iBAAiB,CAAC;YACzC,KAAK,OAAO,CAAC,CAAC,OAAO,iBAAiB,CAAC;YACvC,KAAK,SAAS,CAAC,CAAC,OAAO,yBAAyB,CAAC;YACjD,KAAK,SAAS,CAAC,CAAC,OAAO,oBAAoB,CAAC;YAC5C,KAAK,UAAU,CAAC,CAAC,OAAO,QAAQ,CAAC;YACjC,KAAK,SAAS,CAAC,CAAC,OAAO,UAAU,CAAC;YAClC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;QACrB,CAAC;IACH,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,IAAI,EAAE,MAAM,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC;IACrE,CAAC;IAED,gFAAgF;IAChF,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IACpD,CAAC;IAED,qEAAqE;IACrE,IAAI,QAAQ;QACV,OAAO,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;IACzE,CAAC;IAED,IAAI,WAAW;QACb,OAAO,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,IAAI,EAAE,MAAM,KAAK,SAAS,CAAC;IACjE,CAAC;IAED,IAAI,SAAS;QACX,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,OAAO,CAAC,CAAC;QAClE,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QACvB,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,KAAK;YACxB,QAAQ,EAAE,IAAI,CAAC,QAAQ,KAAK,KAAK;YACjC,QAAQ,EAAE,IAAI,CAAC,QAAQ,KAAK,IAAI;SACjC,CAAC;IACJ,CAAC;IAED,IAAI,UAAU;QACZ,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC;QACnE,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QACvB,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,QAAQ;YAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ,KAAK,KAAK;YACjC,QAAQ,EAAE,IAAI,CAAC,QAAQ,KAAK,IAAI;SACjC,CAAC;IACJ,CAAC;IAED,8DAA8D;IAE9D,6DAA6D;IAC7D,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,IAAI,EAAE,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC;IACtE,CAAC;IAED,mEAAmE;IACnE,IAAI,YAAY;QACd,OAAQ,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,cAAc,CAAY,IAAI,IAAI,CAAC;IAC/D,CAAC;IAED,+CAA+C;IAC/C,IAAI,YAAY;QACd,OAAQ,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,cAAc,CAAY,IAAI,IAAI,CAAC;IAC/D,CAAC;IAED,kCAAkC;IAClC,IAAI,YAAY;QACd,OAAQ,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,cAAc,CAAY,IAAI,iBAAiB,CAAC;IAC5E,CAAC;IAED,mCAAmC;IACnC,IAAI,aAAa;QACf,OAAQ,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,eAAe,CAAY,IAAI,SAAS,CAAC;IACrE,CAAC;IAED,wEAAwE;IACxE,IAAI,oBAAoB;QACtB,OAAQ,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,sBAAsB,CAAY,IAAI,EAAE,CAAC;IACrE,CAAC;IAED,0CAA0C;IAC1C,IAAI,iBAAiB;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,eAAe,CAAC,CAAC;QAC/C,OAAO,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9C,CAAC;IAED,8BAA8B;IAC9B,IAAI,gBAAgB;QAClB,OAAQ,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,kBAAkB,CAAY,IAAI,IAAI,CAAC;IACnE,CAAC;2GAnHU,iBAAiB;6DAAjB,iBAAiB;YCf9B,mFAAiB;YAYjB,8BAWiE;YAG/D,yBAA6E;YAI3E,AADF,8BAAiC,aACO;YACpC,mFAAe;YAGf,iFAAgB;YAGhB,+BAAiC;YAAA,YAAgB;YACnD,AADmD,iBAAO,EACpD;YACN,8BAAuC;YACrC,sFAAwB;YAGxB,oFAAiB;YAQrB,AADE,iBAAM,EACF;YAGN,sFAAoC;YAOpC,gCAAiE;YAC/D,aACF;YAAA,iBAAM;YAGN,sFAAkB;YA4DhB,AALA,AALF,sFAAsB,gEAKI,gEAKH;YAQvB,sFAAuD;YAUvD,sFAA6C;YAe/C,iBAAM;YAGN,sFAAkB;;YAlKlB,wCASC;YAIC,cAAmD;YAUnD,AADA,AADA,AADA,AADA,AADA,AADA,AADA,AADA,AADA,AADA,gEAAmD,2CACP,+DACoB,6DACF,6DACA,+CACd,2CACJ,mDACQ,6DACU,yDACJ,6DACI;YAG7B,cAAqC;YAArC,mDAAqC;YAKlE,eAEC;YAFD,sCAEC;YACD,cAEC;YAFD,uCAEC;YACgC,eAAgB;YAAhB,oCAAgB;YAGjD,eAEC;YAFD,gDAEC;YACD,cAMC;YAND,yCAMC;YAKL,cAIC;YAJD,gEAIC;YAGoC,cAA2B;YAA3B,wCAA2B;YAC9D,cACF;YADE,wGACF;YAGA,cAgDC;YAhDD,0CAgDC;YAED,cAeC;YAfD,yFAeC;YAGD,eAOC;YAPD,mFAOC;YAGD,cAcC;YAdD,yEAcC;YAIH,cAUC;YAVD,0CAUC;;;iFD7JY,iBAAiB;cAR7B,SAAS;6BACI,KAAK,YACP,cAAc,iBAGT,iBAAiB,CAAC,IAAI,mBACpB,uBAAuB,CAAC,MAAM;;kBAG9C,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kFAJK,iBAAiB","sourcesContent":["import { Component, Input, ViewEncapsulation, ChangeDetectionStrategy } from '@angular/core';\nimport { FlowNode, FlowNodeTypeConfig } from '../interfaces/flow-types';\n\n/**\n * Renders a single node in the flow canvas.\n * Applied with Foblex's fNode directive in the parent FlowEditorComponent template.\n * Contains input/output ports via Foblex's fNodeInput/fNodeOutput directives.\n */\n@Component({\n standalone: false,\n selector: 'mj-flow-node',\n templateUrl: './flow-node.component.html',\n styleUrls: ['./flow-node.component.css'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class FlowNodeComponent {\n @Input() Node!: FlowNode;\n @Input() TypeConfig: FlowNodeTypeConfig | null = null;\n @Input() ReadOnly = false;\n @Input() Compact = false;\n\n get headerColor(): string { // case-violation-ok-legacy-back-compat: object literals are assigned to this class, so an accessor stub changes what they must supply\n return this.TypeConfig?.Color ?? '#6B7280';\n }\n\n get nodeIcon(): string { // case-violation-ok-legacy-back-compat: object literals are assigned to this class, so an accessor stub changes what they must supply\n return this.Node?.Icon ?? this.TypeConfig?.Icon ?? 'fa-circle-nodes';\n }\n\n get logoURL(): string | null { // case-violation-ok-legacy-back-compat: object literals are assigned to this class, so an accessor stub changes what they must supply\n return (this.Node?.Data?.['LogoURL'] as string) ?? null;\n }\n\n get statusClass(): string { // case-violation-ok-legacy-back-compat: object literals are assigned to this class, so an accessor stub changes what they must supply\n return this.Node?.Status ?? 'default';\n }\n\n get statusIcon(): string { // case-violation-ok-legacy-back-compat: object literals are assigned to this class, so an accessor stub changes what they must supply\n switch (this.Node?.Status) {\n case 'success': return 'fa-check-circle';\n case 'error': return 'fa-times-circle';\n case 'warning': return 'fa-exclamation-triangle';\n case 'running': return 'fa-spinner fa-spin';\n case 'disabled': return 'fa-ban';\n case 'pending': return 'fa-clock';\n default: return '';\n }\n }\n\n get hasStatus(): boolean { // case-violation-ok-legacy-back-compat: object literals are assigned to this class, so an accessor stub changes what they must supply\n return this.Node?.Status != null && this.Node.Status !== 'default';\n }\n\n /** Debugger chrome: this step is waiting for Continue / Step, not executing. */\n get isAwaitingUser(): boolean { // case-violation-ok-legacy-back-compat: object literals are assigned to this class, so an accessor stub changes what they must supply\n return this.Node?.Data?.['AwaitingUser'] === true;\n }\n\n /** Prerequisites are done; the dispatcher has not claimed it yet. */\n get isQueued(): boolean { // case-violation-ok-legacy-back-compat: object literals are assigned to this class, so an accessor stub changes what they must supply\n return !this.isAwaitingUser && this.Node?.Data?.['NextToRun'] === true;\n }\n\n get isExecuting(): boolean { // case-violation-ok-legacy-back-compat: object literals are assigned to this class, so an accessor stub changes what they must supply\n return !this.isAwaitingUser && this.Node?.Status === 'running';\n }\n\n get inputPort(): { ID: string; Side: string; Multiple: boolean; Disabled: boolean } | null { // case-violation-ok-legacy-back-compat: object literals are assigned to this class, so an accessor stub changes what they must supply\n const port = this.Node?.Ports?.find(p => p.Direction === 'input');\n if (!port) return null;\n return {\n ID: port.ID,\n Side: port.Side ?? 'top',\n Multiple: port.Multiple !== false,\n Disabled: port.Disabled === true\n };\n }\n\n get outputPort(): { ID: string; Side: string; Multiple: boolean; Disabled: boolean } | null { // case-violation-ok-legacy-back-compat: object literals are assigned to this class, so an accessor stub changes what they must supply\n const port = this.Node?.Ports?.find(p => p.Direction === 'output');\n if (!port) return null;\n return {\n ID: port.ID,\n Side: port.Side ?? 'bottom',\n Multiple: port.Multiple !== false,\n Disabled: port.Disabled === true\n };\n }\n\n // ── Loop Node Properties ───────────────────────────────────\n\n /** Whether this node represents a loop (ForEach or While) */\n get isLoopNode(): boolean { // case-violation-ok-legacy-back-compat: object literals are assigned to this class, so an accessor stub changes what they must supply\n return this.Node?.Type === 'ForEach' || this.Node?.Type === 'While';\n }\n\n /** Loop body type label (e.g., 'Action', 'Prompt', 'Sub-Agent') */\n get loopBodyType(): string | null { // case-violation-ok-legacy-back-compat: object literals are assigned to this class, so an accessor stub changes what they must supply\n return (this.Node?.Data?.['LoopBodyType'] as string) ?? null;\n }\n\n /** Resolved name of the loop body operation */\n get loopBodyName(): string | null { // case-violation-ok-legacy-back-compat: object literals are assigned to this class, so an accessor stub changes what they must supply\n return (this.Node?.Data?.['LoopBodyName'] as string) ?? null;\n }\n\n /** Icon for the loop body type */\n get loopBodyIcon(): string { // case-violation-ok-legacy-back-compat: object literals are assigned to this class, so an accessor stub changes what they must supply\n return (this.Node?.Data?.['LoopBodyIcon'] as string) ?? 'fa-circle-nodes';\n }\n\n /** Color for the loop body type */\n get loopBodyColor(): string { // case-violation-ok-legacy-back-compat: object literals are assigned to this class, so an accessor stub changes what they must supply\n return (this.Node?.Data?.['LoopBodyColor'] as string) ?? '#6B7280';\n }\n\n /** Short iteration summary (e.g., \"over items\" or \"while condition\") */\n get loopIterationSummary(): string { // case-violation-ok-legacy-back-compat: object literals are assigned to this class, so an accessor stub changes what they must supply\n return (this.Node?.Data?.['LoopIterationSummary'] as string) ?? '';\n }\n\n /** Max iterations limit, if configured */\n get loopMaxIterations(): number | null { // case-violation-ok-legacy-back-compat: object literals are assigned to this class, so an accessor stub changes what they must supply\n const val = this.Node?.Data?.['MaxIterations'];\n return typeof val === 'number' ? val : null;\n }\n\n /** Loop item variable name */\n get loopItemVariable(): string | null { // case-violation-ok-legacy-back-compat: object literals are assigned to this class, so an accessor stub changes what they must supply\n return (this.Node?.Data?.['LoopItemVariable'] as string) ?? null;\n }\n}\n","<!-- Input Port -->\n@if (inputPort) {\n <div\n class=\"mj-flow-node-port mj-flow-node-port--input\"\n [class]=\"'mj-flow-node-port--' + inputPort.Side\"\n fNodeInput\n [fInputId]=\"inputPort.ID\"\n [fInputDisabled]=\"inputPort.Disabled\"\n [fInputMultiple]=\"inputPort.Multiple\">\n </div>\n}\n\n<!-- Node Body -->\n<div class=\"mj-flow-node-body\"\n [class.mj-flow-node-body--start]=\"Node.IsStartNode\"\n [class.mj-flow-node-body--loop]=\"isLoopNode\"\n [class.mj-flow-node-body--disabled]=\"Node.Status === 'disabled'\"\n [class.mj-flow-node-body--pending]=\"Node.Status === 'pending'\"\n [class.mj-flow-node-body--skipped]=\"Node.Status === 'skipped'\"\n [class.mj-flow-node-body--running]=\"isExecuting\"\n [class.mj-flow-node-body--queued]=\"isQueued\"\n [class.mj-flow-node-body--awaiting]=\"isAwaitingUser\"\n [class.mj-flow-node-body--warning]=\"Node.Status === 'warning'\"\n [class.mj-flow-node-body--error]=\"Node.Status === 'error'\"\n [class.mj-flow-node-body--success]=\"Node.Status === 'success'\">\n\n <!-- Color accent bar -->\n <div class=\"mj-flow-node-accent\" [style.backgroundColor]=\"headerColor\"></div>\n\n <!-- Header -->\n <div class=\"mj-flow-node-header\">\n <div class=\"mj-flow-node-header-left\">\n @if (logoURL) {\n <img class=\"mj-flow-node-logo\" [src]=\"logoURL\" [alt]=\"Node.Label\" />\n }\n @if (!logoURL) {\n <i class=\"fa-solid mj-flow-node-icon\" [ngClass]=\"nodeIcon\" [style.color]=\"headerColor\"></i>\n }\n <span class=\"mj-flow-node-label\">{{ Node.Label }}</span>\n </div>\n <div class=\"mj-flow-node-header-right\">\n @if (Node.IsStartNode) {\n <span class=\"mj-flow-node-start-badge\">START</span>\n }\n @if (hasStatus) {\n <i\n class=\"fa-solid mj-flow-node-status\"\n [ngClass]=\"statusIcon\"\n [class]=\"'mj-flow-node-status--' + statusClass\"\n [title]=\"Node.StatusMessage || ''\"></i>\n }\n </div>\n </div>\n\n <!-- Subtitle / Configured Item (hidden for loop nodes — they use the body card instead) -->\n @if (Node.Subtitle && !isLoopNode) {\n <div class=\"mj-flow-node-subtitle\">\n {{ Node.Subtitle }}\n </div>\n }\n\n <!-- Type badge -->\n <div class=\"mj-flow-node-type-badge\" [style.color]=\"headerColor\">\n {{ TypeConfig?.Label || Node.Type }}\n </div>\n\n <!-- ═══ Loop Body Card — shown only for ForEach/While nodes ═══ -->\n @if (isLoopNode) {\n <div class=\"mj-flow-loop-section\">\n <!-- Iteration summary line -->\n @if (loopIterationSummary) {\n <div class=\"mj-flow-loop-iteration\">\n <i class=\"fa-solid fa-repeat mj-flow-loop-iteration-icon\"></i>\n <span>{{ loopIterationSummary }}</span>\n @if (loopMaxIterations != null) {\n <span class=\"mj-flow-loop-max\">(max {{ loopMaxIterations }})</span>\n }\n </div>\n }\n <!-- Body type inner card -->\n <div class=\"mj-flow-loop-body\"\n [class.mj-flow-loop-body--empty]=\"!loopBodyType\">\n @if (loopBodyType) {\n <div class=\"mj-flow-loop-body-inner\">\n <div class=\"mj-flow-loop-body-header\">\n <i class=\"fa-solid\" [ngClass]=\"loopBodyIcon\" [style.color]=\"loopBodyColor\"></i>\n <span class=\"mj-flow-loop-body-type\" [style.color]=\"loopBodyColor\">{{ loopBodyType }}</span>\n </div>\n @if (loopBodyName) {\n <div class=\"mj-flow-loop-body-name\" [title]=\"loopBodyName\">\n {{ loopBodyName }}\n </div>\n }\n @if (!loopBodyName) {\n <div class=\"mj-flow-loop-body-name mj-flow-loop-body-name--empty\">\n Not configured\n </div>\n }\n </div>\n }\n @if (!loopBodyType) {\n <div class=\"mj-flow-loop-body-empty\">\n <i class=\"fa-solid fa-circle-question\"></i>\n <span>No body type selected</span>\n </div>\n }\n </div>\n <!-- Item variable badge -->\n @if (loopItemVariable) {\n <div class=\"mj-flow-loop-variable\">\n <i class=\"fa-solid fa-tag\"></i>\n <span>{{ loopItemVariable }}</span>\n </div>\n }\n </div>\n }\n\n @if (isAwaitingUser) {\n <div class=\"mj-flow-node-awaiting-banner\">\n <i class=\"fa-solid fa-pause\" aria-hidden=\"true\"></i>\n <span>Waiting on you — Continue or Step</span>\n </div>\n } @else if (isExecuting) {\n <div class=\"mj-flow-node-running-banner\">\n <i class=\"fa-solid fa-spinner fa-spin\" aria-hidden=\"true\"></i>\n <span>Running</span>\n </div>\n } @else if (isQueued) {\n <div class=\"mj-flow-node-queued-banner\">\n <i class=\"fa-solid fa-hourglass-start\" aria-hidden=\"true\"></i>\n <span>Next — waiting for the engine</span>\n </div>\n }\n\n <!-- Warning banner (shown inline when step is misconfigured) -->\n @if (Node.Status === 'warning' && Node.StatusMessage) {\n <div\n class=\"mj-flow-node-warning-banner\"\n [title]=\"Node.StatusMessage\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <span>{{ Node.StatusMessage }}</span>\n </div>\n }\n\n <!-- Badges row -->\n @if (Node.Badges && Node.Badges.length > 0) {\n <div class=\"mj-flow-node-badges\">\n @for (badge of Node.Badges; track badge) {\n <span\n class=\"mj-flow-node-badge\"\n [style.borderColor]=\"badge.Color || headerColor\"\n [title]=\"badge.Label\">\n @if (badge.Icon) {\n <i class=\"fa-solid\" [ngClass]=\"badge.Icon\"></i>\n }\n {{ badge.Value }}\n </span>\n }\n </div>\n }\n</div>\n\n<!-- Output Port -->\n@if (outputPort) {\n <div\n class=\"mj-flow-node-port mj-flow-node-port--output\"\n [class]=\"'mj-flow-node-port--' + outputPort.Side\"\n fNodeOutput\n [fOutputId]=\"outputPort.ID\"\n [fOutputDisabled]=\"outputPort.Disabled\"\n [fOutputMultiple]=\"outputPort.Multiple\"\n [isSelfConnectable]=\"false\">\n </div>\n}\n"]}
@@ -26,6 +26,8 @@ export declare class FlowPaletteComponent {
26
26
  NodeTypeActivated: EventEmitter<FlowNodeTypeConfig>;
27
27
  /** Handler for the click/keyboard activation on a palette entry. */
28
28
  OnNodeTypeActivated(nodeType: FlowNodeTypeConfig): void;
29
+ get Categories(): string[];
30
+ /** @deprecated Use {@link Categories}. */
29
31
  get categories(): string[];
30
32
  GetTypesForCategory(category: string): FlowNodeTypeConfig[];
31
33
  /** Converts a hex color to rgba with the given opacity for background tinting */
@@ -1 +1 @@
1
- {"version":3,"file":"flow-palette.component.d.ts","sourceRoot":"","sources":["../../../src/lib/components/flow-palette.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,YAAY,EAA6D,MAAM,eAAe,CAAC;AACnH,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;;AAE9D;;;;;;;;;;;;GAYG;AACH,qBAQa,oBAAoB;IACtB,SAAS,EAAE,kBAAkB,EAAE,CAAM;IACrC,SAAS,UAAS;IAE3B;;;;;OAKG;IACO,iBAAiB,mCAA0C;IAErE,oEAAoE;IACpE,mBAAmB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,IAAI;IAIvD,IAAI,UAAU,IAAI,MAAM,EAAE,CAQzB;IAED,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,EAAE;IAM3D,iFAAiF;IACjF,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM;yCAlCtD,oBAAoB;2CAApB,oBAAoB;CA+ChC"}
1
+ {"version":3,"file":"flow-palette.component.d.ts","sourceRoot":"","sources":["../../../src/lib/components/flow-palette.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,YAAY,EAA6D,MAAM,eAAe,CAAC;AACnH,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;;AAE9D;;;;;;;;;;;;GAYG;AACH,qBAQa,oBAAoB;IACtB,SAAS,EAAE,kBAAkB,EAAE,CAAM;IACrC,SAAS,UAAS;IAE3B;;;;;OAKG;IACO,iBAAiB,mCAA0C;IAErE,oEAAoE;IACpE,mBAAmB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,IAAI;IAIvD,IAAI,UAAU,IAAI,MAAM,EAAE,CAQzB;IAED,0CAA0C;IAC1C,IAAI,UAAU,IAAI,MAAM,EAAE,CAEzB;IAED,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,EAAE;IAM3D,iFAAiF;IACjF,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM;yCAvCtD,oBAAoB;2CAApB,oBAAoB;CAoDhC"}
@@ -78,7 +78,7 @@ export class FlowPaletteComponent {
78
78
  OnNodeTypeActivated(nodeType) {
79
79
  this.NodeTypeActivated.emit(nodeType);
80
80
  }
81
- get categories() {
81
+ get Categories() {
82
82
  const cats = new Set();
83
83
  for (const nt of this.NodeTypes) {
84
84
  if (nt.Draggable !== false) {
@@ -87,6 +87,10 @@ export class FlowPaletteComponent {
87
87
  }
88
88
  return Array.from(cats);
89
89
  }
90
+ /** @deprecated Use {@link Categories}. */
91
+ get categories() {
92
+ return this.Categories;
93
+ }
90
94
  GetTypesForCategory(category) {
91
95
  return this.NodeTypes.filter(nt => nt.Draggable !== false && (nt.Category ?? 'General') === category);
92
96
  }
@@ -1 +1 @@
1
- {"version":3,"file":"flow-palette.component.js","sourceRoot":"","sources":["../../../src/lib/components/flow-palette.component.ts","../../../src/lib/components/flow-palette.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, EventEmitter, Input, Output, ViewEncapsulation, ChangeDetectionStrategy } from '@angular/core';\nimport { FlowNodeTypeConfig } from '../interfaces/flow-types';\n\n/**\n * Palette sidebar for creating new nodes — **click it or drag it**.\n *\n * Foblex's `fExternalItem` directive supplies drag-to-canvas placement, which is the precise\n * gesture when the author cares where the box lands. It is not, however, the only gesture people\n * try: a palette that looks like a list of buttons gets clicked, and for a long time a click here\n * produced *nothing at all* — the item was a bare `<div>` with no click binding, so the interaction\n * never even reached the editor. The entry is now a real `<button>`, which restores the click, the\n * keyboard (Enter/Space), and the focus ring for free, and emits {@link NodeTypeActivated}.\n *\n * Both gestures converge on the same `NodeAdded` event in `FlowEditorComponent` — one code path, so\n * a host that handles the drop automatically handles the click.\n */\n@Component({\n standalone: false,\n selector: 'mj-flow-palette',\n templateUrl: './flow-palette.component.html',\n styleUrls: ['./flow-palette.component.css'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class FlowPaletteComponent {\n @Input() NodeTypes: FlowNodeTypeConfig[] = [];\n @Input() Collapsed = false;\n\n /**\n * A palette entry was clicked (or activated from the keyboard).\n *\n * Carries the whole config rather than the type string so the host does not have to look it back\n * up — the palette already resolved it, and re-resolving is where a silent mismatch would live.\n */\n @Output() NodeTypeActivated = new EventEmitter<FlowNodeTypeConfig>();\n\n /** Handler for the click/keyboard activation on a palette entry. */\n OnNodeTypeActivated(nodeType: FlowNodeTypeConfig): void {\n this.NodeTypeActivated.emit(nodeType);\n }\n\n get categories(): string[] {\n const cats = new Set<string>();\n for (const nt of this.NodeTypes) {\n if (nt.Draggable !== false) {\n cats.add(nt.Category ?? 'General');\n }\n }\n return Array.from(cats);\n }\n\n GetTypesForCategory(category: string): FlowNodeTypeConfig[] {\n return this.NodeTypes.filter(nt =>\n nt.Draggable !== false && (nt.Category ?? 'General') === category\n );\n }\n\n /** Converts a hex color to rgba with the given opacity for background tinting */\n GetBgColor(hexColor: string | undefined, opacity: number): string {\n if (!hexColor) return 'transparent';\n // Handle standard 6-digit hex colors\n const match = hexColor.match(/^#?([0-9a-fA-F]{6})$/);\n if (match) {\n const r = parseInt(match[1].substring(0, 2), 16);\n const g = parseInt(match[1].substring(2, 4), 16);\n const b = parseInt(match[1].substring(4, 6), 16);\n return `rgba(${r}, ${g}, ${b}, ${opacity})`;\n }\n // Fallback: return the color as-is with opacity via CSS\n return hexColor;\n }\n}\n","<div class=\"mj-flow-palette\" [class.mj-flow-palette--collapsed]=\"Collapsed\">\n <div class=\"mj-flow-palette-header\">\n <i class=\"fa-solid fa-puzzle-piece\"></i>\n @if (!Collapsed) {\n <span>Steps</span>\n }\n </div>\n\n @if (!Collapsed) {\n <div class=\"mj-flow-palette-content\">\n @for (category of categories; track category) {\n <div class=\"mj-flow-palette-category\">\n <div class=\"mj-flow-palette-category-label\">{{ category }}</div>\n @for (nodeType of GetTypesForCategory(category); track nodeType) {\n <!-- A real <button>, not a <div>: clicking a palette entry is the gesture most people\n try first, and it used to do literally nothing. The button also brings keyboard\n activation and a focus ring with it. fExternalItem still supplies drag-to-place. -->\n <button\n type=\"button\"\n class=\"mj-flow-palette-item\"\n fExternalItem\n [fData]=\"nodeType.Type\"\n [title]=\"'Click to add a ' + nodeType.Label + ', or drag it onto the canvas'\"\n (click)=\"OnNodeTypeActivated(nodeType)\">\n <span class=\"mj-flow-palette-item-icon\" [style.backgroundColor]=\"GetBgColor(nodeType.Color, 0.08)\" [style.color]=\"nodeType.Color\">\n <i class=\"fa-solid\" [ngClass]=\"nodeType.Icon\"></i>\n </span>\n <span class=\"mj-flow-palette-item-label\">{{ nodeType.Label }}</span>\n </button>\n }\n </div>\n }\n </div>\n }\n</div>\n"]}
1
+ {"version":3,"file":"flow-palette.component.js","sourceRoot":"","sources":["../../../src/lib/components/flow-palette.component.ts","../../../src/lib/components/flow-palette.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, EventEmitter, Input, Output, ViewEncapsulation, ChangeDetectionStrategy } from '@angular/core';\nimport { FlowNodeTypeConfig } from '../interfaces/flow-types';\n\n/**\n * Palette sidebar for creating new nodes — **click it or drag it**.\n *\n * Foblex's `fExternalItem` directive supplies drag-to-canvas placement, which is the precise\n * gesture when the author cares where the box lands. It is not, however, the only gesture people\n * try: a palette that looks like a list of buttons gets clicked, and for a long time a click here\n * produced *nothing at all* — the item was a bare `<div>` with no click binding, so the interaction\n * never even reached the editor. The entry is now a real `<button>`, which restores the click, the\n * keyboard (Enter/Space), and the focus ring for free, and emits {@link NodeTypeActivated}.\n *\n * Both gestures converge on the same `NodeAdded` event in `FlowEditorComponent` — one code path, so\n * a host that handles the drop automatically handles the click.\n */\n@Component({\n standalone: false,\n selector: 'mj-flow-palette',\n templateUrl: './flow-palette.component.html',\n styleUrls: ['./flow-palette.component.css'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class FlowPaletteComponent {\n @Input() NodeTypes: FlowNodeTypeConfig[] = [];\n @Input() Collapsed = false;\n\n /**\n * A palette entry was clicked (or activated from the keyboard).\n *\n * Carries the whole config rather than the type string so the host does not have to look it back\n * up — the palette already resolved it, and re-resolving is where a silent mismatch would live.\n */\n @Output() NodeTypeActivated = new EventEmitter<FlowNodeTypeConfig>();\n\n /** Handler for the click/keyboard activation on a palette entry. */\n OnNodeTypeActivated(nodeType: FlowNodeTypeConfig): void {\n this.NodeTypeActivated.emit(nodeType);\n }\n\n get Categories(): string[] {\n const cats = new Set<string>();\n for (const nt of this.NodeTypes) {\n if (nt.Draggable !== false) {\n cats.add(nt.Category ?? 'General');\n }\n }\n return Array.from(cats);\n }\n\n /** @deprecated Use {@link Categories}. */\n get categories(): string[] {\n return this.Categories;\n }\n\n GetTypesForCategory(category: string): FlowNodeTypeConfig[] {\n return this.NodeTypes.filter(nt =>\n nt.Draggable !== false && (nt.Category ?? 'General') === category\n );\n }\n\n /** Converts a hex color to rgba with the given opacity for background tinting */\n GetBgColor(hexColor: string | undefined, opacity: number): string {\n if (!hexColor) return 'transparent';\n // Handle standard 6-digit hex colors\n const match = hexColor.match(/^#?([0-9a-fA-F]{6})$/);\n if (match) {\n const r = parseInt(match[1].substring(0, 2), 16);\n const g = parseInt(match[1].substring(2, 4), 16);\n const b = parseInt(match[1].substring(4, 6), 16);\n return `rgba(${r}, ${g}, ${b}, ${opacity})`;\n }\n // Fallback: return the color as-is with opacity via CSS\n return hexColor;\n }\n}\n","<div class=\"mj-flow-palette\" [class.mj-flow-palette--collapsed]=\"Collapsed\">\n <div class=\"mj-flow-palette-header\">\n <i class=\"fa-solid fa-puzzle-piece\"></i>\n @if (!Collapsed) {\n <span>Steps</span>\n }\n </div>\n\n @if (!Collapsed) {\n <div class=\"mj-flow-palette-content\">\n @for (category of categories; track category) {\n <div class=\"mj-flow-palette-category\">\n <div class=\"mj-flow-palette-category-label\">{{ category }}</div>\n @for (nodeType of GetTypesForCategory(category); track nodeType) {\n <!-- A real <button>, not a <div>: clicking a palette entry is the gesture most people\n try first, and it used to do literally nothing. The button also brings keyboard\n activation and a focus ring with it. fExternalItem still supplies drag-to-place. -->\n <button\n type=\"button\"\n class=\"mj-flow-palette-item\"\n fExternalItem\n [fData]=\"nodeType.Type\"\n [title]=\"'Click to add a ' + nodeType.Label + ', or drag it onto the canvas'\"\n (click)=\"OnNodeTypeActivated(nodeType)\">\n <span class=\"mj-flow-palette-item-icon\" [style.backgroundColor]=\"GetBgColor(nodeType.Color, 0.08)\" [style.color]=\"nodeType.Color\">\n <i class=\"fa-solid\" [ngClass]=\"nodeType.Icon\"></i>\n </span>\n <span class=\"mj-flow-palette-item-label\">{{ nodeType.Label }}</span>\n </button>\n }\n </div>\n }\n </div>\n }\n</div>\n"]}