{"version":3,"file":"verben-workflow-ui-src-lib-components-designer.mjs","sources":["../../../projects/verben-workflow-ui/src/lib/components/designer/components/wf-toolbar.component.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/components/label-editor.component.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/wf-state.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/label-management.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/components/swimlane-label.component.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/components/swimlane-popup.component.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/swimlane-stats.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/canvas-state.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/node-finder.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/node-selection.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/keyboard-handler.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/rendering.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/orthogonal-router.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/connection-segment-interaction.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/connection.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/wf-mapper.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/wf-persistence.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/node-precondition.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/components/node-selector.component.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/viewport.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/position-update.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/node-interaction.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/swimlane-management.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/wf-facade.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/components/wf-canvas.component.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/components/wf-designer.component.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/verben-workflow-ui-src-lib-components-designer.ts"],"sourcesContent":["// components/workflow/toolbar/wf-toolbar.component.ts\nimport { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { WorkflowObjectType } from '../models/types';\n\ninterface ToolbarItem {\n  id: WorkflowObjectType;\n  label: string;\n  icon: string;\n}\n\n@Component({\n  selector: 'wf-toolbar',\n  standalone: true,\n  imports: [CommonModule],\n  template: `\n    <div class=\"toolbar\">\n      @for (item of toolbarItems; track item.id) {\n      <button\n        class=\"tool-button\"\n        [class.active]=\"selectedTool === item.id\"\n        (click)=\"onToolSelect(item.id)\"\n      >\n        <img [src]=\"item.icon\" [alt]=\"item.label\" class=\"tool-icon\" />\n      </button>\n      }\n    </div>\n  `,\n  styles: [\n    `\n      .toolbar {\n        display: flex;\n        padding: 0.5rem;\n        gap: 0.5rem;\n        background: white;\n        border: 1px solid #aa00ff;\n        border-radius: 7px;\n        box-shadow: 4px 4px 4px 3px #00000040;\n      }\n\n      .tool-button {\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        border: 1px solid #e5e7eb;\n        border-radius: 0.375rem;\n        background: white;\n        cursor: pointer;\n        transition: all 0.2s;\n\n        &:hover {\n          background: #f9fafb;\n        }\n\n        &.active {\n          background: #f3e8ff;\n          border-color: #d8b4fe;\n        }\n      }\n\n      .tool-icon {\n      }\n    `,\n  ],\n})\nexport class WFToolbarComponent {\n  @Input() selectedTool: WorkflowObjectType | null = null;\n  @Output() toolSelected = new EventEmitter<WorkflowObjectType | null>();\n\n  toolbarItems: ToolbarItem[] = [\n    { id: 'swimlane', label: 'Swimlane', icon: 'icons/swimlane.svg' },\n    { id: 'stage', label: 'Stage', icon: 'icons/stage.svg' },\n    { id: 'action', label: 'Action', icon: 'icons/action.svg' },\n    { id: 'form', label: 'Form', icon: 'icons/form.svg' },\n    // { id: 'decision', label: 'Decision', icon: 'icons/decision.svg' },\n    { id: 'decision', label: 'Decision', icon: 'icons/stage.svg' },\n    { id: 'subflow', label: 'Subflow', icon: 'icons/subflow.svg' },\n  ];\n\n  onToolSelect(toolId: WorkflowObjectType): void {\n    // If same tool is selected, deselect it\n    this.toolSelected.emit(this.selectedTool === toolId ? null : toolId);\n  }\n}\n","// components/label-editor.component.ts\nimport { CommonModule } from '@angular/common';\nimport {\n  Component,\n  ElementRef,\n  EventEmitter,\n  HostListener,\n  Input,\n  Output,\n  ViewChild,\n} from '@angular/core';\n\n@Component({\n  selector: 'wf-label-editor',\n  standalone: true,\n  imports: [CommonModule],\n  template: `\n    <div\n      class=\"label-container\"\n      [class.editing]=\"isEditing\"\n      [class.swimlane-label]=\"isSwimlane\"\n    >\n      @if (isEditing) {\n      <input\n        #labelInput\n        type=\"text\"\n        [value]=\"label\"\n        (blur)=\"finishEditing()\"\n        (keyup.enter)=\"finishEditing()\"\n        (keyup.escape)=\"cancelEditing()\"\n        class=\"label-input\"\n        [class.swimlane-input]=\"isSwimlane\"\n        [style.width.px]=\"Math.max(100, label.length * 8)\"\n      />\n      } @else {\n      <span\n        (dblclick)=\"startEditing()\"\n        class=\"label-text\"\n        [class.connection-label]=\"isConnection\"\n        [class.swimlane-text]=\"isSwimlane\"\n      >\n        {{ label }}\n        <svg (click)=\"openDialog.emit($event)\" class=\"edit-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 15 15\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n          <path d=\"M8.78934 3.19845L11.8027 6.21184M12.1148 2.0038L12.9974 2.8864C13.5858 3.47481 13.5858 4.42879 12.9974 5.01719L4.26925 13.7453H1.25586V10.7319L9.98399 2.0038C10.5724 1.4154 11.5264 1.4154 12.1148 2.0038Z\" stroke=\"#3479E9\" stroke-linecap=\"square\"/>\n        </svg>\n      </span>\n      }\n    </div>\n  `,\n  styles: [\n    `\n      :host {\n        display: block;\n        width: 100%;\n        height: 100%;\n      }\n      .label-container {\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        min-width: 50px;\n        z-index: 1000;\n      }\n\n      .label-container.editing {\n        background: white;\n        padding: 2px;\n        border-radius: 4px;\n        box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n      }\n\n      .label-input {\n        padding: 2px 4px;\n        border: 1px solid #d36cff;\n        border-radius: 2px;\n        font-size: 12px;\n        font-family: inherit;\n        outline: none;\n\n        &.swimlane-input {\n          font-size: 14px;\n          font-weight: 500;\n          min-width: 150px;\n        }\n      }\n\n      .label-text {\n        cursor: text;\n        user-select: none;\n        font-size: 12px;\n        pointer-events: all;\n        display: inline-block;\n        min-width: 20px;\n        min-height: 14px;\n        position: relative;\n      }\n\n      .connection-label {\n        background: white;\n        padding: 2px 4px;\n        border: 1px solid #e5e7eb;\n        border-radius: 2px;\n      }\n\n      .swimlane-text {\n        font-size: 14px;\n        font-weight: 500;\n        color: #64748b;\n      }\n\n      .swimlane-label {\n        position: absolute;\n        left: 20px;\n      }\n\n      .edit-icon {\n        position: absolute;\n        right: -14px;\n        top: -14px;\n        cursor: pointer;\n      }\n    `,\n  ],\n})\nexport class LabelEditorComponent {\n  @Input() label = '';\n  @Input() x = 0;\n  @Input() y = 0;\n  @Input() isConnection = false;\n  @Input() isSwimlane = false;\n  @Output() labelChange = new EventEmitter<string>();\n  @Output() openDialog = new EventEmitter();\n\n  @ViewChild('labelInput') labelInput!: ElementRef<HTMLInputElement>;\n\n  isEditing = false;\n  protected readonly Math = Math;\n\n  getEditorPosition(): string {\n    // const offsetX = this.isConnection ? -25 : -25; // Center the label\n    // const offsetY = -10; // Slight upward offset to center vertically\n\n    const offsetX = this.isConnection ? 0 : 0; // Center the label\n    const offsetY = 0; // Slight upward offset to center vertically\n\n    // return `translate(${this.x + offsetX}px, ${this.y + offsetY}px)`;\n    return `translate(50%, 50%)`;\n  }\n\n  getLabelStyle(): any {\n    if (this.isEditing) return {};\n\n    return {\n      'text-anchor': 'middle',\n      'dominant-baseline': 'middle',\n      'pointer-events': 'all',\n    };\n  }\n\n  startEditing(): void {\n    this.isEditing = true;\n    setTimeout(() => {\n      if (this.labelInput) {\n        this.labelInput.nativeElement.focus();\n        this.labelInput.nativeElement.select();\n      }\n    });\n  }\n\n  finishEditing(): void {\n    if (this.isEditing) {\n      const newValue = this.labelInput.nativeElement.value.trim();\n      if (newValue && newValue !== this.label) {\n        this.labelChange.emit(newValue);\n      }\n      this.isEditing = false;\n    }\n  }\n\n  cancelEditing(): void {\n    this.isEditing = false;\n  }\n\n  @HostListener('document:keydown.escape')\n  onEscapePress(): void {\n    this.cancelEditing();\n  }\n}\n","// services/wf-state.service.ts\nimport { Injectable, computed, inject, signal } from '@angular/core';\nimport {\n  WorkflowObject,\n  Position,\n  WorkflowObjectType,\n  Action,\n} from '../models/types';\nimport { SwimlaneManagementService } from './swimlane-management.service';\n\ninterface WorkflowState {\n  objects: WorkflowObject[];\n  selectedObjectId: string | null;\n  selectedTool: WorkflowObjectType | null;\n}\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class WorkflowStateService {\n  state = signal<WorkflowState>({\n    objects: [],\n    selectedObjectId: null,\n    selectedTool: null,\n  });\n\n  // Computed signals for better reactivity\n  readonly objects = computed(() => this.state().objects);\n  readonly selectedObjectId = computed(() => this.state().selectedObjectId);\n  readonly selectedTool = computed(() => this.state().selectedTool);\n  // private swimlaneManagement = inject(SwimlaneManagementService);\n\n  // Computed signals for filtered objects\n  readonly nodes = computed(() =>\n    this.objects().filter(\n      (obj) => obj.type !== 'swimlane' && obj.type !== 'action'\n    )\n  );\n\n  readonly swimlanes = computed(() =>\n    this.objects().filter((obj) => obj.type === 'swimlane')\n  );\n\n  readonly connections = computed(\n    () => this.objects().filter((obj) => obj.type === 'action') as Action[]\n  );\n\n  addObject(object: WorkflowObject): void {\n    this.state.update((state) => ({\n      ...state,\n      objects: [...state.objects, object],\n    }));\n  }\n\n  updateObject(id: string, changes: Partial<WorkflowObject>): void {\n    this.state.update((state) => ({\n      ...state,\n      objects: state.objects.map((obj) =>\n        obj.id === id ? { ...obj, ...changes } : obj\n      ),\n    }));\n  }\n\n  updateMultipleObjects(\n    updates: { id: string; changes: Partial<WorkflowObject> }[]\n  ): void {\n    this.state.update((state) => ({\n      ...state,\n      objects: state.objects.map((obj) => {\n        const update = updates.find((u) => u.id === obj.id);\n        return update ? { ...obj, ...update.changes } : obj;\n      }),\n    }));\n  }\n\n  removeObject(id: string): void {\n    this.state.update((state) => ({\n      ...state,\n      objects: state.objects.filter((obj) => obj.id !== id),\n    }));\n  }\n\n  setSelectedTool(tool: WorkflowObjectType | null): void {\n    this.state.update((state) => ({ ...state, selectedTool: tool }));\n  }\n\n  setSelectedObject(id: string | null): void {\n    this.state.update((state) => ({ ...state, selectedObjectId: id }));\n  }\n\n  getObjectById(id: string): WorkflowObject | undefined {\n    return this.objects().find((obj) => obj.id === id);\n  }\n\n  // Initialize workflow with default objects\n  initializeWorkflow(): void {\n    const swimlaneHeight = 260;\n\n    const swimlane: WorkflowObject = {\n      id: crypto.randomUUID(),\n      type: 'swimlane',\n      position: { x: 0, y: 0 },\n      size: { width: 3000 - 40, height: swimlaneHeight },\n      label: 'Default Swimlane',\n    };\n\n    // Position start node vertically centered in the swimlane\n    const startNodeHeight = 46; // Height of start node\n    const startY = (swimlaneHeight - startNodeHeight) / 2;\n    const startNode: WorkflowObject = {\n      id: crypto.randomUUID(),\n      type: 'start',\n      position: { x: 50, y: startY },\n      size: { width: 58, height: startNodeHeight },\n      label: 'Start',\n    };\n\n    const initialConnection: WorkflowObject = {\n      id: crypto.randomUUID(),\n      type: 'action',\n      position: startNode.position,\n      size: { width: 0, height: 0 },\n      label: '',\n      fromId: startNode.id,\n      toId: '',\n      points: [\n        {\n          x: startNode.position.x + startNode.size.width,\n          y: startNode.position.y + startNode.size.height / 2,\n        },\n        {\n          x: startNode.position.x + startNode.size.width + 50,\n          y: startNode.position.y + startNode.size.height / 2,\n        },\n      ],\n    } as WorkflowObject;\n\n    this.state.set({\n      ...this.state(),\n      objects: [swimlane, startNode, initialConnection],\n    });\n  }\n}\n","// services/label-management.service.ts\nimport { Injectable, inject } from '@angular/core';\nimport { WorkflowStateService } from './wf-state.service';\nimport { Position, WorkflowObject, Action } from '../models/types';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class LabelManagementService {\n  private workflowState = inject(WorkflowStateService);\n\n  updateLabel(objectId: string, newLabel: string): void {\n    this.workflowState.updateObject(objectId, { label: newLabel });\n  }\n\n  getLabelPosition(object: WorkflowObject): Position {\n    if (object.type === 'action') {\n      return this.getConnectionLabelPosition(object as Action);\n    }\n\n    // // // For regular nodes, use SVG coordinates\n    // if (object.type === 'swimlane') {\n    //   return {\n    //     x: 100, // Fixed position for swimlane labels\n    //     y: object.position.y + 20,\n    //   };\n    // }\n\n    // For regular nodes, use SVG coordinates\n    // For swimlanes, position label at the left side\n    if (object.type === 'swimlane') {\n      return {\n        x: object.position.x + 20, // Small indent from left edge\n        y: object.position.y + object.size.height / 2, // Vertically centered\n      };\n    }\n\n    return {\n      x: object.position.x + object.size.width / 2,\n      y: object.position.y + object.size.height / 2,\n    };\n  }\n\n  private getConnectionLabelPosition(connection: Action): Position {\n    if (!connection.points || connection.points.length < 2) {\n      return { x: 0, y: 0 };\n    }\n\n    // Find the middle point of the connection\n    const midIndex = Math.floor(connection.points.length / 2);\n    const point1 = connection.points[midIndex - 1];\n    const point2 = connection.points[midIndex];\n\n    return {\n      x: (point1.x + point2.x) / 2,\n      y: (point1.y + point2.y) / 2 - 10, // Offset above the line\n    };\n  }\n\n  getSVGTextPosition(object: WorkflowObject): { x: number; y: number } {\n    // Center the label for all node types\n    const centerX = object.size.width / 2;\n    let centerY = object.size.height / 2;\n\n    // Adjust position for form type\n    if (object.type === 'form') {\n      centerY = object.size.height + 20; // Position below the form\n    }\n\n    return { x: centerX, y: centerY };\n  }\n}\n","// components/workflow/swimlane-label.component.ts\nimport { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { LabelEditorComponent } from './label-editor.component';\n\n@Component({\n  selector: '[wf-swimlane-label]',\n  standalone: true,\n  imports: [CommonModule, LabelEditorComponent],\n  template: `\n    <svg:g>\n      <!-- Plus icon at top -->\n      <svg:g\n        transform=\"translate(0, 20)\"\n        class=\"cursor-pointer\"\n        (click)=\"onAddClick($event)\"\n      >\n        <svg:circle r=\"10\" fill=\"white\" stroke=\"#D8B4FE\" stroke-width=\"1\" />\n        <svg:path\n          d=\"M-6 0h12 M0 -6v12\"\n          stroke=\"#9333EA\"\n          stroke-width=\"2\"\n          stroke-linecap=\"round\"\n        />\n      </svg:g>\n\n      <!-- Label in middle with edit support -->\n      <svg:g transform=\"translate(0, 120)\">\n        <svg:foreignObject\n          x=\"-60\"\n          y=\"-12\"\n          width=\"180\"\n          height=\"24\"\n          transform=\"rotate(-90)\"\n        >\n          <xhtml:div\n            xmlns=\"http://www.w3.org/1999/xhtml\"\n            style=\"width: 100%; height: 100%;\"\n          >\n            <wf-label-editor\n              [label]=\"label\"\n              [x]=\"0\"\n              [y]=\"0\"\n              (labelChange)=\"onLabelChange($event)\"\n            />\n          </xhtml:div>\n        </svg:foreignObject>\n      </svg:g>\n\n      <!-- Count badge at bottom -->\n      <svg:g transform=\"translate(0, 200)\">\n        <svg:rect\n          x=\"-15\"\n          y=\"-10\"\n          width=\"20\"\n          height=\"20\"\n          rx=\"20\"\n          fill=\"#F3E8FF\"\n          stroke=\"#D8B4FE\"\n        />\n        <svg:text\n          x=\"0\"\n          y=\"4\"\n          text-anchor=\"middle\"\n          font-size=\"12\"\n          fill=\"#7E22CE\"\n          font-weight=\"500\"\n          transform=\"rotate(-90)\"\n        >\n          {{ count }}\n        </svg:text>\n      </svg:g>\n    </svg:g>\n  `,\n  styles: [\n    `\n      :host {\n        display: block;\n      }\n\n      circle:hover {\n        fill: #f3e8ff;\n      }\n    `,\n  ],\n})\nexport class SwimlaneLabelComponent {\n  @Input() label = '';\n  @Input() count = 0;\n\n  @Output() addClick = new EventEmitter<MouseEvent>();\n  @Output() labelChange = new EventEmitter<string>();\n\n  onAddClick(event: MouseEvent): void {\n    event.stopPropagation();\n    this.addClick.emit(event);\n  }\n\n  onLabelChange(newLabel: string): void {\n    this.labelChange.emit(newLabel);\n  }\n}\n","// components/workflow/swimlane-popup.component.ts\nimport { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Position } from '../models/types';\n\n@Component({\n  selector: 'wf-swimlane-popup',\n  standalone: true,\n  imports: [CommonModule],\n  template: `\n    <div \n      class=\"fixed bg-white rounded-lg shadow-lg border border-slate-200 p-4 min-w-[200px]\"\n      [style.left.px]=\"position.x\"\n      [style.top.px]=\"position.y\"\n    >\n      <div class=\"flex justify-between items-center mb-4\">\n        <h3 class=\"text-sm font-medium text-slate-900\">Swimlane Actions</h3>\n        <button \n          class=\"text-slate-400 hover:text-slate-600\"\n          (click)=\"close.emit()\"\n        >×</button>\n      </div>\n\n      <div class=\"space-y-2\">\n        <button \n          *ngFor=\"let action of actions\"\n          class=\"w-full text-left px-3 py-2 text-sm text-slate-700 hover:bg-purple-50 rounded-md\"\n          (click)=\"onActionClick(action)\"\n        >\n          {{ action.label }}\n        </button>\n      </div>\n    </div>\n  `\n})\nexport class SwimLanePopupComponent {\n  @Input() position!: Position;\n  @Output() close = new EventEmitter<void>();\n  @Output() actionSelected = new EventEmitter<string>();\n\n  actions = [\n    { id: 'add-above', label: 'Add Swimlane Above' },\n    { id: 'add-below', label: 'Add Swimlane Below' },\n    { id: 'delete', label: 'Delete Swimlane' },\n  ];\n\n  onActionClick(action: { id: string, label: string }): void {\n    this.actionSelected.emit(action.id);\n    this.close.emit();\n  }\n}","// services/swimlane-stats.service.ts\nimport { Injectable, inject, signal } from '@angular/core';\nimport { Position, WorkflowObject } from '../models/types';\nimport { WorkflowStateService } from './wf-state.service';\n\ninterface SwimlanePopupState {\n  isOpen: boolean;\n  position: Position;\n  swimlaneId: string | null;\n}\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class SwimlaneStatsService {\n  private workflowState = inject(WorkflowStateService);\n\n  private popupState = signal<SwimlanePopupState>({\n    isOpen: false,\n    position: { x: 0, y: 0 },\n    swimlaneId: null,\n  });\n\n  readonly popupStatus = this.popupState.asReadonly();\n\n  getNodeCount(swimlaneId: string): number {\n    const nodes = this.workflowState.nodes();\n    return nodes.filter((node) => this.isNodeInSwimlane(node, swimlaneId))\n      .length;\n  }\n\n  private isNodeInSwimlane(node: WorkflowObject, swimlaneId: string): boolean {\n    const swimlane = this.workflowState.getObjectById(swimlaneId);\n    if (!swimlane) return false;\n\n    return (\n      node.position.y >= swimlane.position.y &&\n      node.position.y <= swimlane.position.y + swimlane.size.height\n    );\n  }\n\n  openPopup(position: Position, swimlaneId: string): void {\n    this.popupState.set({\n      isOpen: true,\n      position,\n      swimlaneId,\n    });\n  }\n\n  closePopup(): void {\n    this.popupState.update((state) => ({ ...state, isOpen: false }));\n  }\n}\n","// services/canvas-state.service.ts\nimport { Injectable, signal } from '@angular/core';\nimport { Position } from '../models/types';\n\nexport interface CanvasState {\n  width: number;\n  height: number;\n  gridSize: number;\n  isConnecting: boolean;\n  isDragging: boolean;\n  dragStartPosition: Position | null;\n  dragOffset: Position;\n  connectionPreview: Position[] | null;\n}\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class CanvasStateService {\n  private state = signal<CanvasState>({\n    width: 3000,\n    height: 2000,\n    gridSize: 20,\n    isConnecting: false,\n    isDragging: false,\n    dragStartPosition: null,\n    dragOffset: { x: 0, y: 0 },\n    connectionPreview: null,\n  });\n\n  readonly canvasState = this.state.asReadonly();\n\n  setConnecting(isConnecting: boolean): void {\n    this.state.update((state) => ({ ...state, isConnecting }));\n  }\n\n  setDragging(isDragging: boolean): void {\n    this.state.update((state) => ({ ...state, isDragging }));\n  }\n\n  setDragStartPosition(position: Position | null): void {\n    this.state.update((state) => ({ ...state, dragStartPosition: position }));\n  }\n\n  setDragOffset(offset: Position): void {\n    this.state.update((state) => ({ ...state, dragOffset: offset }));\n  }\n\n  setConnectionPreview(points: Position[] | null): void {\n    this.state.update((state) => ({ ...state, connectionPreview: points }));\n  }\n\n  resetInteractionState(): void {\n    this.state.update((state) => ({\n      ...state,\n      isConnecting: false,\n      isDragging: false,\n      dragStartPosition: null,\n      dragOffset: { x: 0, y: 0 },\n      connectionPreview: null,\n    }));\n  }\n}\n","// services/node-finder.service.ts\nimport { Injectable, inject } from '@angular/core';\nimport { Position, WorkflowObject } from '../models/types';\nimport { WorkflowStateService } from './wf-state.service';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class NodeFinderService {\n  private workflowState = inject(WorkflowStateService);\n\n  findNodeAtPoint(point: Position): WorkflowObject | null {\n    return (\n      this.workflowState\n        .nodes()\n        .find((node) => this.isPointInNode(point, node)) || null\n    );\n  }\n\n  isPointInNode(point: Position, node: WorkflowObject): boolean {\n    return (\n      point.x >= node.position.x &&\n      point.x <= node.position.x + node.size.width &&\n      point.y >= node.position.y &&\n      point.y <= node.position.y + node.size.height\n    );\n  }\n\n  isProtectedNode(node: WorkflowObject): boolean {\n    return ['start', 'swimlane'].includes(node.type);\n  }\n\n  // Add any other shared node-finding functionality here\n}\n","import { Injectable, inject } from '@angular/core';\nimport { WorkflowObject, Position, Action } from '../models/types';\nimport { NodeInteractionService } from './node-interaction.service';\nimport { CanvasStateService } from './canvas-state.service';\nimport { WorkflowStateService } from './wf-state.service';\nimport { NodeFinderService } from './node-finder.service';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class NodeSelectionService {\n  private workflowState = inject(WorkflowStateService);\n  private nodeFinder = inject(NodeFinderService);\n  private canvasState = inject(CanvasStateService);\n\n  handleNodeClick(point: Position): void {\n    // Clear any ongoing interactions first\n    this.canvasState.resetInteractionState();\n\n    const nodes = this.workflowState.nodes();\n    const clickedNode = this.nodeFinder.findNodeAtPoint(point);\n\n    if (clickedNode) {\n      this.selectNode(clickedNode.id);\n    } else {\n      this.clearSelection();\n    }\n  }\n\n  selectNode(nodeId: string): void {\n    // Don't reselect if already selected\n    if (this.workflowState.selectedObjectId() === nodeId) return;\n\n    this.workflowState.setSelectedObject(nodeId);\n  }\n\n  clearSelection(): void {\n    this.workflowState.setSelectedObject(null);\n  }\n\n  isSelected(nodeId: string): boolean {\n    return this.workflowState.selectedObjectId() === nodeId;\n  }\n\n  getSelectedNode(): WorkflowObject | null {\n    const selectedId = this.workflowState.selectedObjectId();\n    if (!selectedId) return null;\n\n    return this.workflowState.getObjectById(selectedId) || null;\n  }\n\n  canSelectNode(node: WorkflowObject): boolean {\n    // Add any rules for node selection here\n    // For example, prevent selecting swimlanes\n    return node.type !== 'swimlane';\n  }\n\n  handleToolSelection(nodeType: string | null): void {\n    // Clear selection when tool is selected\n    if (nodeType) {\n      this.clearSelection();\n    }\n  }\n\n  handleKeyboardEvent(event: KeyboardEvent): void {\n    // Handle keyboard shortcuts for selection\n    // For example, 'Escape' to clear selection\n    if (event.key === 'Escape') {\n      this.clearSelection();\n    }\n  }\n\n  handleClickOutside(event: MouseEvent): void {\n    // Check if click is outside any node and clear selection\n    const target = event.target as HTMLElement;\n    if (\n      target.tagName === 'svg' ||\n      target.classList.contains('canvas-container')\n    ) {\n      this.clearSelection();\n    }\n  }\n\n  deleteSelectedObject(): void {\n    const selectedId = this.workflowState.selectedObjectId();\n    if (!selectedId) return;\n\n    const selectedObject = this.workflowState.getObjectById(selectedId);\n    if (!selectedObject) return;\n\n    // First, remove any connections to/from this object\n    const connections = this.workflowState.connections();\n    const relatedConnectionIds = connections\n      .filter(\n        (conn: Action) => conn.fromId === selectedId || conn.toId === selectedId\n      )\n      .map((conn) => conn.id);\n\n    // Remove all related connections\n    relatedConnectionIds.forEach((id) => {\n      this.workflowState.removeObject(id);\n    });\n\n    // Remove the selected object\n    this.workflowState.removeObject(selectedId);\n\n    // Clear the selection\n    this.clearSelection();\n  }\n}\n","// services/keyboard-handler.service.ts\nimport { Injectable, inject } from '@angular/core';\nimport { WorkflowStateService } from './wf-state.service';\nimport { NodeSelectionService } from './node-selection.service';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class KeyboardHandlerService {\n  private workflowState = inject(WorkflowStateService);\n  private selection = inject(NodeSelectionService);\n\n  handleKeyDown(event: KeyboardEvent): void {\n    // Only handle keyboard events if an object is selected\n    if (!this.workflowState.selectedObjectId()) return;\n\n    switch (event.key) {\n      case 'Delete':\n      case 'Backspace':\n        this.handleDelete();\n        break;\n      // Add other keyboard shortcuts here\n    }\n  }\n\n  private handleDelete(): void {\n    const selectedId = this.workflowState.selectedObjectId();\n    if (!selectedId) return;\n\n    const selectedObject = this.workflowState.getObjectById(selectedId);\n    if (!selectedObject) return;\n\n    // Don't delete protected nodes like start node or swimlanes\n    if (['start', 'swimlane'].includes(selectedObject.type)) return;\n\n    // Remove the object and its connections\n    this.selection.deleteSelectedObject();\n  }\n}\n","// services/rendering.service.ts\nimport { Injectable } from '@angular/core';\nimport { Position, WorkflowObject, WorkflowObjectType } from '../models/types';\n\nexport interface NodeStyle {\n  fill: string;\n  stroke: string;\n  strokeWidth: number;\n  strokeLinejoin?: string;\n}\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class RenderingService {\n  // Node path generation\n  generateNodePath(object: WorkflowObject): string {\n    switch (object.type) {\n      case 'start':\n        return this.getStartNodePath(object.size.width, object.size.height);\n      case 'decision':\n        return this.getDecisionPath(object.size.width, object.size.height);\n      case 'form':\n        return this.getFormPath(object.size.width, object.size.height);\n      case 'subflow':\n        return this.getSubflowPath(object.size.width, object.size.height);\n      default:\n        return '';\n    }\n  }\n\n  // Individual path generators\n  getStartNodePath(width: number, height: number): string {\n    return `M${width} ${height / 2} \n              A${width / 2} ${height / 2} 0 0 0 \n              0 ${height / 2}\n              A${width / 2} ${height / 2} 0 0 0 \n              ${width} ${height / 2}`;\n  }\n\n  getFormPath(width: number, height: number): string {\n    // Use exact path from design SVG\n    return `M74.0625 40.5591V85.0625C74.0625 87.9716 72.9069 90.7615 70.8498 92.8186C68.7928 94.8756 66.0028 96.0312 63.0938 96.0312H11.9062C8.99716 96.0312 6.20721 94.8756 4.15017 92.8186C2.09313 90.7615 0.9375 87.9716 0.9375 85.0625V11.9375C0.9375 9.02841 2.09313 6.23846 4.15017 4.18142C6.20721 2.12438 8.99716 0.96875 11.9062 0.96875H34.4722C36.4109 0.969043 38.2701 1.73921 39.6412 3.10994L71.9213 35.3901C73.292 36.7611 74.0622 38.6204 74.0625 40.5591Z`;\n  }\n\n  getStartNodePaths(): { circle: string; arrow: string } {\n    return {\n      circle:\n        'M57.5 23C57.5 35.3246 44.8544 45.5 29 45.5C13.1456 45.5 0.5 35.3246 0.5 23C0.5 10.6754 13.1456 0.5 29 0.5C44.8544 0.5 57.5 10.6754 57.5 23Z',\n      arrow: 'M74 6L64 0.226497V11.7735L74 6ZM0 7H65V5H0V7Z',\n    };\n  }\n\n  getNodeStyle(isSelected: boolean): NodeStyle {\n    return {\n      fill: 'white',\n      stroke: '#D36CFF',\n      strokeWidth: isSelected ? 2 : 1,\n      strokeLinejoin: 'round',\n    };\n  }\n\n  getConnectionStyle(isSelected: boolean): Partial<SVGPathElement['style']> {\n    return {\n      stroke: '#D36CFF',\n      strokeWidth: isSelected ? '2' : '1',\n      fill: 'none',\n    };\n  }\n\n  getConnectionPreviewStyle(): Partial<SVGPathElement['style']> {\n    return {\n      stroke: '#D36CFF',\n      strokeWidth: '1',\n      strokeDasharray: '4',\n      fill: 'none',\n    };\n  }\n\n  getSwimlaneStyle(): Partial<SVGRectElement['style']> {\n    return {\n      fill: '#f8fafc',\n      stroke: '#e2e8f0',\n      strokeWidth: '1',\n    };\n  }\n\n  getNodeTransforms(node: WorkflowObject): {\n    node: string;\n    arrow?: string;\n    indicator?: string;\n  } {\n    const baseTransform = `translate(${node.position.x}, ${node.position.y})`;\n\n    switch (node.type) {\n      case 'start':\n        return {\n          node: baseTransform,\n          arrow: 'translate(57, 17)', // Position arrow relative to circle\n        };\n      case 'decision':\n        return {\n          node: baseTransform,\n          indicator: `translate(${node.size.width + 10}, -10)`, // Position properties indicator\n        };\n      default:\n        return { node: baseTransform };\n    }\n  }\n\n  getDecisionNodePath(width: number, height: number): string {\n    return `M${width / 2} 0 L${width} ${height / 2} L${\n      width / 2\n    } ${height} L0 ${height / 2} Z`;\n  }\n\n  getPropertiesIndicator(): {\n    circle: { r: number; style: NodeStyle };\n    text: { content: string; style: Partial<SVGTextElement['style']> };\n  } {\n    return {\n      circle: {\n        r: 8,\n        style: {\n          fill: 'white',\n          stroke: '#D36CFF',\n          strokeWidth: 1,\n        },\n      },\n      text: {\n        content: 'i',\n        style: {\n          fontSize: '12px',\n          textAnchor: 'middle',\n          alignmentBaseline: 'middle',\n          userSelect: 'none',\n          pointerEvents: 'none',\n        },\n      },\n    };\n  }\n\n  getLabelStyle(\n    nodeType: WorkflowObjectType\n  ): Partial<SVGTextElement['style']> {\n    const baseStyle = {\n      fontSize: '12px',\n      textAnchor: 'middle',\n      dominantBaseline: 'middle',\n      userSelect: 'none',\n      pointerEvents: 'none',\n    };\n\n    switch (nodeType) {\n      case 'swimlane':\n        return {\n          ...baseStyle,\n          fontSize: '14px',\n          fontWeight: '500',\n          fill: '#64748b',\n          // writingMode: 'vertical-lr',\n        };\n      default:\n        return baseStyle;\n    }\n  }\n\n  getDefaultDimensions(): { width: number; height: number; gridSize: number } {\n    return {\n      width: 3000,\n      height: 2000,\n      gridSize: 20,\n    };\n  }\n\n  getGridPattern(): {\n    pattern: { width: number; height: number };\n    path: { d: string; style: Partial<SVGPathElement['style']> };\n  } {\n    return {\n      pattern: {\n        width: 20,\n        height: 20,\n      },\n      path: {\n        d: 'M 20 0 L 0 0 0 20',\n        style: {\n          fill: 'none',\n          stroke: '#e2e8f0',\n          strokeWidth: '0.5',\n        },\n      },\n    };\n  }\n\n  // getConnectionPath(points: Position[]): string {\n  //   if (!points || points.length < 2) return '';\n\n  //   const [start, ...rest] = points;\n  //   const end = rest[rest.length - 1];\n\n  //   // Create the main path\n  //   const mainPath =\n  //     `M ${start.x} ${start.y} ` + rest.map((p) => `L ${p.x} ${p.y}`).join(' ');\n\n  //   // Add arrowhead\n  //   const arrowPath = this.createArrowhead(\n  //     end,\n  //     this.getEndPointAngle(points[points.length - 2], end)\n  //   );\n\n  //   return `${mainPath} ${arrowPath}`;\n  // }\n\n  /**\n   * Gets the SVG path for a connection\n   */\n  getConnectionPath(points: Position[]): string {\n    if (!points || points.length < 2) return '';\n\n    // Create the main path\n    const pathCommands = points.map((point, index) => {\n      return index === 0\n        ? `M ${point.x} ${point.y}`\n        : `L ${point.x} ${point.y}`;\n    });\n\n    // Add arrowhead to the last segment\n    const lastSegmentStart = points[points.length - 2];\n    const lastSegmentEnd = points[points.length - 1];\n    const arrowPath = this.createArrowhead(\n      lastSegmentEnd,\n      this.getEndPointAngle(lastSegmentStart, lastSegmentEnd)\n    );\n\n    return `${pathCommands.join(' ')} ${arrowPath}`;\n  }\n\n  /**\n   * Gets style for an individual connection segment\n   */\n  getConnectionSegmentStyle(\n    isSelected: boolean,\n    isHovered: boolean\n  ): Partial<SVGPathElement['style']> {\n    return {\n      stroke: '#D36CFF',\n      strokeWidth: isSelected ? '2' : isHovered ? '2' : '1',\n      fill: 'none',\n      transition: 'stroke-width 0.2s ease',\n    };\n  }\n\n  private createArrowhead(point: Position, angle: number): string {\n    const arrowSize = 10;\n    const arrowPoints = [\n      {\n        x: point.x - arrowSize * Math.cos(angle - Math.PI / 6),\n        y: point.y - arrowSize * Math.sin(angle - Math.PI / 6),\n      },\n      point,\n      {\n        x: point.x - arrowSize * Math.cos(angle + Math.PI / 6),\n        y: point.y - arrowSize * Math.sin(angle + Math.PI / 6),\n      },\n    ];\n\n    return (\n      `M ${arrowPoints[0].x} ${arrowPoints[0].y} ` +\n      `L ${arrowPoints[1].x} ${arrowPoints[1].y} ` +\n      `L ${arrowPoints[2].x} ${arrowPoints[2].y}`\n    );\n  }\n\n  private getEndPointAngle(p1: Position, p2: Position): number {\n    return Math.atan2(p2.y - p1.y, p2.x - p1.x);\n  }\n\n  getDecisionPath(width: number, height: number): string {\n    // Using the exact dimensions from your SVG\n    const centerX = width / 2;\n    const centerY = height / 2;\n    return `M0.981845 ${centerY} L${centerX} 0.580976 L${\n      width - 0.981845\n    } ${centerY} L${centerX} ${height - 0.580976}Z`;\n  }\n\n  getSubflowPath(width: number, height: number): string {\n    // Using the exact dimensions from your SVG\n    return `M1.19873 ${height * 0.252887}L${width / 2} 0.57735L${\n      width - 1.19873\n    } ${height * 0.252887}V${height * 0.747113}L${width / 2} ${\n      height - 0.57735\n    }L1.19873 ${height * 0.747113}V${height * 0.252887}`;\n  }\n}\n","// services/orthogonal-router.service.ts\nimport { Injectable } from '@angular/core';\nimport {\n  ConnectionPoint,\n  NodeSide,\n  Position,\n  RoutingPoint,\n  Size,\n} from '../models/types';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class OrthogonalRouterService {\n  /**\n   * Finds the closest node side and point for a given mouse position\n   */\n  findConnectionPoint(\n    node: { position: Position; size: Size },\n    mousePos: Position\n  ): ConnectionPoint {\n    const { position: pos, size } = node;\n\n    // Calculate distances to each side\n    const distToTop = Math.abs(mousePos.y - pos.y);\n    const distToBottom = Math.abs(mousePos.y - (pos.y + size.height));\n    const distToLeft = Math.abs(mousePos.x - pos.x);\n    const distToRight = Math.abs(mousePos.x - (pos.x + size.width));\n\n    // Find the minimum distance\n    const minDist = Math.min(distToTop, distToBottom, distToLeft, distToRight);\n\n    // Determine connection point based on closest side\n    let side: NodeSide;\n    let x: number;\n    let y: number;\n\n    if (minDist === distToTop) {\n      side = 'top';\n      x = Math.min(Math.max(mousePos.x, pos.x), pos.x + size.width);\n      y = pos.y;\n    } else if (minDist === distToBottom) {\n      side = 'bottom';\n      x = Math.min(Math.max(mousePos.x, pos.x), pos.x + size.width);\n      y = pos.y + size.height;\n    } else if (minDist === distToLeft) {\n      side = 'left';\n      x = pos.x;\n      y = Math.min(Math.max(mousePos.y, pos.y), pos.y + size.height);\n    } else {\n      side = 'right';\n      x = pos.x + size.width;\n      y = Math.min(Math.max(mousePos.y, pos.y), pos.y + size.height);\n    }\n\n    return { x, y, side };\n  }\n\n  /**\n   * Calculates the optimal orthogonal route between two points\n   */\n  calculateRoute(\n    startNode: { position: Position; size: Size },\n    endNode: { position: Position; size: Size },\n    startPoint: ConnectionPoint,\n    endPoint: ConnectionPoint\n  ): RoutingPoint[] {\n    // Convert connection points to routing points\n    const start: RoutingPoint = { ...startPoint, type: 'start' };\n    const end: RoutingPoint = { ...endPoint, type: 'end' };\n\n    // If points are aligned vertically or horizontally, create direct route\n    if (Math.abs(start.x - end.x) < 10) {\n      return this.createVerticalRoute(start, end);\n    }\n    if (Math.abs(start.y - end.y) < 10) {\n      return this.createHorizontalRoute(start, end);\n    }\n\n    // Create route based on connection sides\n    return this.createRouteFromSides(\n      start,\n      end,\n      startPoint.side,\n      endPoint.side\n    );\n  }\n\n  private createRouteFromSides(\n    start: RoutingPoint,\n    end: RoutingPoint,\n    startSide: NodeSide,\n    endSide: NodeSide\n  ): RoutingPoint[] {\n    const points: RoutingPoint[] = [start];\n\n    // Determine if we need to start horizontally or vertically based on the start side\n    const startHorizontal = startSide === 'left' || startSide === 'right';\n    const endHorizontal = endSide === 'left' || endSide === 'right';\n\n    if (startHorizontal) {\n      // Start with horizontal movement\n      const midX = (start.x + end.x) / 2;\n      if (start.y !== end.y) {\n        points.push(this.createBendPoint(midX, start.y, true));\n        points.push(this.createBendPoint(midX, end.y, false));\n      }\n    } else {\n      // Start with vertical movement\n      const midY = (start.y + end.y) / 2;\n      if (start.x !== end.x) {\n        points.push(this.createBendPoint(start.x, midY, false));\n        points.push(this.createBendPoint(end.x, midY, true));\n      }\n    }\n\n    points.push(end);\n    return this.simplifyRoute(points);\n  }\n\n  private createBendPoint(\n    x: number,\n    y: number,\n    isHorizontal: boolean\n  ): RoutingPoint {\n    return { x, y, type: 'bend', isHorizontal };\n  }\n\n  private createHorizontalRoute(\n    start: RoutingPoint,\n    end: RoutingPoint\n  ): RoutingPoint[] {\n    return [start, { ...end, type: 'end', isHorizontal: true }];\n  }\n\n  private createVerticalRoute(\n    start: RoutingPoint,\n    end: RoutingPoint\n  ): RoutingPoint[] {\n    return [start, { ...end, type: 'end', isHorizontal: false }];\n  }\n\n  private simplifyRoute(points: RoutingPoint[]): RoutingPoint[] {\n    // Remove unnecessary bends (where three points form a straight line)\n    const simplified = points.filter((point, index) => {\n      if (index === 0 || index === points.length - 1) return true;\n\n      const prev = points[index - 1];\n      const next = points[index + 1];\n\n      // Keep point if it creates an actual bend\n      return (\n        !(prev.x === point.x && point.x === next.x) &&\n        !(prev.y === point.y && point.y === next.y)\n      );\n    });\n\n    // Update point types and horizontal flags\n    return simplified.map((point, index) => ({\n      ...point,\n      type:\n        index === 0\n          ? 'start'\n          : index === simplified.length - 1\n          ? 'end'\n          : 'bend',\n      isHorizontal:\n        index < simplified.length - 1\n          ? simplified[index + 1].y === point.y\n          : point.y === simplified[index - 1].y,\n    }));\n  }\n\n  /**\n   * Updates a segment's position while maintaining orthogonal constraints\n   */\n  updateSegment(\n    points: RoutingPoint[],\n    segmentIndex: number,\n    newPosition: Position\n  ): RoutingPoint[] {\n    const updatedPoints = [...points];\n    const currentPoint = points[segmentIndex];\n    const nextPoint = points[segmentIndex + 1];\n\n    if (!currentPoint || !nextPoint) return points;\n\n    // Determine if this is a horizontal or vertical segment\n    const isHorizontal = currentPoint.y === nextPoint.y;\n\n    if (isHorizontal) {\n      // Moving a horizontal segment - adjust y coordinate\n      updatedPoints[segmentIndex].y = newPosition.y;\n      updatedPoints[segmentIndex + 1].y = newPosition.y;\n    } else {\n      // Moving a vertical segment - adjust x coordinate\n      updatedPoints[segmentIndex].x = newPosition.x;\n      updatedPoints[segmentIndex + 1].x = newPosition.x;\n    }\n\n    return this.simplifyRoute(updatedPoints);\n  }\n\n  /**\n   * Determines if a point is near enough to a line segment for manipulation\n   */\n  isPointNearSegment(\n    point: Position,\n    segmentStart: Position,\n    segmentEnd: Position,\n    threshold = 10\n  ): boolean {\n    // For horizontal segments\n    if (segmentStart.y === segmentEnd.y) {\n      return (\n        Math.abs(point.y - segmentStart.y) <= threshold &&\n        point.x >= Math.min(segmentStart.x, segmentEnd.x) &&\n        point.x <= Math.max(segmentStart.x, segmentEnd.x)\n      );\n    }\n\n    // For vertical segments\n    if (segmentStart.x === segmentEnd.x) {\n      return (\n        Math.abs(point.x - segmentStart.x) <= threshold &&\n        point.y >= Math.min(segmentStart.y, segmentEnd.y) &&\n        point.y <= Math.max(segmentStart.y, segmentEnd.y)\n      );\n    }\n\n    return false;\n  }\n}\n","// services/connection-segment-interaction.service.ts\nimport { Injectable, inject } from '@angular/core';\nimport { Position, Action } from '../models/types';\nimport { OrthogonalRouterService } from './orthogonal-router.service';\nimport { WorkflowStateService } from './wf-state.service';\n\ninterface SegmentDragState {\n  connectionId: string;\n  segmentIndex: number;\n  initialPosition: Position;\n}\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class ConnectionSegmentInteractionService {\n  private workflowState = inject(WorkflowStateService);\n  private orthogonalRouter = inject(OrthogonalRouterService);\n\n  private dragState: SegmentDragState | null = null;\n\n  /**\n   * Identifies if a point is near any connection segment\n   */\n  findSegmentAtPoint(\n    point: Position\n  ): { connectionId: string; segmentIndex: number } | null {\n    const connections = this.workflowState.connections();\n\n    for (const connection of connections) {\n      const points = connection.points;\n      if (!points || points.length < 2) continue;\n\n      // Check each segment\n      for (let i = 0; i < points.length - 1; i++) {\n        if (\n          this.orthogonalRouter.isPointNearSegment(\n            point,\n            points[i],\n            points[i + 1]\n          )\n        ) {\n          return {\n            connectionId: connection.id,\n            segmentIndex: i,\n          };\n        }\n      }\n    }\n\n    return null;\n  }\n\n  /**\n   * Starts dragging a connection segment\n   */\n  startDragging(\n    connectionId: string,\n    segmentIndex: number,\n    point: Position\n  ): void {\n    this.dragState = {\n      connectionId,\n      segmentIndex,\n      initialPosition: point,\n    };\n  }\n\n  /**\n   * Updates segment position during drag\n   */\n  updateDragging(point: Position): void {\n    if (!this.dragState) return;\n\n    const connection = this.workflowState.getObjectById(\n      this.dragState.connectionId\n    ) as Action;\n    if (!connection || !connection.points) return;\n\n    // Convert Position[] to RoutingPoint[]\n    const routingPoints = connection.points.map((p, index) => ({\n      ...p,\n      type:\n        index === 0\n          ? 'start'\n          : index === connection.points.length - 1\n          ? 'end'\n          : ('bend' as 'start' | 'end' | 'bend'),\n      isHorizontal:\n        index < connection.points.length - 1\n          ? connection.points[index].y === connection.points[index + 1].y\n          : false,\n    }));\n\n    const updatedPoints = this.orthogonalRouter.updateSegment(\n      routingPoints,\n      this.dragState.segmentIndex,\n      point\n    );\n\n    // Convert back to Position[] for storage\n    const positionPoints = updatedPoints.map((p) => ({\n      x: p.x,\n      y: p.y,\n    }));\n\n    this.workflowState.updateObject(connection.id, {\n      points: positionPoints,\n    } as Partial<Action>);\n  }\n  /**\n   * Completes the drag operation\n   */\n  finishDragging(): void {\n    // Additional cleanup if needed\n    this.dragState = null;\n  }\n\n  /**\n   * Returns whether a segment is currently being dragged\n   */\n  isDragging(): boolean {\n    return this.dragState !== null;\n  }\n\n  /**\n   * Gets cursor style based on segment orientation\n   */\n  getSegmentCursor(connectionId: string, segmentIndex: number): string {\n    const connection = this.workflowState.getObjectById(connectionId) as Action;\n    if (!connection || !connection.points) return 'default';\n\n    const point = connection.points[segmentIndex];\n    const nextPoint = connection.points[segmentIndex + 1];\n\n    if (!point || !nextPoint) return 'default';\n\n    // Return appropriate cursor based on segment orientation\n    return point.y === nextPoint.y ? 'ns-resize' : 'ew-resize';\n  }\n}\n","// services/connection.service.ts\nimport { Injectable, inject } from '@angular/core';\nimport {\n  Position,\n  WorkflowObject,\n  Action,\n  ConnectionPoint,\n  NodeSide,\n} from '../models/types';\nimport { CanvasStateService } from './canvas-state.service';\nimport { NodeInteractionService } from './node-interaction.service';\nimport { WorkflowStateService } from './wf-state.service';\nimport { RenderingService } from './rendering.service';\nimport { NodeFinderService } from './node-finder.service';\nimport { OrthogonalRouterService } from './orthogonal-router.service';\nimport { ConnectionSegmentInteractionService } from './connection-segment-interaction.service';\n\nexport interface ConnectionEndpoints {\n  startPoint: ConnectionPoint;\n  endPoint: ConnectionPoint;\n}\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class ConnectionService {\n  private workflowState = inject(WorkflowStateService);\n  private canvasState = inject(CanvasStateService);\n  private nodeFinder = inject(NodeFinderService);\n  private rendering = inject(RenderingService);\n  private orthogonalRouter = inject(OrthogonalRouterService);\n  private segmentInteraction = inject(ConnectionSegmentInteractionService);\n  private connectionEndpoints = new Map<string, ConnectionEndpoints>();\n\n  startConnection(sourceNode: WorkflowObject, point: Position): void {\n    if (!this.canStartConnection(sourceNode)) return;\n\n    const startPoint: ConnectionPoint = {\n      ...this.orthogonalRouter.findConnectionPoint(sourceNode, point),\n      type: 'start',\n      position: point,\n    };\n\n    this.canvasState.setConnecting(true);\n    this.workflowState.setSelectedObject(sourceNode.id);\n\n    // Store the start point for later use\n    const tempId = 'preview';\n    this.connectionEndpoints.set(tempId, {\n      startPoint,\n      endPoint: { ...startPoint }, // Create a new object with the same properties\n    });\n\n    // Calculate initial preview route\n    const previewPoints = this.orthogonalRouter.calculateRoute(\n      sourceNode,\n      { position: point, size: { width: 0, height: 0 } },\n      startPoint,\n      startPoint\n    );\n\n    this.canvasState.setConnectionPreview(previewPoints);\n  }\n\n  updateConnectionPreview(point: Position): void {\n    const sourceNodeId = this.workflowState.selectedObjectId();\n    if (!sourceNodeId) return;\n\n    const sourceNode = this.workflowState.getObjectById(sourceNodeId);\n    if (!sourceNode) return;\n\n    const endpoints = this.connectionEndpoints.get('preview');\n    if (!endpoints) return;\n\n    const endPoint: ConnectionPoint = {\n      x: point.x,\n      y: point.y,\n      side: this.determineEndSide(endpoints.startPoint, point),\n      type: 'end',\n      position: point,\n    };\n\n    // Update preview with new end point\n    const previewPoints = this.orthogonalRouter.calculateRoute(\n      sourceNode,\n      { position: point, size: { width: 0, height: 0 } },\n      endpoints.startPoint,\n      endPoint\n    );\n\n    this.canvasState.setConnectionPreview(previewPoints);\n  }\n\n  finalizeConnection(point: Position): void {\n    const sourceNodeId = this.workflowState.selectedObjectId();\n    if (!sourceNodeId) return;\n\n    const sourceNode = this.workflowState.getObjectById(sourceNodeId);\n    if (!sourceNode) return;\n\n    const targetNode = this.nodeFinder.findNodeAtPoint(point);\n    const endpoints = this.connectionEndpoints.get('preview');\n\n    if (targetNode && endpoints && this.canConnect(sourceNode, targetNode)) {\n      const endPoint: ConnectionPoint = {\n        ...this.orthogonalRouter.findConnectionPoint(targetNode, point),\n        type: 'end',\n        position: point,\n      };\n\n      // Calculate final route\n      const routePoints = this.orthogonalRouter.calculateRoute(\n        sourceNode,\n        targetNode,\n        endpoints.startPoint,\n        endPoint\n      );\n\n      const newConnection: Action = {\n        id: crypto.randomUUID(),\n        type: 'action',\n        fromId: sourceNode.id,\n        toId: targetNode.id,\n        label: '',\n        position: sourceNode.position,\n        size: { width: 0, height: 0 },\n        points: routePoints,\n      };\n\n      // Store the connection endpoints for later use\n      this.connectionEndpoints.set(newConnection.id, {\n        startPoint: endpoints.startPoint,\n        endPoint,\n      });\n\n      this.workflowState.addObject(newConnection);\n    }\n\n    this.connectionEndpoints.delete('preview');\n  }\n\n  updateConnectionsForNode(nodeId: string): void {\n    const node = this.workflowState.getObjectById(nodeId);\n    if (!node) return;\n\n    const connections = this.workflowState\n      .connections()\n      .filter((conn) => conn.fromId === nodeId || conn.toId === nodeId);\n\n    connections.forEach((connection) => {\n      const sourceNode = this.workflowState.getObjectById(connection.fromId);\n      const targetNode = this.workflowState.getObjectById(connection.toId);\n\n      if (sourceNode && targetNode) {\n        // Determine connection points based on current node positions\n        const startPoint: ConnectionPoint = {\n          ...this.orthogonalRouter.findConnectionPoint(sourceNode, {\n            x: sourceNode.position.x + sourceNode.size.width / 2,\n            y: sourceNode.position.y + sourceNode.size.height / 2,\n          }),\n          type: 'start',\n          position: sourceNode.position,\n        };\n\n        const endPoint: ConnectionPoint = {\n          ...this.orthogonalRouter.findConnectionPoint(targetNode, {\n            x: targetNode.position.x + targetNode.size.width / 2,\n            y: targetNode.position.y + targetNode.size.height / 2,\n          }),\n          type: 'end',\n          position: targetNode.position,\n        };\n\n        // Calculate completely new route\n        const newPoints = this.orthogonalRouter.calculateRoute(\n          sourceNode,\n          targetNode,\n          startPoint,\n          endPoint\n        );\n\n        // Update connection\n        this.workflowState.updateObject(connection.id, {\n          points: newPoints,\n        } as Partial<Action>);\n\n        // Store new endpoints\n        this.connectionEndpoints.set(connection.id, { startPoint, endPoint });\n      }\n    });\n  }\n\n  private determineEndSide(\n    startPoint: ConnectionPoint,\n    endPoint: Position\n  ): NodeSide {\n    // Determine the best side for the end point based on relative position\n    const dx = endPoint.x - startPoint.x;\n    const dy = endPoint.y - startPoint.y;\n\n    if (Math.abs(dx) > Math.abs(dy)) {\n      return dx > 0 ? 'left' : 'right';\n    } else {\n      return dy > 0 ? 'top' : 'bottom';\n    }\n  }\n\n  /**\n   * Handles clicking on a connection segment\n   */\n  handleSegmentClick(point: Position): void {\n    const segment = this.segmentInteraction.findSegmentAtPoint(point);\n    if (segment) {\n      this.segmentInteraction.startDragging(\n        segment.connectionId,\n        segment.segmentIndex,\n        point\n      );\n    }\n  }\n\n  /**\n   * Updates segment position during drag\n   */\n  handleSegmentDrag(point: Position): void {\n    if (this.segmentInteraction.isDragging()) {\n      this.segmentInteraction.updateDragging(point);\n    }\n  }\n\n  /**\n   * Completes segment drag operation\n   */\n  finishSegmentDrag(): void {\n    this.segmentInteraction.finishDragging();\n  }\n\n  /**\n   * Gets cursor style for a segment\n   */\n  getSegmentCursor(connectionId: string, segmentIndex: number): string {\n    return this.segmentInteraction.getSegmentCursor(connectionId, segmentIndex);\n  }\n\n  getConnectionPath(connection: Action): string {\n    if (!connection.points || connection.points.length < 2) return '';\n\n    const points = connection.points;\n    const [start, ...rest] = points;\n    return (\n      `M ${start.x} ${start.y} ` + rest.map((p) => `L ${p.x} ${p.y}`).join(' ')\n    );\n  }\n\n  private canStartConnection(node: WorkflowObject): boolean {\n    if (node.type === 'start') {\n      // Start node can only have one outgoing connection\n      return !this.hasOutgoingConnections(node.id);\n    }\n    return ['stage', 'decision', 'form', 'subflow'].includes(node.type);\n  }\n\n  private canConnect(source: WorkflowObject, target: WorkflowObject): boolean {\n    if (!target || source.id === target.id) return false;\n\n    // Prevent connections to start node and swimlanes\n    if (['start', 'swimlane'].includes(target.type)) return false;\n\n    // Prevent duplicate connections\n    return !this.hasConnection(source.id, target.id);\n  }\n\n  private hasConnection(sourceId: string, targetId: string): boolean {\n    return this.workflowState\n      .connections()\n      .some(\n        (conn) =>\n          (conn as Action).fromId === sourceId &&\n          (conn as Action).toId === targetId\n      );\n  }\n\n  getPreviewPath(): string {\n    const preview = this.canvasState.canvasState().connectionPreview;\n    if (!preview || preview.length < 2) return '';\n\n    // Use the rendering service for consistent path generation\n    return this.rendering.getConnectionPath(preview);\n  }\n\n  hasOutgoingConnections(nodeId: string): boolean {\n    return this.workflowState\n      .connections()\n      .some((conn) => (conn as Action).fromId === nodeId);\n  }\n\n  getConnectionPoint(node: WorkflowObject, type: 'input' | 'output'): Position {\n    const center = {\n      x: node.position.x + node.size.width / 2,\n      y: node.position.y + node.size.height / 2,\n    };\n\n    switch (node.type) {\n      case 'stage':\n        return {\n          x:\n            type === 'input'\n              ? node.position.x\n              : node.position.x + node.size.width,\n          y: center.y,\n        };\n      case 'decision':\n        return type === 'input'\n          ? { x: center.x, y: node.position.y }\n          : { x: node.position.x + node.size.width, y: center.y };\n      default:\n        return type === 'input'\n          ? { x: node.position.x, y: center.y }\n          : { x: node.position.x + node.size.width, y: center.y };\n    }\n  }\n\n  recalculateConnectionPoints(\n    source: WorkflowObject,\n    target: WorkflowObject,\n    existingPoints: Position[]\n  ): Position[] {\n    // Start and end points\n    const startPoint = this.getConnectionPoint(source, 'output');\n    const endPoint = this.getConnectionPoint(target, 'input');\n\n    // If it's a simple connection, just return direct path\n    if (existingPoints.length <= 2) {\n      return [startPoint, endPoint];\n    }\n\n    // For complex paths, maintain the middle points' relative positions\n    const middlePoints = existingPoints.slice(1, -1).map((point) => ({\n      x: point.x + (startPoint.x - existingPoints[0].x),\n      y: point.y + (startPoint.y - existingPoints[0].y),\n    }));\n\n    return [startPoint, ...middlePoints, endPoint];\n  }\n\n  // Use nodeFinder methods instead of NodeInteractionService\n  findTargetNode(point: Position): WorkflowObject | null {\n    return this.nodeFinder.findNodeAtPoint(point);\n  }\n}\n","// services/workflow-mapper.service.ts\nimport { Injectable } from '@angular/core';\nimport {\n  WorkflowObject,\n  Position,\n  Action as FrontendAction,\n  Stage,\n  WorkflowMetadata,\n} from '../models/types';\nimport { Tag } from 'verben-workflow-ui/src/lib/models';\nimport { Workflow } from 'verben-workflow-ui/src/lib/models';\nimport { TaskAssignmentType } from 'verben-workflow-ui/src/lib/models';\nimport { Status } from 'verben-workflow-ui/src/lib/models';\nimport { SwimLane } from 'verben-workflow-ui/src/lib/models';\nimport { WorkflowStage } from 'verben-workflow-ui/src/lib/models';\nimport { StageActorRule } from 'verben-workflow-ui/src/lib/models';\nimport { WorkflowAction } from 'verben-workflow-ui/src/lib/models';\nimport { ObjectState } from 'verben-workflow-ui/src/lib/models';\nimport { ConnectionService } from './connection.service';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class WorkflowMapperService {\n  constructor(private connectionService: ConnectionService) {}\n\n  // Frontend to Backend transformation\n  toBackendWorkflow(\n    objects: WorkflowObject[],\n    workflowMetadata: WorkflowMetadata\n  ): Workflow {\n    const swimlanes = objects.filter((obj) => obj.type === 'swimlane');\n    const stages = objects.filter((obj) => obj.type === 'stage');\n    const connections = objects.filter(\n      (obj) =>\n        obj.type === 'action' &&\n        (obj as FrontendAction)?.fromId &&\n        (obj as FrontendAction)?.toId\n    ) as FrontendAction[];\n    const startNode = objects.find((obj) => obj.type === 'start');\n    const forms = objects.filter((obj) => obj.type === 'form');\n\n    // Find entry points (stages connected to start node)\n    const entryPointIds = connections\n      .filter((conn) => conn.fromId === startNode?.id)\n      .map((conn) => conn.toId);\n\n    // Find exit points (stages with no outgoing connections)\n    const exitPointIds = stages\n      .filter((stage) => !connections.some((conn) => conn.fromId === stage.id))\n      .map((stage) => stage.id);\n\n    // Preserve original workflow code if it exists, otherwise generate a new one\n    const code =\n      workflowMetadata.code || this.generateCode(workflowMetadata.name);\n\n    const workflow: Workflow = {\n      Id: workflowMetadata.id || '',\n      id: workflowMetadata.id || '',\n      Code: code,\n      Name: workflowMetadata.name,\n      Description:\n        workflowMetadata.description || `Workflow for ${workflowMetadata.name}`,\n      StageEntryRule: this.generateStageEntryRule(entryPointIds.length),\n      Form: workflowMetadata.formId || '',\n      AssignmentType: TaskAssignmentType.Queue,\n      Status: Status.Active,\n      Actions: connections.map((connection) =>\n        this.toBackendAction(connection, code)\n      ),\n      Lanes: swimlanes.map((lane) => this.toBackendSwimlane(lane, code)),\n      Stages: [],\n      TenantId: workflowMetadata.tenantId || '',\n      ServiceName: 'Workflow',\n      CreatedAt: workflowMetadata.createdAt || new Date(),\n      UpdatedAt: new Date(),\n      DataState: workflowMetadata.isNew ? ObjectState.New : ObjectState.Changed,\n    };\n\n    // Map stages with entry/exit point information\n    const mappedStages = stages.map((stage) =>\n      this.toBackendStage(\n        stage,\n        code,\n        entryPointIds.includes(stage.id),\n        exitPointIds.includes(stage.id),\n        this.findSwimlaneForStage(stage, swimlanes),\n        workflowMetadata.tenantId || ''\n      )\n    );\n\n    // Store stages in workflow\n    workflow.Stages = mappedStages;\n\n    return workflow;\n  }\n\n  private generateCode(name: string): string {\n    return name\n      .toLowerCase()\n      .replace(/[^a-z0-9]+/g, '-')\n      .replace(/^-+|-+$/g, '');\n  }\n\n  private findSwimlaneForStage(\n    stage: WorkflowObject,\n    swimlanes: WorkflowObject[]\n  ): string {\n    return (\n      swimlanes.find(\n        (lane) =>\n          stage.position.y >= lane.position.y &&\n          stage.position.y <= lane.position.y + lane.size.height\n      )?.id || ''\n    );\n  }\n\n  private generateStageEntryRule(entryPointCount: number): string {\n    return entryPointCount > 1 ? 'parallel-entry' : 'single-entry';\n  }\n\n  private toBackendSwimlane(\n    frontendLane: WorkflowObject,\n    workflow: string\n  ): SwimLane {\n    // Preserve original ID if available\n    const originalId = frontendLane.originalId || '';\n\n    return {\n      Id: originalId,\n      id: originalId,\n      Code: frontendLane.originalCode || this.generateCode(frontendLane.label),\n      Position: Math.floor(frontendLane.position.y / frontendLane.size.height),\n      Workflow: workflow,\n      Coordinates: {\n        X: frontendLane.position.x,\n        Y: frontendLane.position.y,\n      },\n      Size: {\n        Width: frontendLane.size.width,\n        Height: frontendLane.size.height,\n      },\n      Tags: frontendLane.tags || [], // This now correctly maps Tag[] to Tag[]\n      TenantId: frontendLane.tenantId || '',\n      ServiceName: 'Workflow',\n      CreatedAt: frontendLane.createdAt || new Date(),\n      UpdatedAt: new Date(),\n      DataState: originalId ? ObjectState.Changed : ObjectState.New,\n    };\n  }\n\n  private toBackendStage(\n    frontendStage: WorkflowObject,\n    workflowId: string,\n    isEntryPoint: boolean,\n    isExitPoint: boolean,\n    swimlaneId: string,\n    tenantId: string\n  ): WorkflowStage {\n    const stage = frontendStage as Stage;\n    const originalId = stage.originalId || '';\n\n    return {\n      Id: originalId,\n      id: originalId,\n      Code: stage.originalCode || this.generateCode(stage.label),\n      Key: stage.id,\n      Workflow: workflowId,\n      Name: stage.label,\n      Description: stage.description || '',\n      Duration: stage.duration || 0,\n      PassOnRule: stage.passOnRule || '',\n      ActorRule: (stage.actorRule as StageActorRule) || StageActorRule.Any,\n      MinNoOfActor: stage.minNoOfActor || 1,\n      IsParallel: stage.isParallel || false,\n      IsEntryPoint: isEntryPoint,\n      IsExitPoint: isExitPoint,\n      Tags: stage.tags || [], // Now correctly maps Tag[] to Tag[]\n      Form: stage.form || '',\n      AllowMultiSubProcess: stage.allowMultiSubProcess || false,\n      AssignmentType:\n        (stage.assignmentType as TaskAssignmentType) ||\n        TaskAssignmentType.Queue,\n      SubWorkFlow: stage.subWorkflow || '',\n      SwimLane: swimlaneId,\n      Coordinates: {\n        X: stage.position.x,\n        Y: stage.position.y,\n      },\n      IsSubProcess: stage.isSubProcess || false,\n      TenantId: tenantId,\n      ServiceName: 'Workflow',\n      CreatedAt: stage.createdAt || new Date(),\n      UpdatedAt: new Date(),\n      DataState: originalId ? ObjectState.Changed : ObjectState.New,\n    };\n  }\n\n  private toBackendAction(\n    frontendAction: FrontendAction,\n    workflow: string\n  ): WorkflowAction {\n    const originalId = frontendAction.originalId || '';\n\n    return {\n      Id: originalId,\n      id: originalId,\n      Code:\n        frontendAction.originalCode ||\n        `${frontendAction.fromId}-to-${frontendAction.toId}`,\n      Workflow: workflow,\n      Name: frontendAction.label || 'Unnamed Action',\n      OperationAction: null,\n      FromStage: frontendAction.fromId,\n      ToStage: frontendAction.toId,\n      IsParallel: frontendAction.isParallel || false,\n      PassOnRule: frontendAction.passOnRule || '',\n      TenantId: frontendAction.tenantId || '',\n      ServiceName: 'Workflow',\n      CreatedAt: frontendAction.createdAt || new Date(),\n      UpdatedAt: new Date(),\n      DataState: originalId ? ObjectState.Changed : ObjectState.New,\n    };\n  }\n\n  // Backend to Frontend transformation\n  toFrontendObjects(workflow: Workflow): {\n    objects: WorkflowObject[];\n    metadata: WorkflowMetadata;\n  } {\n    const objects: WorkflowObject[] = [];\n\n    // Create metadata object to store workflow information\n    const metadata: WorkflowMetadata = {\n      id: workflow.Id,\n      code: workflow.Code,\n      name: workflow.Name,\n      description: workflow.Description,\n      tenantId: workflow.TenantId,\n      formId: workflow.Form,\n      createdAt: workflow.CreatedAt,\n      isNew: workflow.DataState === ObjectState.New,\n    };\n\n    // Start with the start node\n    const startNode = this.createStartNode();\n    objects.push(startNode);\n\n    // Convert swimlanes\n    const swimlanes = workflow.Lanes.map((lane) =>\n      this.toFrontendSwimlane(lane)\n    );\n    objects.push(...swimlanes);\n\n    // Convert stages\n    const stages = workflow.Stages.map((stage) => this.toFrontendStage(stage));\n    objects.push(...stages);\n\n    // Create connections, including from start node to entry points\n    const connections = this.createConnections(workflow, startNode.id, stages);\n    objects.push(...connections);\n\n    return { objects, metadata };\n  }\n\n  private createStartNode(): WorkflowObject {\n    return {\n      id: 'start-node',\n      type: 'start',\n      position: { x: 50, y: 37 },\n      size: { width: 58, height: 46 },\n      label: 'Start',\n    };\n  }\n\n  private toFrontendSwimlane(backendLane: SwimLane): WorkflowObject {\n    // Normalize the coordinates and size\n    const coordinates = backendLane.Coordinates || {\n      X: 0,\n      Y: backendLane.Position * 120,\n    };\n    const position = {\n      x: coordinates.X ?? 0,\n      y: coordinates.Y ?? 0,\n    };\n\n    const size = backendLane.Size || { Width: 2960, Height: 120 };\n    const normalizedSize = {\n      width: size.Width ?? 2960,\n      height: size.Height ?? 120,\n    };\n\n    return {\n      id: backendLane.Code,\n      type: 'swimlane',\n      position,\n      size: normalizedSize,\n      label: backendLane.Code,\n      // Store original backend information for later use\n      originalId: backendLane.Id,\n      originalCode: backendLane.Code,\n      tags: backendLane.Tags || [],\n      tenantId: backendLane.TenantId,\n      createdAt: backendLane.CreatedAt,\n    };\n  }\n\n  private toFrontendStage(backendStage: WorkflowStage): WorkflowObject {\n    // Normalize coordinates\n    const coordinates = backendStage.Coordinates || { X: 0, Y: 0 };\n    const position = {\n      x: coordinates.X ?? 0,\n      y: coordinates.Y ?? 0,\n    };\n\n    return {\n      id: backendStage.Key || backendStage.Code,\n      type: 'stage',\n      position,\n      size: { width: 120, height: 80 }, // Default size for stages\n      label: backendStage.Name,\n      // Store original backend information\n      originalId: backendStage.Id,\n      originalCode: backendStage.Code,\n      description: backendStage.Description,\n      duration: backendStage.Duration,\n      passOnRule: backendStage.PassOnRule,\n      actorRule: backendStage.ActorRule,\n      minNoOfActor: backendStage.MinNoOfActor,\n      isParallel: backendStage.IsParallel,\n      isEntryPoint: backendStage.IsEntryPoint,\n      isExitPoint: backendStage.IsExitPoint,\n      tags: backendStage.Tags,\n      forms: backendStage.Form,\n      allowMultiSubProcess: backendStage.AllowMultiSubProcess,\n      assignmentType: backendStage.AssignmentType,\n      subWorkflow: backendStage.SubWorkFlow,\n      isSubProcess: backendStage.IsSubProcess,\n      tenantId: backendStage.TenantId,\n      createdAt: backendStage.CreatedAt,\n    };\n  }\n\n  private createConnections(\n    workflow: Workflow,\n    startNodeId: string,\n    stages: WorkflowObject[]\n  ): FrontendAction[] {\n    const connections: FrontendAction[] = [];\n    const actions = workflow.Actions;\n\n    // Create connections from start node to entry points\n    stages\n      .filter(\n        (stage) =>\n          workflow.Stages.find((s) => s.Key === stage.id || s.Code === stage.id)\n            ?.IsEntryPoint\n      )\n      .forEach((entryStage) => {\n        connections.push(\n          this.createConnection(\n            crypto.randomUUID(),\n            startNodeId,\n            entryStage.id,\n            'Start',\n            stages\n          )\n        );\n      });\n\n    // Create connections between stages\n    actions.forEach((action) => {\n      connections.push(\n        this.createConnection(\n          action.Code,\n          action.FromStage,\n          action.ToStage,\n          action.Name || '',\n          stages,\n          {\n            originalId: action.Id,\n            originalCode: action.Code,\n            isParallel: action.IsParallel,\n            passOnRule: action.PassOnRule,\n            tenantId: action.TenantId,\n            createdAt: action.CreatedAt,\n          }\n        )\n      );\n    });\n\n    return connections;\n  }\n\n  private createConnection(\n    id: string,\n    fromId: string,\n    toId: string,\n    label: string,\n    stages: WorkflowObject[],\n    properties?: any\n  ): FrontendAction {\n    const sourceNode =\n      stages.find((s) => s.id === fromId) || this.createStartNode();\n    const targetNode = stages.find((s) => s.id === toId);\n\n    if (!targetNode) {\n      console.error(`Unable to find target stage with id: ${toId}`);\n      // Return a minimal connection to avoid breaking the application\n      return {\n        id,\n        type: 'action',\n        fromId,\n        toId,\n        label,\n        position: { x: 0, y: 0 },\n        size: { width: 0, height: 0 },\n        points: [],\n        ...properties,\n      };\n    }\n\n    const points = this.connectionService.recalculateConnectionPoints(\n      sourceNode,\n      targetNode,\n      []\n    );\n\n    return {\n      id,\n      type: 'action',\n      fromId,\n      toId,\n      label,\n      position: sourceNode.position,\n      size: { width: 0, height: 0 },\n      points,\n      // Store all additional properties from backend\n      originalId: properties?.originalId,\n      originalCode: properties?.originalCode,\n      isParallel: properties?.isParallel,\n      passOnRule: properties?.passOnRule,\n      tenantId: properties?.tenantId,\n      createdAt: properties?.createdAt,\n      properties: properties?.properties,\n    };\n  }\n}\n","// services/workflow-persistence.service.ts\nimport { Injectable, inject } from '@angular/core';\nimport { WorkflowsService } from 'verben-workflow-ui/src/lib/components/workflows';\nimport { ErrorResponse, FormEntity, Tag, Workflow } from 'verben-workflow-ui/src/lib/models';\nimport { UtilService } from 'verben-workflow-ui/src/lib/services';\nimport { WorkflowMetadata } from '../models/types';\nimport { WorkflowMapperService } from './wf-mapper.service';\nimport { WorkflowStateService } from './wf-state.service';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class WorkflowPersistenceService {\n  private workflowState = inject(WorkflowStateService);\n  private mapper = inject(WorkflowMapperService);\n  private service = inject(WorkflowsService);\n  private utilSvc = inject(UtilService);\n\n  // Add a property to store the current workflow metadata\n  private currentWorkflowMetadata: WorkflowMetadata = {\n    id: '',\n    code: '',\n    name: 'New Workflow',\n    description: '',\n    isNew: true,\n  };\n\n  // Getter for workflow metadata\n  get workflowMetadata(): WorkflowMetadata {\n    return { ...this.currentWorkflowMetadata };\n  }\n\n  // Save workflow with current metadata\n  saveWorkflow(): Promise<Workflow[]> {\n    const currentObjects = this.workflowState.objects();\n    const workflow = this.mapper.toBackendWorkflow(\n      currentObjects,\n      this.currentWorkflowMetadata\n    );\n\n    return this.service.saveWorkflows([workflow]).then((results) => {\n      // Update metadata with saved workflow info if successful\n      if (results && results.length > 0) {\n        const savedWorkflow = results[0];\n        this.updateWorkflowMetadata({\n          id: savedWorkflow.Id,\n          code: savedWorkflow.Code,\n          name: savedWorkflow.Name,\n          description: savedWorkflow.Description,\n          tenantId: savedWorkflow.TenantId,\n          formId: savedWorkflow.Form,\n          createdAt: savedWorkflow.CreatedAt,\n          isNew: false,\n        });\n      }\n      return results;\n    });\n  }\n\n  // Load workflow by ID\n  async loadWorkflow(workflowId: string): Promise<void> {\n    try {\n      const data = await this.service.getWorkflowWithParam(workflowId);\n      if (data instanceof ErrorResponse) {\n        this.utilSvc.showError(data.ErrorMsg);\n        return;\n      }\n      const workflow = data.Result[0];\n\n      if (workflow) {\n        const result = this.mapper.toFrontendObjects(workflow);\n\n        // Update metadata\n        this.updateWorkflowMetadata({\n          id: workflow.Id,\n          code: workflow.Code,\n          name: workflow.Name,\n          description: workflow.Description,\n          tenantId: workflow.TenantId,\n          formId: workflow.Form,\n          createdAt: workflow.CreatedAt,\n          isNew: false,\n        });\n\n        // Clear existing state and load new objects\n        this.workflowState.state.set({\n          objects: result.objects,\n          selectedObjectId: null,\n          selectedTool: null,\n        });\n      }\n    } catch (error) {\n      console.error('Error loading workflow:', error);\n      throw error;\n    }\n  }\n\n  // Update workflow metadata\n  updateWorkflowMetadata(metadata: Partial<WorkflowMetadata>): void {\n    this.currentWorkflowMetadata = {\n      ...this.currentWorkflowMetadata,\n      ...metadata,\n    };\n  }\n\n  // Create a new workflow\n  createNewWorkflow(name: string, description?: string): void {\n    // Reset the state\n    this.workflowState.initializeWorkflow();\n\n    // Set up new metadata\n    this.updateWorkflowMetadata({\n      id: '',\n      code: '',\n      name: name,\n      description: description || `New workflow: ${name}`,\n      isNew: true,\n    });\n  }\n\n  // Update existing workflow\n  async updateWorkflow(\n    workflowName: string,\n    description?: string\n  ): Promise<Workflow[]> {\n    // Update metadata\n    this.updateWorkflowMetadata({\n      name: workflowName,\n      description: description || this.currentWorkflowMetadata.description,\n    });\n\n    // Save with updated metadata\n    return this.saveWorkflow();\n  }\n\n  // Load all workflows\n  async loadWorkflows(): Promise<Workflow[]> {\n    try {\n      const data = await this.service.getWorkflows(0, 0, 'createdAt', 'ASC');\n      if (data instanceof ErrorResponse) {\n        this.utilSvc.showError(data.ErrorMsg);\n        return [];\n      }\n      return data.Result;\n    } catch (error) {\n      console.error('Error loading workflows:', error);\n      throw error;\n    }\n  }\n\n  // Load forms\n  async loadForms(): Promise<FormEntity[]> {\n    try {\n      const data = await this.service.getForms(0, 0, 'createdAt', 'ASC');\n      if (data instanceof ErrorResponse) {\n        this.utilSvc.showError(data.ErrorMsg);\n        return [];\n      }\n      return data.Result;\n    } catch (error) {\n      console.error('Error loading forms:', error);\n      throw error;\n    }\n  }\n\n  // Load tags\n  async loadTags(): Promise<Tag[]> {\n    try {\n      const data = await this.service.getTags(0, 0, 'createdAt', 'ASC');\n      if (data instanceof ErrorResponse) {\n        this.utilSvc.showError(data.ErrorMsg);\n        return [];\n      }\n      return data.Result;\n    } catch (error) {\n      console.error('Error loading tags:', error);\n      throw error;\n    }\n  }\n}\n","// services/node-precondition.service.ts\nimport { Injectable, signal, inject } from '@angular/core';\nimport { WorkflowObjectType, Position } from '../models/types';\nimport { WorkflowPersistenceService } from './wf-persistence.service';\nimport { FormEntity } from 'verben-workflow-ui/src/lib/models';\nimport { Tag } from 'verben-workflow-ui/src/lib/models';\nimport { Workflow } from 'verben-workflow-ui/src/lib/models';\n\nexport interface PreconditionData {\n  type: 'form' | 'subflow' | 'swimlane' | 'decision';\n  id?: string;\n  name?: string;\n  tags?: Tag[];\n  condition?: string;\n}\n\nexport interface PendingNode {\n  type: WorkflowObjectType;\n  position: Position;\n}\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class NodePreconditionService {\n  private persistence = inject(WorkflowPersistenceService);\n\n  private preconditionRequired = new Set([\n    'form',\n    'subflow',\n    'swimlane',\n    'decision',\n  ]);\n\n  private pendingNodeSignal = signal<PendingNode | null>(null);\n  readonly pendingNode = this.pendingNodeSignal.asReadonly();\n\n  // Replace mock data signals with real data signals\n  private formOptions = signal<PreconditionData[]>([]);\n  private workflowOptions = signal<PreconditionData[]>([]);\n  private tagOptions = signal<Tag[]>([]);\n\n  // Add readonly accessors\n  readonly forms = this.formOptions.asReadonly();\n  readonly workflows = this.workflowOptions.asReadonly();\n  readonly tags = this.tagOptions.asReadonly();\n\n  // Add initialization method to load real data\n  async initializeData(): Promise<void> {\n    try {\n      const [forms, workflows, tags] = await Promise.all([\n        this.persistence.loadForms(),\n        this.persistence.loadWorkflows(),\n        this.persistence.loadTags(),\n      ]);\n\n      this.formOptions.set(\n        forms.map((form) => ({\n          type: 'form',\n          id: form.Id,\n          name: form.Name,\n        }))\n      );\n\n      this.workflowOptions.set(\n        workflows.map((workflow) => ({\n          type: 'subflow',\n          id: workflow.Id,\n          name: workflow.Name,\n        }))\n      );\n\n      this.tagOptions.set(tags);\n    } catch (error) {\n      console.error('Failed to load precondition data:', error);\n    }\n  }\n\n  requiresPrecondition(type: WorkflowObjectType): boolean {\n    return this.preconditionRequired.has(type);\n  }\n\n  setPendingNode(type: WorkflowObjectType, position: Position): void {\n    this.pendingNodeSignal.set({ type, position });\n  }\n\n  clearPendingNode(): void {\n    this.pendingNodeSignal.set(null);\n  }\n\n  async getItems(type: WorkflowObjectType): Promise<PreconditionData[]> {\n    switch (type) {\n      case 'form':\n        return this.mapForms(await this.persistence.loadForms());\n      case 'subflow':\n        return this.mapWorkflows(await this.persistence.loadWorkflows());\n      case 'swimlane':\n        return this.mapTags(await this.persistence.loadTags());\n      case 'decision':\n        return this.getDecisionConditions();\n      default:\n        return [];\n    }\n  }\n\n  private mapForms(forms: FormEntity[]): PreconditionData[] {\n    return forms.map((form) => ({\n      type: 'form',\n      id: form.Id,\n      name: form.Name,\n    }));\n  }\n\n  private mapWorkflows(workflows: Workflow[]): PreconditionData[] {\n    return workflows.map((workflow) => ({\n      type: 'subflow',\n      id: workflow.Id,\n      name: workflow.Name,\n    }));\n  }\n\n  private mapTags(tags: Tag[]): PreconditionData[] {\n    return [\n      {\n        type: 'swimlane',\n        tags: tags,\n      },\n    ];\n  }\n\n  private getDecisionConditions(): PreconditionData[] {\n    return [\n      {\n        type: 'decision',\n        condition: '', // Empty condition to be filled by user\n      },\n    ];\n  }\n}\n","// Update imports\nimport { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, inject, Output } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { DropDownModule, VerbenDialogueModule } from 'verben-ng-ui';\nimport { Tag } from 'verben-workflow-ui/src/lib/models';\nimport {\n  NodePreconditionService,\n  PreconditionData,\n} from '../services/node-precondition.service';\n\n@Component({\n  selector: 'wf-node-selector',\n  standalone: true,\n  imports: [CommonModule, VerbenDialogueModule, FormsModule, DropDownModule],\n  template: `\n    <verben-dialogue\n      [isVisible]=\"!!preconditionService.pendingNode()\"\n      [showCloseIcon]=\"true\"\n      [dismissOutsideClick]=\"true\"\n      [closeOnEscape]=\"true\"\n      [size]=\"'small'\"\n      [mode]=\"'dialogue'\"\n      [customClass]=\"'precondition-dialogue'\"\n      [headerTemplate]=\"headerTemplate\"\n      [bodyTemplate]=\"bodyTemplate\"\n      (closeModal)=\"onModalClose($event)\"\n    >\n    </verben-dialogue>\n\n    <ng-template #headerTemplate>\n      <h3 class=\"text-lg font-semibold\">{{ getDialogTitle() }}</h3>\n    </ng-template>\n\n    <ng-template #bodyTemplate>\n      <div class=\"p-6\">\n        @switch (preconditionService.pendingNode()?.type) { @case ('swimlane') {\n        <div class=\"space-y-4\">\n          <verben-drop-down\n            [multiselect]=\"true\"\n            display=\"chip\"\n            [required]=\"true\"\n            [filter]=\"true\"\n            [showClear]=\"true\"\n            placeholder=\"Select Tags\"\n            optionLabel=\"Name\"\n            styleClass=\"w-full\"\n            [options]=\"preconditionService.tags()\"\n            [(ngModel)]=\"selectedTags\"\n            (onChange)=\"onTagSelectionChange($event)\"\n          ></verben-drop-down>\n\n          <button\n            class=\"w-full px-4 py-2 bg-purple-600 text-white rounded-md\"\n            [disabled]=\"!selectedTags.length\"\n            (click)=\"onTagsSubmit()\"\n          >\n            Apply Tags\n          </button>\n        </div>\n        } @case ('decision') {\n        <div class=\"space-y-4\">\n          <div>\n            <label class=\"block text-sm font-medium mb-2\">Condition</label>\n            <textarea\n              class=\"w-full p-2 border rounded-md\"\n              rows=\"3\"\n              [(ngModel)]=\"condition\"\n              placeholder=\"Enter condition...\"\n            ></textarea>\n          </div>\n          <button\n            class=\"w-full px-4 py-2 bg-purple-600 text-white rounded-md\"\n            [disabled]=\"!condition\"\n            (click)=\"onConditionSubmit()\"\n          >\n            Apply Condition\n          </button>\n        </div>\n        } @case ('form') {\n        <div class=\"space-y-4\">\n          <verben-drop-down\n            [required]=\"true\"\n            [filter]=\"true\"\n            [showClear]=\"true\"\n            placeholder=\"Select Form\"\n            optionLabel=\"name\"\n            optionValue=\"id\"\n            styleClass=\"w-full\"\n            [options]=\"preconditionService.forms()\"\n            [(ngModel)]=\"selectedFormId\"\n            (onChange)=\"onDropdownChange($event)\"\n          ></verben-drop-down>\n\n          <button\n            class=\"w-full px-4 py-2 bg-purple-600 text-white rounded-md\"\n            [disabled]=\"!selectedFormId\"\n            (click)=\"onFormSubmit()\"\n          >\n            Select Form\n          </button>\n        </div>\n        } @default {\n        <div class=\"space-y-4\">\n          <verben-drop-down\n            [required]=\"true\"\n            [filter]=\"true\"\n            [showClear]=\"true\"\n            placeholder=\"Select Workflow\"\n            optionLabel=\"name\"\n            optionValue=\"id\"\n            styleClass=\"w-full\"\n            [options]=\"preconditionService.workflows()\"\n            [(ngModel)]=\"selectedWorkflowId\"\n            (onChange)=\"onDropdownChange($event)\"\n          ></verben-drop-down>\n\n          <button\n            class=\"w-full px-4 py-2 bg-purple-600 text-white rounded-md\"\n            [disabled]=\"!selectedWorkflowId\"\n            (click)=\"onWorkflowSubmit()\"\n          >\n            Select Workflow\n          </button>\n        </div>\n        } }\n      </div>\n    </ng-template>\n  `,\n})\nexport class NodeSelectorComponent {\n  // Replace existing properties with these\n  protected selectedTags: Tag[] = [];\n  protected selectedFormId: string = '';\n  protected selectedWorkflowId: string = '';\n  protected condition = '';\n  protected preconditionService = inject(NodePreconditionService);\n\n  @Output() select = new EventEmitter<PreconditionData>();\n\n  // Methods for dropdown handling\n  protected onTagSelectionChange(event: any): void {\n    // Handle tag selection change if needed\n    console.log('Tag selection changed:', this.selectedTags);\n  }\n\n  protected onDropdownChange(event: any): void {\n    console.log('Dropdown selection changed:', event);\n  }\n\n  protected onFormSubmit(): void {\n    const selectedForm = this.preconditionService\n      .forms()\n      .find((f) => f.id === this.selectedFormId);\n    if (selectedForm) {\n      this.select.emit(selectedForm);\n    }\n  }\n\n  protected onWorkflowSubmit(): void {\n    const selectedWorkflow = this.preconditionService\n      .workflows()\n      .find((w) => w.id === this.selectedWorkflowId);\n    if (selectedWorkflow) {\n      this.select.emit(selectedWorkflow);\n    }\n  }\n\n  protected getDialogTitle(): string {\n    const type = this.preconditionService.pendingNode()?.type;\n    switch (type) {\n      case 'form':\n        return 'Select Form';\n      case 'subflow':\n        return 'Select Workflow';\n      case 'swimlane':\n        return 'Select Tags';\n      case 'decision':\n        return 'Set Condition';\n      default:\n        return 'Select';\n    }\n  }\n\n  protected onTagsSubmit(): void {\n    this.select.emit({\n      type: 'swimlane',\n      id: crypto.randomUUID(),\n      name: 'Swimlane',\n      tags: this.selectedTags,\n    });\n  }\n\n  protected onConditionSubmit(): void {\n    this.select.emit({\n      type: 'decision',\n      id: crypto.randomUUID(),\n      name: 'Decision',\n      condition: this.condition,\n    });\n  }\n\n  protected onSelect(data: PreconditionData): void {\n    this.select.emit(data);\n  }\n\n  onModalClose(event: any): void {\n    this.preconditionService.clearPendingNode();\n  }\n}\n","// services/viewport.service.ts\nimport { Injectable, ElementRef } from '@angular/core';\nimport { Position } from '../models/types';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class ViewportService {\n  getCanvasPoint(\n    event: MouseEvent,\n    canvasRef: ElementRef<SVGElement>\n  ): Position {\n    const rect = canvasRef.nativeElement.getBoundingClientRect();\n    return {\n      x: event.clientX - rect.left,\n      y: event.clientY - rect.top,\n    };\n  }\n\n  snapToGrid(position: Position, gridSize: number): Position {\n    return {\n      x: Math.round(position.x / gridSize) * gridSize,\n      y: Math.round(position.y / gridSize) * gridSize,\n    };\n  }\n\n  getObjectTransform(position: Position): string {\n    return `translate(${position.x}, ${position.y})`;\n  }\n}\n","// services/position-update.service.ts\nimport { Injectable, inject } from '@angular/core';\nimport { Position, Action } from '../models/types';\nimport { WorkflowStateService } from './wf-state.service';\nimport { ConnectionService } from './connection.service';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class PositionUpdateService {\n  private workflowState = inject(WorkflowStateService);\n  private connection = inject(ConnectionService);\n\n  updateNodeWithConnections(nodeId: string, newPosition: Position): void {\n    // Update node position\n    this.workflowState.updateObject(nodeId, { position: newPosition });\n\n    // Update connected paths\n    const connections = this.workflowState\n      .connections()\n      .filter((conn) => conn.fromId === nodeId || conn.toId === nodeId);\n\n    const updates = this.getConnectionUpdates(nodeId, newPosition, connections);\n    if (updates.length > 0) {\n      this.workflowState.updateMultipleObjects(updates);\n    }\n  }\n\n  private getConnectionUpdates(\n    nodeId: string,\n    newPosition: Position,\n    connections: Action[]\n  ): { id: string; changes: Partial<Action> }[] {\n    return connections\n      .map((conn) => {\n        const sourceNode = this.workflowState.getObjectById(conn.fromId);\n        const targetNode = this.workflowState.getObjectById(conn.toId);\n\n        if (!sourceNode || !targetNode) return null;\n\n        const points = this.connection.recalculateConnectionPoints(\n          sourceNode,\n          targetNode,\n          conn.points\n        );\n\n        return {\n          id: conn.id,\n          changes: { points } as Partial<Action>,\n        };\n      })\n      .filter(\n        (update): update is NonNullable<typeof update> => update !== null\n      );\n  }\n}\n","// services/node-interaction.service.ts\nimport { Injectable, inject } from '@angular/core';\nimport { Position, WorkflowObject } from '../models/types';\nimport { ViewportService } from './viewport.service';\nimport { WorkflowStateService } from './wf-state.service';\nimport { CanvasStateService } from './canvas-state.service';\nimport { PositionUpdateService } from './position-update.service';\nimport { NodeFinderService } from './node-finder.service';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class NodeInteractionService {\n  private viewport = inject(ViewportService);\n  private workflowState = inject(WorkflowStateService);\n  private canvasState = inject(CanvasStateService);\n  private positionUpdate = inject(PositionUpdateService);\n  private nodeFinder = inject(NodeFinderService);\n\n  // Use nodeFinder instead of direct implementation\n  findNodeAtPoint(point: Position): WorkflowObject | null {\n    return this.nodeFinder.findNodeAtPoint(point);\n  }\n\n  private isPointInNode(point: Position, node: WorkflowObject): boolean {\n    return (\n      point.x >= node.position.x &&\n      point.x <= node.position.x + node.size.width &&\n      point.y >= node.position.y &&\n      point.y <= node.position.y + node.size.height\n    );\n  }\n\n  startDragging(node: WorkflowObject, point: Position): void {\n    if (this.isProtectedNode(node)) return;\n\n    this.canvasState.setDragging(true);\n    this.canvasState.setDragStartPosition(point);\n    this.workflowState.setSelectedObject(node.id);\n\n    // Calculate offset from node position to click position\n    this.canvasState.setDragOffset({\n      x: point.x - node.position.x,\n      y: point.y - node.position.y,\n    });\n  }\n\n  handleDragging(currentPoint: Position, gridSize: number): void {\n    const objectId = this.workflowState.selectedObjectId();\n\n    if (!objectId) return;\n\n    const selectedNode = this.workflowState.getObjectById(objectId);\n    if (!selectedNode) return;\n\n    const { dragOffset } = this.canvasState.canvasState();\n\n    const newPosition = {\n      x: currentPoint.x - dragOffset.x,\n      y: currentPoint.y - dragOffset.y,\n    };\n\n    // Snap to grid\n    const snappedPosition = this.viewport.snapToGrid(newPosition, gridSize);\n\n    // Find nearest swimlane if applicable\n    const nearestSwimlane = this.findNearestSwimlane(snappedPosition);\n    if (nearestSwimlane) {\n      snappedPosition.y =\n        nearestSwimlane.position.y +\n        (nearestSwimlane.size.height - selectedNode.size.height) / 2;\n    }\n\n    // Update node position\n    this.workflowState.updateObject(selectedNode.id, {\n      position: snappedPosition,\n    });\n\n    // Use the new service\n    this.positionUpdate.updateNodeWithConnections(\n      selectedNode.id,\n      snappedPosition\n    );\n  }\n\n  finalizeDragging(finalPoint: Position): void {\n    const objectId = this.workflowState.selectedObjectId();\n\n    if (!objectId) return;\n\n    const selectedNode = this.workflowState.getObjectById(objectId);\n    if (!selectedNode) return;\n\n    // Perform any final position adjustments\n    const boundedPosition = this.keepWithinBounds(\n      selectedNode.position,\n      this.canvasState.canvasState().width,\n      this.canvasState.canvasState().height\n    );\n\n    if (boundedPosition !== selectedNode.position) {\n      this.workflowState.updateObject(selectedNode.id, {\n        position: boundedPosition,\n      });\n    }\n  }\n\n  private findNearestSwimlane(position: Position): WorkflowObject | null {\n    const swimlanes = this.workflowState.swimlanes();\n    for (const swimlane of swimlanes) {\n      if (\n        position.y >= swimlane.position.y &&\n        position.y <= swimlane.position.y + swimlane.size.height\n      ) {\n        return swimlane;\n      }\n    }\n    return null;\n  }\n\n  private keepWithinBounds(\n    position: Position,\n    width: number,\n    height: number\n  ): Position {\n    return {\n      x: Math.max(0, Math.min(position.x, width - 100)), // 100 is minimum node width\n      y: Math.max(0, Math.min(position.y, height - 60)), // 60 is minimum node height\n    };\n  }\n\n  private isProtectedNode(node: WorkflowObject): boolean {\n    return ['start', 'swimlane'].includes(node.type);\n  }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { WorkflowStateService } from './wf-state.service';\nimport { WorkflowObject } from '../models/types';\nimport { CanvasStateService } from './canvas-state.service';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class SwimlaneManagementService {\n  private workflowState = inject(WorkflowStateService);\n  private canvasState = inject(CanvasStateService);\n  private readonly DEFAULT_SWIMLANE_HEIGHT = 260;\n\n  createSwimlane(clickPosition: number): void {\n    const swimlanes = this.workflowState.swimlanes();\n    const canvasWidth = this.canvasState.canvasState().width;\n\n    // Calculate the new swimlane's position\n    const newPosition = this.calculateNewSwimlanePosition(\n      clickPosition,\n      swimlanes\n    );\n\n    const newSwimlane: WorkflowObject = {\n      id: crypto.randomUUID(),\n      type: 'swimlane',\n      position: { x: 0, y: this.findNearestSwimlanePosition(clickPosition) },\n      size: { width: canvasWidth - 40, height: this.DEFAULT_SWIMLANE_HEIGHT },\n      label: `Swimlane ${swimlanes.length + 1}`,\n    };\n\n    this.workflowState.addObject(newSwimlane);\n    this.reorderSwimlanes();\n  }\n\n  getVerticalCenterForSwimlane(swimlaneY: number): number {\n    return swimlaneY + this.DEFAULT_SWIMLANE_HEIGHT / 2;\n  }\n\n  getSwimlaneHeight(): number {\n    return this.DEFAULT_SWIMLANE_HEIGHT;\n  }\n\n  private calculateNewSwimlanePosition(\n    clickY: number,\n    swimlanes: WorkflowObject[]\n  ): number {\n    if (swimlanes.length === 0) return 0;\n\n    // Sort swimlanes by vertical position\n    const sortedSwimlanes = [...swimlanes].sort(\n      (a, b) => a.position.y - b.position.y\n    );\n\n    // Find the appropriate insertion point based on click position\n    for (let i = 0; i < sortedSwimlanes.length; i++) {\n      const swimlane = sortedSwimlanes[i];\n      if (clickY < swimlane.position.y + swimlane.size.height / 2) {\n        return i * this.DEFAULT_SWIMLANE_HEIGHT;\n      }\n    }\n\n    // If click is below all existing swimlanes, add to the end\n    return sortedSwimlanes.length * this.DEFAULT_SWIMLANE_HEIGHT;\n  }\n\n  // reorderSwimlanes(): void {\n  //   const swimlanes = [...this.workflowState.swimlanes()].sort(\n  //     (a, b) => a.position.y - b.position.y\n  //   );\n\n  //   const updates = swimlanes.map((swimlane, index) => ({\n  //     id: swimlane.id,\n  //     changes: {\n  //       position: { x: 0, y: index * this.DEFAULT_SWIMLANE_HEIGHT },\n  //       size: { ...swimlane.size },\n  //     },\n  //   }));\n\n  //   this.workflowState.updateMultipleObjects(updates);\n  // }\n\n  reorderSwimlanes(): void {\n    const swimlanes = [...this.workflowState.swimlanes()].sort(\n      (a, b) => a.position.y - b.position.y\n    );\n\n    // Update positions and adjust contained nodes\n    swimlanes.forEach((swimlane, index) => {\n      const oldY = swimlane.position.y;\n      const newY = index * this.DEFAULT_SWIMLANE_HEIGHT;\n\n      // Update swimlane position\n      this.workflowState.updateObject(swimlane.id, {\n        position: { x: 0, y: newY },\n        size: { ...swimlane.size, height: this.DEFAULT_SWIMLANE_HEIGHT },\n      });\n\n      // If position changed, adjust contained nodes\n      if (oldY !== newY) {\n        this.adjustNodesInSwimlane(swimlane.id, oldY, newY);\n      }\n    });\n  }\n\n  private adjustNodesInSwimlane(\n    swimlaneId: string,\n    oldY: number,\n    newY: number\n  ): void {\n    const nodes = this.workflowState.nodes();\n    const swimlane = this.workflowState.getObjectById(swimlaneId);\n    if (!swimlane) return;\n\n    nodes.forEach((node) => {\n      if (this.isNodeInSwimlane(node, swimlane)) {\n        const relativeY = node.position.y - oldY; // Position relative to old swimlane top\n        const newNodeY = newY + relativeY; // Maintain relative position in new location\n\n        this.workflowState.updateObject(node.id, {\n          position: { ...node.position, y: newNodeY },\n        });\n      }\n    });\n  }\n\n  private isNodeInSwimlane(\n    node: WorkflowObject,\n    swimlane: WorkflowObject\n  ): boolean {\n    return (\n      node.position.y >= swimlane.position.y &&\n      node.position.y <= swimlane.position.y + swimlane.size.height\n    );\n  }\n\n  resizeSwimlanesForCanvas(canvasWidth: number): void {\n    const swimlanes = this.workflowState.swimlanes();\n    const updates = swimlanes.map((swimlane) => ({\n      id: swimlane.id,\n      changes: {\n        size: { width: canvasWidth - 40, height: this.DEFAULT_SWIMLANE_HEIGHT },\n      },\n    }));\n\n    this.workflowState.updateMultipleObjects(updates);\n  }\n\n  getTotalHeight(): number {\n    const swimlanes = this.workflowState.swimlanes();\n    return swimlanes.length * this.DEFAULT_SWIMLANE_HEIGHT;\n  }\n\n  swapSwimlanes(swimlane1Id: string, swimlane2Id: string): void {\n    const swimlane1 = this.workflowState.getObjectById(swimlane1Id);\n    const swimlane2 = this.workflowState.getObjectById(swimlane2Id);\n\n    if (!swimlane1 || !swimlane2) return;\n\n    const temp = swimlane1.position.y;\n    this.workflowState.updateObject(swimlane1Id, {\n      position: { ...swimlane1.position, y: swimlane2.position.y },\n    });\n    this.workflowState.updateObject(swimlane2Id, {\n      position: { ...swimlane2.position, y: temp },\n    });\n\n    this.reorderSwimlanes();\n  }\n\n  findNearestSwimlanePosition(yPosition: number): number {\n    const swimlanes = this.workflowState.swimlanes();\n    if (swimlanes.length === 0) return 0;\n\n    const sortedSwimlanes = [...swimlanes].sort(\n      (a, b) => a.position.y - b.position.y\n    );\n\n    // Find the first swimlane that's below the given position\n    for (let i = 0; i < sortedSwimlanes.length; i++) {\n      if (sortedSwimlanes[i].position.y > yPosition) {\n        return i * sortedSwimlanes[0].size.height;\n      }\n    }\n\n    // If no swimlane is below, add to the end\n    return sortedSwimlanes.length * sortedSwimlanes[0].size.height;\n  }\n}\n","// services/workflow-facade.service.ts\nimport { Injectable, inject, ElementRef } from '@angular/core';\nimport {\n  WorkflowObject,\n  Position,\n  Action,\n  WorkflowObjectType,\n  SubFlow,\n  Form,\n  Swimlane,\n  Decision,\n} from '../models/types';\nimport { CanvasStateService } from './canvas-state.service';\nimport { ViewportService } from './viewport.service';\nimport { NodeInteractionService } from './node-interaction.service';\nimport { ConnectionService } from './connection.service';\nimport { RenderingService } from './rendering.service';\nimport { NodeSelectionService } from './node-selection.service';\nimport { WorkflowStateService } from './wf-state.service';\nimport { SwimlaneManagementService } from './swimlane-management.service';\nimport { WorkflowPersistenceService } from './wf-persistence.service';\nimport { ConnectionSegmentInteractionService } from './connection-segment-interaction.service';\nimport {\n  NodePreconditionService,\n  PreconditionData,\n} from './node-precondition.service';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class WorkflowFacadeService {\n  private workflowState = inject(WorkflowStateService);\n  private viewport = inject(ViewportService);\n  private nodeInteraction = inject(NodeInteractionService);\n  connection = inject(ConnectionService);\n  rendering = inject(RenderingService);\n  selection = inject(NodeSelectionService);\n  private canvasStateService = inject(CanvasStateService);\n  private swimlaneManagement = inject(SwimlaneManagementService);\n  public persistence = inject(WorkflowPersistenceService);\n  private segmentInteraction = inject(ConnectionSegmentInteractionService);\n  public preconditionService = inject(NodePreconditionService);\n\n  // Canvas State Accessors\n  readonly canvasState = this.canvasStateService.canvasState;\n  readonly workflowObjects = this.workflowState.objects;\n  readonly selectedObjectId = this.workflowState.selectedObjectId;\n  readonly selectedTool = this.workflowState.selectedTool;\n\n  // Filtered Object Accessors\n  readonly nodes = this.workflowState.nodes;\n  readonly swimlanes = this.workflowState.swimlanes;\n  readonly connections = this.workflowState.connections;\n\n  // Rendering Methods\n  getNodeStyle = this.rendering.getNodeStyle;\n  getConnectionStyle = this.rendering.getConnectionStyle;\n  getStartNodePaths = this.rendering.getStartNodePaths;\n  getNodeTransforms = this.rendering.getNodeTransforms;\n  getGridPattern = this.rendering.getGridPattern;\n\n  // Connection methods\n  getConnectionPath(points: Position[]): string {\n    return this.rendering.getConnectionPath(points);\n  }\n  // Added these getter methods to expose connection service functionality\n  getConnectionPreviewPath = () => this.connection.getPreviewPath();\n  hasOutgoingConnections = (nodeId: string) =>\n    this.connection.hasOutgoingConnections(nodeId);\n\n  // Segment interaction methods\n  handleSegmentMouseDown(\n    event: MouseEvent,\n    canvasRef: ElementRef<SVGElement>,\n    connectionId: string,\n    segmentIndex: number\n  ): void {\n    const point = this.viewport.getCanvasPoint(event, canvasRef);\n    this.segmentInteraction.startDragging(connectionId, segmentIndex, point);\n    this.canvasStateService.setDragging(true);\n  }\n\n  getSegmentCursor(connectionId: string, segmentIndex: number): string {\n    return this.segmentInteraction.getSegmentCursor(connectionId, segmentIndex);\n  }\n\n  // Mouse Event Handlers\n  handleMouseDown(event: MouseEvent, canvasRef: ElementRef<SVGElement>): void {\n    if (event.button !== 0) return;\n\n    const point = this.viewport.getCanvasPoint(event, canvasRef);\n    const clickedNode = this.nodeInteraction.findNodeAtPoint(\n      point\n      //   this.nodes()\n    );\n\n    if (this.selectedTool() === 'action' && clickedNode) {\n      this.connection.startConnection(clickedNode, point);\n    } else if (this.selectedTool()) {\n      this.handleToolPlacement(point);\n    } else if (clickedNode) {\n      if (\n        event.target instanceof Element &&\n        event.target.classList.contains('properties-indicator')\n      ) {\n        // Handle properties click\n        return;\n      }\n      this.nodeInteraction.startDragging(clickedNode, point);\n    } else {\n      this.selection.handleClickOutside(event);\n    }\n  }\n\n  handleMouseMove(event: MouseEvent, canvasRef: ElementRef<SVGElement>): void {\n    const point = this.viewport.getCanvasPoint(event, canvasRef);\n    const { isConnecting, isDragging } = this.canvasState();\n\n    if (isConnecting) {\n      this.connection.updateConnectionPreview(point);\n    } else if (isDragging) {\n      // this.nodeInteraction.handleDragging(point, this.canvasState().gridSize);\n      if (this.segmentInteraction.isDragging()) {\n        this.segmentInteraction.updateDragging(point);\n      } else {\n        this.nodeInteraction.handleDragging(point, this.canvasState().gridSize);\n      }\n    }\n  }\n\n  handleMouseUp(event: MouseEvent, canvasRef: ElementRef<SVGElement>): void {\n    const point = this.viewport.getCanvasPoint(event, canvasRef);\n    const { isConnecting, isDragging } = this.canvasState();\n\n    if (isConnecting) {\n      this.connection.finalizeConnection(point);\n    } else if (isDragging) {\n      // this.nodeInteraction.finalizeDragging(point);\n      if (this.segmentInteraction.isDragging()) {\n        this.segmentInteraction.finishDragging();\n      } else {\n        this.nodeInteraction.finalizeDragging(point);\n      }\n    }\n\n    this.canvasStateService.resetInteractionState();\n  }\n\n  handleMouseLeave(): void {\n    this.canvasStateService.resetInteractionState();\n  }\n\n  // Tool and Object Management\n  handleToolSelection(tool: WorkflowObjectType | null): void {\n    this.workflowState.setSelectedTool(tool);\n    this.selection.handleToolSelection(tool);\n  }\n\n  // private handleToolPlacement(point: Position): void {\n  //   console.log('Tool placement triggered', {\n  //     selectedTool: this.selectedTool(),\n  //     point,\n  //   });\n\n  //   if (this.selectedTool() === 'swimlane') {\n  //     this.swimlaneManagement.createSwimlane(point.y);\n  //     console.log(\n  //       'Swimlane created, current swimlanes:',\n  //       this.workflowState.swimlanes()\n  //     );\n  //     this.workflowState.setSelectedTool(null);\n  //     return;\n  //   }\n\n  //   const newNode: WorkflowObject = {\n  //     id: crypto.randomUUID(),\n  //     type: this.selectedTool()!,\n  //     position: this.viewport.snapToGrid(point, this.canvasState().gridSize),\n  //     size: this.getDefaultSize(this.selectedTool()!),\n  //     label: `New ${this.selectedTool()}`,\n  //   };\n\n  //   this.workflowState.addObject(newNode);\n  //   this.workflowState.setSelectedTool(null);\n  // }\n  private handleToolPlacement(point: Position): void {\n    if (!this.selectedTool()) return;\n\n    const nodeType = this.selectedTool()!;\n\n    // Check if precondition is required\n    if (this.preconditionService.requiresPrecondition(nodeType)) {\n      this.preconditionService.setPendingNode(nodeType, point);\n      return; // Don't create node yet\n    }\n\n    // Create node immediately if no precondition required\n    this.createNode(nodeType, point);\n  }\n\n  private createNode(\n    type: WorkflowObjectType,\n    position: Position,\n    selectedData?: PreconditionData\n  ): void {\n    const baseNode = {\n      id: crypto.randomUUID(),\n      type: type,\n      position: this.viewport.snapToGrid(position, this.canvasState().gridSize),\n      size: this.getDefaultSize(type),\n    };\n\n    let nodeData;\n    switch (type) {\n      case 'form':\n      case 'subflow':\n        nodeData = {\n          ...baseNode,\n          label: selectedData?.name || `New ${type}`,\n          referenceId: selectedData?.id,\n        } as SubFlow | Form;\n        break;\n\n      case 'swimlane':\n        nodeData = {\n          ...baseNode,\n          label: selectedData?.name || 'Swimlane',\n          tags: selectedData?.tags || [],\n          order: this.workflowState.swimlanes().length, // Add order based on current swimlane count\n        } as Swimlane;\n        break;\n\n      case 'decision':\n        nodeData = {\n          ...baseNode,\n          label: selectedData?.name || 'Decision',\n          condition: selectedData?.condition || '',\n        } as Decision;\n        break;\n\n      default:\n        nodeData = {\n          ...baseNode,\n          label: `New ${type}`,\n        };\n    }\n\n    this.workflowState.addObject(nodeData);\n    this.workflowState.setSelectedTool(null);\n  }\n\n  // Call this when a form/subflow is selected\n  finalizeNodeCreation(selectedData: PreconditionData): void {\n    const pendingNode = this.preconditionService.pendingNode();\n    if (!pendingNode) return;\n\n    this.createNode(pendingNode.type, pendingNode.position, selectedData);\n\n    this.preconditionService.clearPendingNode();\n  }\n\n  handleSwimlaneCreation(point: Position): void {\n    const swimlaneManagement = inject(SwimlaneManagementService);\n    swimlaneManagement.createSwimlane(point.y);\n  }\n\n  private getDefaultSize(type: WorkflowObjectType): {\n    width: number;\n    height: number;\n  } {\n    const sizes = {\n      stage: { width: 120, height: 80 },\n      action: { width: 40, height: 40 },\n      form: { width: 75, height: 96 }, // Exact size from design SVG\n      decision: { width: 100, height: 100 },\n      subflow: { width: 120, height: 80 },\n      swimlane: { width: 0, height: 0 }, // Handled separately\n      start: { width: 58, height: 46 },\n    };\n    return sizes[type];\n  }\n\n  // Initialization\n  initializeWorkflow(): void {\n    this.workflowState.initializeWorkflow();\n  }\n}\n","// components/workflow/canvas/wf-canvas.component.ts\nimport {\n  Component,\n  ViewChild,\n  ElementRef,\n  Input,\n  Output,\n  EventEmitter,\n  inject,\n  HostListener,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { WorkflowFacadeService } from '../services/wf-facade.service';\nimport { LabelEditorComponent } from './label-editor.component';\nimport { LabelManagementService } from '../services/label-management.service';\nimport { SwimlaneLabelComponent } from './swimlane-label.component';\nimport { SwimLanePopupComponent } from './swimlane-popup.component';\nimport { SwimlaneStatsService } from '../services/swimlane-stats.service';\nimport { Position } from '../models/types';\nimport { KeyboardHandlerService } from '../services/keyboard-handler.service';\nimport { NodeSelectorComponent } from './node-selector.component';\nimport {\n  NodePreconditionService,\n  PreconditionData,\n} from '../services/node-precondition.service';\n\n@Component({\n  selector: 'wf-canvas',\n  standalone: true,\n  imports: [\n    CommonModule,\n    LabelEditorComponent,\n    SwimlaneLabelComponent,\n    SwimLanePopupComponent,\n    NodeSelectorComponent,\n  ],\n  template: `\n    <div\n      class=\"canvas-container\"\n      #container\n      [class.connecting]=\"facade.canvasState().isConnecting\"\n      (mousedown)=\"onMouseDown($event)\"\n      (mousemove)=\"onMouseMove($event)\"\n      (mouseup)=\"onMouseUp($event)\"\n      (mouseleave)=\"onMouseLeave()\"\n    >\n      <svg\n        #canvas\n        [attr.width]=\"facade.canvasState().width\"\n        [attr.height]=\"facade.canvasState().height\"\n      >\n        <!-- Grid Pattern -->\n        <defs>\n          <pattern\n            id=\"grid\"\n            [attr.width]=\"facade.canvasState().gridSize\"\n            [attr.height]=\"facade.canvasState().gridSize\"\n            patternUnits=\"userSpaceOnUse\"\n          >\n            <path\n              [attr.d]=\"facade.getGridPattern().path.d\"\n              [ngStyle]=\"facade.getGridPattern().path.style\"\n            />\n          </pattern>\n        </defs>\n\n        <!-- Background grid -->\n        <rect width=\"100%\" height=\"100%\" fill=\"url(#grid)\" />\n\n        <!-- Swimlanes -->\n        @for (swimlane of facade.swimlanes(); track swimlane.id) {\n        <g [attr.transform]=\"facade.getNodeTransforms(swimlane).node\">\n          <rect\n            [attr.width]=\"swimlane.size.width\"\n            [attr.height]=\"swimlane.size.height\"\n            [ngStyle]=\"facade.rendering.getSwimlaneStyle()\"\n          />\n          <!-- <text\n            x=\"100\"\n            y=\"20\"\n            [ngStyle]=\"facade.rendering.getLabelStyle('swimlane')\"\n          >\n            {{ swimlane.label }}\n          </text> -->\n          <!-- <foreignObject\n            [attr.x]=\"labelService.getLabelPosition(swimlane).x\"\n            [attr.y]=\"labelService.getLabelPosition(swimlane).y\"\n            width=\"150\"\n            height=\"40\"\n            style=\"overflow: visible;\"\n          >\n            <wf-label-editor\n              [label]=\"swimlane.label || 'New Swimlane'\"\n              [x]=\"0\"\n              [y]=\"0\"\n              [isSwimlane]=\"true\"\n              (labelChange)=\"updateLabel(swimlane.id, $event)\"\n            />\n          </foreignObject> -->\n\n          <!-- <g\n            wf-swimlane-label\n            [label]=\"swimlane.label\"\n            [count]=\"swimlaneStats.getNodeCount(swimlane.id)\"\n            [x]=\"20\"\n            [y]=\"swimlane.size.height - 20\"\n            (addClick)=\"onSwimlaneAddClick($event, swimlane)\"\n            (labelChange)=\"updateLabel(swimlane.id, $event)\"\n          /> -->\n\n          <g transform=\"translate(30, 20)\">\n            <g\n              wf-swimlane-label\n              [label]=\"swimlane.label\"\n              [count]=\"swimlaneStats.getNodeCount(swimlane.id)\"\n              (addClick)=\"onSwimlaneAddClick($event, swimlane)\"\n              (labelChange)=\"updateLabel(swimlane.id, $event)\"\n            />\n          </g>\n\n          <!-- <foreignObject\n            [attr.x]=\"50\"\n            [attr.y]=\"20\"\n            width=\"150\"\n            height=\"40\"\n            style=\"overflow: visible;\"\n          >\n            <wf-label-editor\n              [label]=\"swimlane.label || 'New Swimlane'\"\n              [x]=\"0\"\n              [y]=\"0\"\n              [isSwimlane]=\"true\"\n              (labelChange)=\"updateLabel(swimlane.id, $event)\"\n            />\n          </foreignObject> -->\n        </g>\n        }\n\n        <!-- Connections with labels -->\n        @for (connection of facade.connections(); track connection.id) {\n        <g\n          class=\"connection\"\n          [class.selected]=\"facade.selection.isSelected(connection.id)\"\n        >\n          <!-- <path\n            [attr.d]=\"facade.getConnectionPath(connection.points)\"\n            [ngStyle]=\"\n              facade.getConnectionStyle(\n                facade.selection.isSelected(connection.id)\n              )\n            \"\n          /> -->\n          <!-- Complete connection path with arrowhead -->\n          <path\n            [attr.d]=\"facade.getConnectionPath(connection.points)\"\n            [ngStyle]=\"\n              facade.getConnectionStyle(\n                facade.selection.isSelected(connection.id)\n              )\n            \"\n          />\n          <!-- Render segments -->\n          @for (point of connection.points; let i = $index; track i) { @if (i <\n          connection.points.length - 1) {\n          <!-- Interactive segment -->\n          <!-- <path\n            [attr.d]=\"getSegmentPath(point, connection.points[i + 1])\"\n            [ngStyle]=\"\n              facade.getConnectionStyle(\n                facade.selection.isSelected(connection.id)\n              )\n            \"\n            [style.cursor]=\"facade.getSegmentCursor(connection.id, i)\"\n            (mousedown)=\"onSegmentMouseDown($event, connection.id, i)\"\n            class=\"connection-segment\"\n          /> -->\n          <g\n            class=\"segment-group\"\n            (mouseenter)=\"\n              hoveredSegment = { connectionId: connection.id, index: i }\n            \"\n            (mouseleave)=\"hoveredSegment = null\"\n          >\n            <!-- Hit detection area -->\n            <path\n              [attr.d]=\"getSegmentPath(point, connection.points[i + 1])\"\n              class=\"segment-hitarea\"\n              [style.cursor]=\"facade.getSegmentCursor(connection.id, i)\"\n              (mousedown)=\"onSegmentMouseDown($event, connection.id, i)\"\n            />\n\n            <!-- Visible segment -->\n            <path\n              [attr.d]=\"getSegmentPath(point, connection.points[i + 1])\"\n              [ngStyle]=\"\n                facade.rendering.getConnectionSegmentStyle(\n                  facade.selection.isSelected(connection.id),\n                  isSegmentHovered(connection.id, i)\n                )\n              \"\n            />\n          </g>\n          } }\n          <!-- Connection Label -->\n          @if (connection.fromId && connection.toId) {\n          <foreignObject\n            [attr.x]=\"labelService.getLabelPosition(connection).x\"\n            [attr.y]=\"labelService.getLabelPosition(connection).y\"\n            width=\"150\"\n            height=\"40\"\n            style=\"overflow: visible; pointer-events: all;\"\n            [attr.transform]=\"'translate(-10, -10)'\"\n          >\n            <wf-label-editor\n              [label]=\"connection.label || 'New Action'\"\n              [x]=\"0\"\n              [y]=\"0\"\n              [isConnection]=\"true\"\n              (labelChange)=\"updateLabel(connection.id, $event)\"\n            />\n          </foreignObject>\n          }\n        </g>\n        }\n\n        <!-- Nodes -->\n        @for (node of facade.nodes(); track node.id) {\n        <g\n          [attr.transform]=\"facade.getNodeTransforms(node).node\"\n          [class.selected]=\"facade.selection.isSelected(node.id)\"\n          [class.dragging]=\"\n            facade.canvasState().isDragging &&\n            facade.selection.isSelected(node.id)\n          \"\n        >\n          @switch (node.type) { @case ('start') {\n          <path\n            [attr.d]=\"facade.getStartNodePaths().circle\"\n            [ngStyle]=\"\n              facade.getNodeStyle(facade.selection.isSelected(node.id))\n            \"\n          />\n          @if (!facade.hasOutgoingConnections(node.id)) {\n          <path\n            [attr.d]=\"facade.getStartNodePaths().arrow\"\n            [attr.transform]=\"facade.getNodeTransforms(node).arrow\"\n            fill=\"#D36CFF\"\n          />\n          } }@case ('form') {\n          <path\n            [attr.d]=\"facade.rendering.generateNodePath(node)\"\n            [ngStyle]=\"\n              facade.getNodeStyle(facade.selection.isSelected(node.id))\n            \"\n          />\n          } @case ('decision') {\n          <path\n            [attr.d]=\"\n              facade.rendering.getDecisionPath(\n                node.size.width,\n                node.size.height\n              )\n            \"\n            [ngStyle]=\"\n              facade.getNodeStyle(facade.selection.isSelected(node.id))\n            \"\n          />\n          } @case ('subflow') {\n          <path\n            [attr.d]=\"\n              facade.rendering.getSubflowPath(node.size.width, node.size.height)\n            \"\n            [ngStyle]=\"\n              facade.getNodeStyle(facade.selection.isSelected(node.id))\n            \"\n          />\n          } @default {\n          <rect\n            [attr.width]=\"node.size.width\"\n            [attr.height]=\"node.size.height\"\n            [attr.rx]=\"4\"\n            [ngStyle]=\"\n              facade.getNodeStyle(facade.selection.isSelected(node.id))\n            \"\n          />\n          } }\n\n          <!-- Node label -->\n          <!-- <text\n            [attr.x]=\"node.size.width / 2\"\n            [attr.y]=\"node.size.height / 2\"\n            [ngStyle]=\"facade.rendering.getLabelStyle(node.type)\"\n          >\n            {{ node.label }}\n          </text> -->\n          <foreignObject\n            [attr.x]=\"0\"\n            [attr.y]=\"0\"\n            [attr.width]=\"node.size.width\"\n            [attr.height]=\"node.size.height\"\n            style=\"overflow: visible;\"\n          >\n            <wf-label-editor\n              [label]=\"node.label\"\n              [x]=\"labelService.getSVGTextPosition(node).x\"\n              [y]=\"labelService.getSVGTextPosition(node).y\"\n              (labelChange)=\"updateLabel(node.id, $event)\"\n            />\n          </foreignObject>\n        </g>\n        }\n\n        <!-- Connection preview with arrowhead -->\n        @if (facade.canvasState().connectionPreview) {\n        <path\n          [attr.d]=\"facade.getConnectionPreviewPath()\"\n          [ngStyle]=\"facade.rendering.getConnectionPreviewStyle()\"\n        />\n        }\n      </svg>\n\n      @if (swimlaneStats.popupStatus().isOpen) {\n      <wf-swimlane-popup\n        [position]=\"swimlaneStats.popupStatus().position\"\n        (close)=\"swimlaneStats.closePopup()\"\n        (actionSelected)=\"onPopupAction($event)\"\n      />\n      }\n    </div>\n\n    <wf-node-selector\n      (select)=\"onNodeSelected($event)\"\n      (cancel)=\"onNodeSelectionCancelled()\"\n    />\n  `,\n  styles: [\n    `\n      .canvas-container {\n        flex: 1;\n        overflow: auto;\n        position: relative;\n        background: white;\n\n        &.connecting {\n          cursor: crosshair;\n        }\n      }\n\n      .connection {\n        path {\n          stroke: #d36cff;\n          stroke-width: 2;\n          fill: none;\n          pointer-events: none;\n        }\n\n        &.selected path {\n          stroke-width: 3;\n        }\n      }\n\n      .selected {\n        & :not(text) {\n          stroke-width: 3;\n        }\n      }\n\n      .dragging {\n        cursor: grabbing;\n      }\n\n      .connection {\n        pointer-events: none;\n      }\n\n      .segment-group {\n        pointer-events: all;\n      }\n\n      .segment-hitarea {\n        stroke: transparent;\n        stroke-width: 10;\n        fill: none;\n      }\n    `,\n  ],\n})\nexport class WFCanvasComponent {\n  @ViewChild('container') containerRef!: ElementRef<HTMLDivElement>;\n  @ViewChild('canvas') canvasRef!: ElementRef<SVGElement>;\n\n  protected labelService = inject(LabelManagementService);\n  protected swimlaneStats = inject(SwimlaneStatsService);\n  private keyboardHandler = inject(KeyboardHandlerService);\n  protected preconditionService = inject(NodePreconditionService);\n\n  hoveredSegment: { connectionId: string; index: number } | null = null;\n\n  constructor(public facade: WorkflowFacadeService) {}\n\n  @HostListener('window:keydown', ['$event'])\n  onKeyDown(event: KeyboardEvent): void {\n    // Only handle keyboard events if the canvas is focused\n    if (this.containerRef.nativeElement.contains(document.activeElement)) {\n      this.keyboardHandler.handleKeyDown(event);\n    }\n  }\n\n  // Add click handler to ensure the canvas can receive keyboard events\n  @HostListener('click')\n  onClick(): void {\n    this.containerRef.nativeElement.focus();\n  }\n\n  updateLabel(objectId: string, newLabel: string): void {\n    this.labelService.updateLabel(objectId, newLabel);\n  }\n\n  // Event handlers\n  onMouseDown(event: MouseEvent): void {\n    this.facade.handleMouseDown(event, this.canvasRef);\n  }\n\n  onMouseMove(event: MouseEvent): void {\n    this.facade.handleMouseMove(event, this.canvasRef);\n  }\n\n  onMouseUp(event: MouseEvent): void {\n    this.facade.handleMouseUp(event, this.canvasRef);\n  }\n\n  onMouseLeave(): void {\n    this.facade.handleMouseLeave();\n  }\n\n  onSwimlaneAddClick(event: MouseEvent, swimlane: any): void {\n    const rect = this.canvasRef.nativeElement.getBoundingClientRect();\n    const position: Position = {\n      x: event.clientX - rect.left + 20,\n      y: event.clientY - rect.top,\n    };\n\n    this.swimlaneStats.openPopup(position, swimlane.id);\n  }\n\n  onPopupAction(actionId: string): void {\n    const swimlaneId = this.swimlaneStats.popupStatus().swimlaneId;\n    if (!swimlaneId) return;\n\n    switch (actionId) {\n      case 'add-above':\n        // Handle adding swimlane above\n        break;\n      case 'add-below':\n        // Handle adding swimlane below\n        break;\n      case 'delete':\n        // Handle deletion\n        break;\n    }\n  }\n\n  getSegmentPath(start: Position, end: Position): string {\n    return `M ${start.x} ${start.y} L ${end.x} ${end.y}`;\n  }\n\n  isSegmentHovered(connectionId: string, index: number): boolean {\n    return (\n      this.hoveredSegment?.connectionId === connectionId &&\n      this.hoveredSegment?.index === index\n    );\n  }\n\n  onSegmentMouseDown(\n    event: MouseEvent,\n    connectionId: string,\n    segmentIndex: number\n  ): void {\n    event.stopPropagation();\n    this.facade.handleSegmentMouseDown(\n      event,\n      this.canvasRef,\n      connectionId,\n      segmentIndex\n    );\n  }\n\n  onNodeSelected(data: PreconditionData): void {\n    this.facade.finalizeNodeCreation(data);\n  }\n\n  onNodeSelectionCancelled(): void {\n    this.facade.preconditionService.clearPendingNode();\n  }\n}\n","// components/workflow/wf-designer.component.ts\nimport {\n  Component,\n  inject,\n  input,\n  OnInit,\n  computed,\n  signal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { WFToolbarComponent } from './wf-toolbar.component';\nimport { WFCanvasComponent } from './wf-canvas.component';\nimport { WorkflowFacadeService } from '../services/wf-facade.service';\nimport { WorkflowObjectType } from '../models/types';\nimport { Workflow } from 'verben-workflow-ui/src/lib/models';\nimport { EnvironmentService } from 'verben-workflow-ui/src/lib/services';\nimport { NodeSelectorComponent } from './node-selector.component';\nimport { PreconditionData } from '../services/node-precondition.service';\n\n@Component({\n  selector: 'wf-designer',\n  standalone: true,\n  imports: [\n    CommonModule,\n    WFToolbarComponent,\n    WFCanvasComponent,\n    NodeSelectorComponent,\n  ],\n  providers: [EnvironmentService],\n  template: `\n    <div class=\"workflow-designer\">\n      <div class=\"workflow-header\">\n        <h1 class=\"workflow-title\">{{ workflowName() }}</h1>\n        <p *ngIf=\"workflowDescription()\" class=\"workflow-description\">\n          {{ workflowDescription() }}\n        </p>\n      </div>\n\n      <wf-toolbar\n        [selectedTool]=\"facade.selectedTool()\"\n        (toolSelected)=\"handleToolSelection($event)\"\n      />\n\n      <wf-canvas />\n\n      <div class=\"workflow-actions\">\n        <button\n          class=\"save-button\"\n          (click)=\"handleSave()\"\n          [disabled]=\"isSaving()\"\n        >\n          {{ isSaving() ? 'Saving...' : 'Save' }}\n        </button>\n      </div>\n\n      <!-- Node selector dialog for forms, subflows, etc. -->\n      <wf-node-selector\n        (select)=\"handleNodeSelection($event)\"\n        (cancel)=\"handleNodeSelectionCancel()\"\n      />\n    </div>\n  `,\n  styles: [\n    `\n      .workflow-designer {\n        display: flex;\n        flex-direction: column;\n        height: 100vh;\n        background: white;\n      }\n\n      .workflow-header {\n        padding: 1rem;\n        border-bottom: 1px solid #e5e7eb;\n      }\n\n      .workflow-title {\n        font-size: 1.25rem;\n        font-weight: 600;\n        color: #111827;\n      }\n\n      .workflow-description {\n        font-size: 0.875rem;\n        color: #6b7280;\n        margin-top: 0.25rem;\n      }\n\n      .workflow-actions {\n        padding: 0.75rem;\n        border-top: 1px solid #e5e7eb;\n        display: flex;\n        justify-content: flex-end;\n      }\n\n      .save-button {\n        padding: 0.5rem 1rem;\n        background-color: #9333ea;\n        color: white;\n        font-weight: 500;\n        border-radius: 0.375rem;\n        border: none;\n        cursor: pointer;\n        transition: background-color 0.2s;\n      }\n\n      .save-button:hover {\n        background-color: #7e22ce;\n      }\n\n      .save-button:disabled {\n        background-color: #d8b4fe;\n        cursor: not-allowed;\n      }\n    `,\n  ],\n})\nexport class WFDesignerComponent implements OnInit {\n  workflowId = input.required<Workflow['Code']>();\n\n  public facade = inject(WorkflowFacadeService);\n  private saving = signal<boolean>(false);\n\n  // Computed signals for reactive UI\n  readonly workflowName = computed(\n    () => this.facade.persistence.workflowMetadata.name || 'Untitled Workflow'\n  );\n\n  readonly workflowDescription = computed(\n    () => this.facade.persistence.workflowMetadata.description || ''\n  );\n\n  readonly isSaving = this.saving.asReadonly();\n\n  constructor() {\n    this.facade.initializeWorkflow();\n  }\n\n  ngOnInit(): void {\n    const workflowId = this.workflowId();\n    if (workflowId) {\n      this.loadWorkflow(workflowId);\n    }\n  }\n\n  private loadWorkflow(workflowId: string): void {\n    this.facade.persistence.loadWorkflow(workflowId).catch((error) => {\n      console.error('Failed to load workflow:', error);\n      // Optionally show an error notification here\n    });\n  }\n\n  handleToolSelection(tool: WorkflowObjectType | null): void {\n    this.facade.handleToolSelection(tool);\n  }\n\n  handleSave(): void {\n    if (this.isSaving()) return;\n\n    this.saving.set(true);\n\n    this.facade.persistence\n      .saveWorkflow()\n      .then((results) => {\n        console.log('Workflow saved successfully:', results);\n        // Optionally show a success notification\n      })\n      .catch((error) => {\n        console.error('Error saving workflow:', error);\n        // Optionally show an error notification\n      })\n      .finally(() => {\n        this.saving.set(false);\n      });\n  }\n\n  handleNodeSelection(data: PreconditionData): void {\n    this.facade.finalizeNodeCreation(data);\n  }\n\n  handleNodeSelectionCancel(): void {\n    // The node selection was canceled, clear the pending node\n    this.facade.preconditionService.clearPendingNode();\n  }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.ConnectionService","i1","i1.WorkflowFacadeService"],"mappings":"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"}