{"version":3,"file":"ng-draw-flow-core.mjs","sources":["../../../projects/ng-draw-flow/src/lib/ng-draw-flow.interfaces.ts","../../../projects/ng-draw-flow/src/lib/ng-draw-flow.configs.ts","../../../projects/ng-draw-flow/src/lib/services/interaction-state.service.ts","../../../projects/ng-draw-flow/src/lib/components/connections/connections.service.ts","../../../projects/ng-draw-flow/src/lib/components/connectors/base-connector.ts","../../../projects/ng-draw-flow/src/lib/components/connectors/input.component.ts","../../../projects/ng-draw-flow/src/lib/services/connector-order-registry.service.ts","../../../projects/ng-draw-flow/src/lib/consts/handlers.ts","../../../projects/ng-draw-flow/src/lib/consts/initial-coordinates.ts","../../../projects/ng-draw-flow/src/lib/helpers/clamp.ts","../../../projects/ng-draw-flow/src/lib/helpers/connector.ts","../../../projects/ng-draw-flow/src/lib/helpers/deep-equal.ts","../../../projects/ng-draw-flow/src/lib/helpers/distance-between-points.ts","../../../projects/ng-draw-flow/src/lib/helpers/distance-between-touches.ts","../../../projects/ng-draw-flow/src/lib/helpers/events.ts","../../../projects/ng-draw-flow/src/lib/helpers/px.ts","../../../projects/ng-draw-flow/src/lib/ng-draw-flow.token.ts","../../../projects/ng-draw-flow/src/lib/services/coordinates.service.ts","../../../projects/ng-draw-flow/src/lib/components/pan-zoom/pan-zoom.bounds-tracker.ts","../../../projects/ng-draw-flow/src/lib/components/pan-zoom/pan-zoom.service.ts","../../../projects/ng-draw-flow/src/lib/components/connections/utils/get-coonector-dataset.util.ts","../../../projects/ng-draw-flow/src/lib/components/connections/draft-connection/draft-connection.service.ts","../../../projects/ng-draw-flow/src/lib/components/connectors/output.component.ts","../../../projects/ng-draw-flow/src/lib/components/pan-zoom/pan-zoom.options.ts","../../../projects/ng-draw-flow/src/lib/helpers/collect-invalid-node-ids.ts","../../../projects/ng-draw-flow/src/lib/validators/invalid-nodes.token.ts","../../../projects/ng-draw-flow/src/lib/directives/errors/errors.directive.ts","../../../projects/ng-draw-flow/src/lib/components/pan-zoom/pan-zoom.camera.math.ts","../../../projects/ng-draw-flow/src/lib/directives/drag-drop/drag-drop.enum.ts","../../../projects/ng-draw-flow/src/lib/directives/drag-drop/drag-drop.service.ts","../../../projects/ng-draw-flow/src/lib/directives/drag-drop/drag-drop.directive.ts","../../../projects/ng-draw-flow/src/lib/components/pan-zoom/pan-zoom.const.ts","../../../projects/ng-draw-flow/src/lib/components/pan-zoom/pan-zoom.controller.service.ts","../../../projects/ng-draw-flow/src/lib/components/pan-zoom/pan-zoom-background-canvas.component.ts","../../../projects/ng-draw-flow/src/lib/components/pan-zoom/pan-zoom-gestures.service.ts","../../../projects/ng-draw-flow/src/lib/components/pan-zoom/pan-zoom.component.ts","../../../projects/ng-draw-flow/src/lib/components/pan-zoom/pan-zoom.component.html","../../../projects/ng-draw-flow/src/lib/services/ng-draw-flow-store.service.ts","../../../projects/ng-draw-flow/src/lib/services/selection.service.ts","../../../projects/ng-draw-flow/src/lib/directives/selectable-element/selectable-element.directive.ts","../../../projects/ng-draw-flow/src/lib/helpers/editor-keyboard-event.ts","../../../projects/ng-draw-flow/src/lib/components/connections/utils/calculate-distance.util.ts","../../../projects/ng-draw-flow/src/lib/components/connections/utils/connection-paths/bezier/helpers/bezier-edge-center.ts","../../../projects/ng-draw-flow/src/lib/components/connections/utils/connection-paths/bezier/helpers/control-offset.ts","../../../projects/ng-draw-flow/src/lib/components/connections/utils/point.ts","../../../projects/ng-draw-flow/src/lib/components/connections/utils/connection-paths/bezier/helpers/control-with-curvature.ts","../../../projects/ng-draw-flow/src/lib/components/connections/utils/connection-paths/bezier/bezier.ts","../../../projects/ng-draw-flow/src/lib/components/connections/utils/connection-paths/smooth-step/path-parts/bend.ts","../../../projects/ng-draw-flow/src/lib/components/connections/utils/connection-paths/smooth-step/helpers/get-primary-direction.ts","../../../projects/ng-draw-flow/src/lib/components/connections/utils/connection-paths/smooth-step/helpers/smooth-step-edge-center.ts","../../../projects/ng-draw-flow/src/lib/components/connections/utils/connection-paths/smooth-step/smooth-step.consts.ts","../../../projects/ng-draw-flow/src/lib/components/connections/utils/connection-paths/smooth-step/path-parts/waypoints.ts","../../../projects/ng-draw-flow/src/lib/components/connections/utils/connection-paths/smooth-step/smooth-step.ts","../../../projects/ng-draw-flow/src/lib/components/connections/connection/connection.component.ts","../../../projects/ng-draw-flow/src/lib/components/connections/connection/connection.component.svg","../../../projects/ng-draw-flow/src/lib/components/connections/draft-connection/draft-connection.component.ts","../../../projects/ng-draw-flow/src/lib/components/connections/draft-connection/draft-connection.component.svg","../../../projects/ng-draw-flow/src/lib/services/node-size-registry.service.ts","../../../projects/ng-draw-flow/src/lib/components/node/node-connectors.controller.ts","../../../projects/ng-draw-flow/src/lib/components/node/node-content.renderer.ts","../../../projects/ng-draw-flow/src/lib/components/node/node-content.host.ts","../../../projects/ng-draw-flow/src/lib/components/node/node-geometry.controller.ts","../../../projects/ng-draw-flow/src/lib/components/node/node-interaction.controller.ts","../../../projects/ng-draw-flow/src/lib/components/node/node.component.ts","../../../projects/ng-draw-flow/src/lib/components/node/node.component.html","../../../projects/ng-draw-flow/src/lib/components/scene/scene.component.ts","../../../projects/ng-draw-flow/src/lib/components/scene/scene.component.html","../../../projects/ng-draw-flow/src/lib/ng-draw-flow.component.ts","../../../projects/ng-draw-flow/src/lib/ng-draw-flow.component.html","../../../projects/ng-draw-flow/src/lib/ng-draw-flow-node.base.ts","../../../projects/ng-draw-flow/src/lib/validators/cycle-detection/helpers.ts","../../../projects/ng-draw-flow/src/lib/validators/cycle-detection/cycle-detection.validator.ts","../../../projects/ng-draw-flow/src/lib/validators/isolated-nodes/isolated-nodes.validator.ts","../../../projects/ng-draw-flow/src/ng-draw-flow-core.ts"],"sourcesContent":["import {type Type} from '@angular/core';\nimport {type PolymorpheusContent} from '@taiga-ui/polymorpheus';\n\nimport {type DrawFlowBaseNode} from './ng-draw-flow-node.base';\n\nexport enum DfConnectionType {\n    Bezier = 'bezier',\n    SmoothStep = 'smoothStep',\n}\n\nexport enum DfConnectorPosition {\n    Top = 'top',\n    Right = 'right',\n    Bottom = 'bottom',\n    Left = 'left',\n}\n\nexport enum DfArrowhead {\n    Arrow = 'arrow',\n    ArrowClosed = 'arrowClosed',\n    None = 'none',\n}\n\nexport interface DfArrowheadOptions {\n    type: DfArrowhead;\n    width: number;\n    height: number;\n}\n\nexport interface DfArrowheadOptionsInput {\n    type?: DfArrowhead;\n    width?: number;\n    height?: number;\n}\n\nexport interface DfConnectionOptions {\n    type: DfConnectionType;\n    arrowhead: DfArrowheadOptions;\n    curvature: number;\n}\n\nexport interface DfConnectionOptionsInput {\n    type: DfConnectionType;\n    arrowhead: DfArrowheadOptionsInput;\n    curvature: number;\n}\n\n/** Per-editor permissions. Omitted input fields inherit provider defaults. */\nexport interface DfInteractionOptions {\n    readonly nodesDraggable: boolean;\n    readonly nodesDeletable: boolean;\n    readonly connectionsDeletable: boolean;\n    readonly connectionsCreatable: boolean;\n}\n\nexport interface DfWorkspaceOptions {\n    nodeDragThreshold: number;\n    /** @deprecated Bind interactionOptions.nodesDraggable on ng-draw-flow instead. */\n    nodesDraggable: boolean;\n    /** @deprecated Bind interactionOptions.nodesDeletable on ng-draw-flow instead. */\n    nodesDeletable: boolean;\n    /** @deprecated Bind interactionOptions.connectionsDeletable on ng-draw-flow instead. */\n    connectionsDeletable: boolean;\n    /** @deprecated Bind interactionOptions.connectionsCreatable on ng-draw-flow instead. */\n    connectionsCreatable: boolean;\n}\n\nexport type DfNodePositionAnimationEasing = 'ease-in-out' | 'linear';\n\nexport interface DfNodePositionAnimationOptions {\n    duration: number;\n    easing: DfNodePositionAnimationEasing;\n}\n\nexport interface DfOptions {\n    connection: DfConnectionOptions;\n    nodes: DfComponents;\n    options: DfWorkspaceOptions;\n    positionAnimation?: DfNodePositionAnimationOptions;\n}\n\nexport interface DfOptionsInput {\n    connection?: Partial<DfConnectionOptionsInput>;\n    nodes?: DfComponents;\n    options?: Partial<DfWorkspaceOptions>;\n    positionAnimation?: Partial<DfNodePositionAnimationOptions>;\n}\n\nexport type DfComponents = Record<string, Type<DrawFlowBaseNode>>;\n\nexport interface DfPoint {\n    x: number;\n    y: number;\n}\n\nexport interface DfNodeSize {\n    width: number;\n    height: number;\n}\n\nexport interface DfDelta {\n    deltaX: number;\n    deltaY: number;\n}\n\nexport interface DfDataModel {\n    nodes: Array<DfDataInitialNode | DfDataNode>;\n    connections: DfDataConnection[];\n}\n\nexport interface DfDataInitialNode {\n    id: string;\n    /**\n     * Additional CSS class or classes applied to the node wrapper.\n     * Use it to target a particular node from application styles without\n     * coupling styles to the node content implementation.\n     */\n    className?: string[] | string;\n    data: {\n        type: string;\n        connectionLabel?: DfConnectionLabel;\n        [key: string]: any;\n    };\n    startNode?: boolean;\n    endNode?: boolean;\n}\n\nexport interface DfDataNode extends DfDataInitialNode {\n    position: DfPoint;\n}\n\nexport interface DfConnectionLabel<Content = unknown, Context = unknown> {\n    content: PolymorpheusContent<Content>;\n    context?: Context;\n}\n\nexport interface DfDataConnection {\n    source: DfDataConnector;\n    target: DfDataConnector;\n    label?: DfConnectionLabel;\n}\n\nexport type DfId = string;\n\nexport interface DfDataConnector {\n    readonly nodeId: DfId;\n    readonly connectorType: DfConnectionPoint;\n    readonly connectorId: DfId;\n    readonly position?: string;\n    readonly connectionLabel?: DfConnectionLabel;\n}\n\nexport interface DfDataConnectorConfig {\n    readonly nodeId: DfId;\n    readonly connectorId: DfId;\n    readonly single: boolean;\n    readonly data?: Record<string, unknown>;\n}\n\nexport interface DfConnectorContentContext {\n    readonly $implicit: DfDataConnectorConfig;\n}\n\nexport interface DfConnectorData {\n    point: DfPoint;\n    position: DfConnectorPosition | null;\n}\n\nexport enum DfConnectionPoint {\n    Input = 'input',\n    Output = 'output',\n}\n\nexport enum DfOutputMode {\n    Action = 'action',\n    Connection = 'connection',\n}\n\nexport interface DfEvent<T> {\n    readonly target: T;\n    readonly model: DfDataModel;\n}\n","import {type FactoryProvider, InjectionToken} from '@angular/core';\n\nimport {\n    DfArrowhead,\n    DfConnectionType,\n    type DfOptions,\n    type DfOptionsInput,\n} from './ng-draw-flow.interfaces';\n\nexport const DRAW_FLOW_DEFAULT_OPTIONS: DfOptions = {\n    connection: {\n        arrowhead: {type: DfArrowhead.None, width: 8, height: 4},\n        type: DfConnectionType.Bezier,\n        curvature: 0.25,\n    },\n    nodes: {},\n    options: {\n        nodeDragThreshold: 1,\n        nodesDraggable: true,\n        nodesDeletable: true,\n        connectionsDeletable: true,\n        connectionsCreatable: true,\n    },\n    positionAnimation: {\n        duration: 0,\n        easing: 'ease-in-out',\n    },\n};\n\nexport const DRAW_FLOW_OPTIONS = new InjectionToken('[DRAW_FLOW_OPTIONS]: Options', {\n    factory: () => DRAW_FLOW_DEFAULT_OPTIONS,\n});\n\nexport function provideNgDrawFlowConfigs(options: DfOptionsInput = {}): FactoryProvider {\n    return {\n        provide: DRAW_FLOW_OPTIONS,\n        useFactory: (): DfOptions => ({\n            connection: {\n                ...DRAW_FLOW_DEFAULT_OPTIONS.connection,\n                ...options.connection,\n                arrowhead: {\n                    ...DRAW_FLOW_DEFAULT_OPTIONS.connection.arrowhead,\n                    ...options.connection?.arrowhead,\n                },\n            },\n            nodes: {\n                ...DRAW_FLOW_DEFAULT_OPTIONS.nodes,\n                ...options.nodes,\n            },\n            options: {\n                ...DRAW_FLOW_DEFAULT_OPTIONS.options,\n                ...options.options,\n            },\n            positionAnimation: {\n                ...DRAW_FLOW_DEFAULT_OPTIONS.positionAnimation!,\n                ...options.positionAnimation,\n            },\n        }),\n    };\n}\n","import {computed, Injectable, signal, untracked} from '@angular/core';\nimport {merge, Subject} from 'rxjs';\n\nimport {DRAW_FLOW_DEFAULT_OPTIONS} from '../ng-draw-flow.configs';\nimport {type DfInteractionOptions} from '../ng-draw-flow.interfaces';\n\n/** Per-editor form state used to guard user editing in descendant components. */\n@Injectable()\nexport class DfInteractionStateService {\n    private readonly disabledSignal = signal(false);\n    private readonly readonlySignal = signal(false);\n    private readonly cancellationSubject = new Subject<void>();\n    private readonly nodeDragCancelledSubject = new Subject<void>();\n    private readonly connectionCreationCancelledSubject = new Subject<void>();\n    private readonly defaults = signal<DfInteractionOptions>(\n        DRAW_FLOW_DEFAULT_OPTIONS.options,\n    );\n\n    private readonly overrides = signal<Partial<DfInteractionOptions>>({});\n\n    public readonly cancellation$ = this.cancellationSubject.asObservable();\n    public readonly nodeDragCancellation$ = merge(\n        this.cancellation$,\n        this.nodeDragCancelledSubject,\n    );\n\n    public readonly connectionCreationCancellation$ = merge(\n        this.cancellation$,\n        this.connectionCreationCancelledSubject,\n    );\n\n    public readonly disabled = this.disabledSignal.asReadonly();\n    public readonly readonly = this.readonlySignal.asReadonly();\n    public readonly editingDisabled = computed(\n        () => this.disabledSignal() || this.readonlySignal(),\n    );\n\n    public readonly nodesDraggable = computed(() => this.isAllowed('nodesDraggable'));\n    public readonly nodesDeletable = computed(() => this.isAllowed('nodesDeletable'));\n    public readonly connectionsCreatable = computed(() =>\n        this.isAllowed('connectionsCreatable'),\n    );\n\n    public readonly connectionsDeletable = computed(() =>\n        this.isAllowed('connectionsDeletable'),\n    );\n\n    public setDefaults(value: DfInteractionOptions): void {\n        this.updatePermissions(() => this.defaults.set(value));\n    }\n\n    public setOptions(value: Partial<DfInteractionOptions>): void {\n        this.updatePermissions(() => this.overrides.set(value));\n    }\n\n    public setDisabled(value: boolean): void {\n        this.updatePermissions(() => this.disabledSignal.set(value));\n    }\n\n    public setReadonly(value: boolean): void {\n        this.updatePermissions(() => this.readonlySignal.set(value));\n    }\n\n    public cancelEditing(): void {\n        this.cancellationSubject.next();\n    }\n\n    private isAllowed(key: keyof DfInteractionOptions): boolean {\n        return !this.editingDisabled() && (this.overrides()[key] ?? this.defaults()[key]);\n    }\n\n    private updatePermissions(update: () => void): void {\n        untracked(() => {\n            const couldDrag = this.nodesDraggable();\n            const couldConnect = this.connectionsCreatable();\n\n            update();\n\n            if (couldDrag && !this.nodesDraggable()) {\n                this.nodeDragCancelledSubject.next();\n            }\n\n            if (couldConnect && !this.connectionsCreatable()) {\n                this.connectionCreationCancelledSubject.next();\n            }\n        });\n    }\n}\n","import {Injectable, signal} from '@angular/core';\nimport {toObservable} from '@angular/core/rxjs-interop';\nimport {Subject} from 'rxjs';\n\nimport {type DfDataConnection} from '../../ng-draw-flow.interfaces';\n\n@Injectable()\nexport class ConnectionsService {\n    private readonly connectionsSignal = signal<DfDataConnection[]>([]);\n    private readonly usedConnectorsSignal = signal<string[]>([]);\n    private readonly selectedNodeIdSignal = signal<string | null>(null);\n    private readonly connectionsChangedSubject = new Subject<DfDataConnection[]>();\n\n    public readonly connections = this.connectionsSignal.asReadonly();\n    public readonly usedConnectors = this.usedConnectorsSignal.asReadonly();\n    public readonly selectedNodeId = this.selectedNodeIdSignal.asReadonly();\n\n    public readonly connections$ = toObservable(this.connectionsSignal);\n    public readonly usedConnectors$ = toObservable(this.usedConnectorsSignal);\n    public readonly selectedNodeId$ = toObservable(this.selectedNodeIdSignal);\n    /** Emits synchronous, user-originated connection changes. */\n    public readonly connectionsChanged$ = this.connectionsChangedSubject.asObservable();\n\n    public setConnections(connections: DfDataConnection[]): void {\n        const usedConnectors = this.collectUsedConnectors(connections);\n\n        this.usedConnectorsSignal.set(usedConnectors);\n        this.connectionsSignal.set([...connections]);\n    }\n\n    public addConnections(connections: DfDataConnection[]): void {\n        const accepted = [...this.connectionsSignal()];\n        const newConnections = connections.filter((newConnection) => {\n            if (\n                accepted.some((existingConnection) =>\n                    this.areConnectionsEqual(existingConnection, newConnection),\n                )\n            ) {\n                return false;\n            }\n\n            accepted.push(newConnection);\n\n            return true;\n        });\n\n        if (newConnections.length === 0) {\n            return;\n        }\n\n        const updatedUsedConnectors = [...this.usedConnectorsSignal()];\n\n        newConnections.forEach((connection) => {\n            if (!updatedUsedConnectors.includes(connection.source.connectorId)) {\n                updatedUsedConnectors.push(connection.source.connectorId);\n            }\n\n            if (!updatedUsedConnectors.includes(connection.target.connectorId)) {\n                updatedUsedConnectors.push(connection.target.connectorId);\n            }\n        });\n\n        this.usedConnectorsSignal.set(updatedUsedConnectors);\n        this.commitUserChange([...this.connectionsSignal(), ...newConnections]);\n    }\n\n    public removeConnection(connectionToRemove: DfDataConnection): void {\n        const filteredConnections = this.connectionsSignal().filter(\n            (existingConnection) =>\n                !this.areConnectionsEqual(existingConnection, connectionToRemove),\n        );\n\n        const usedConnectors = this.usedConnectorsSignal().filter((connectorId: string) =>\n            filteredConnections.some(\n                (connection) =>\n                    connection.source.connectorId === connectorId ||\n                    connection.target.connectorId === connectorId,\n            ),\n        );\n\n        if (filteredConnections.length === this.connectionsSignal().length) {\n            return;\n        }\n\n        this.usedConnectorsSignal.set(usedConnectors);\n        this.commitUserChange(filteredConnections);\n    }\n\n    public removeConnectionsByNodeId(id: string): void {\n        const connectionsToKeep = this.connectionsSignal().filter(\n            (connection) =>\n                connection.source.nodeId !== id && connection.target.nodeId !== id,\n        );\n\n        const usedConnectors = this.usedConnectorsSignal().filter((connectorId: string) =>\n            connectionsToKeep.some(\n                (connection) =>\n                    connection.source.connectorId === connectorId ||\n                    connection.target.connectorId === connectorId,\n            ),\n        );\n\n        if (connectionsToKeep.length === this.connectionsSignal().length) {\n            return;\n        }\n\n        this.usedConnectorsSignal.set(usedConnectors);\n        this.commitUserChange(connectionsToKeep);\n    }\n\n    public removeConnectionsByConnectorId(connectorIdToRemove: string): void {\n        if (!connectorIdToRemove) {\n            return;\n        }\n\n        const connectionsToKeep = this.connectionsSignal().filter(\n            (connection) =>\n                connection.source.connectorId !== connectorIdToRemove &&\n                connection.target.connectorId !== connectorIdToRemove,\n        );\n\n        const usedConnectors = this.collectUsedConnectors(connectionsToKeep);\n\n        if (connectionsToKeep.length === this.connectionsSignal().length) {\n            return;\n        }\n\n        this.usedConnectorsSignal.set(usedConnectors);\n        this.commitUserChange(connectionsToKeep);\n    }\n\n    public highlightConnectionsForNode(nodeId: string | null): void {\n        if (this.selectedNodeIdSignal() === nodeId) {\n            return;\n        }\n\n        this.selectedNodeIdSignal.set(nodeId);\n    }\n\n    private areConnectionsEqual(\n        connection1: DfDataConnection,\n        connection2: DfDataConnection,\n    ): boolean {\n        return (\n            connection1.source.nodeId === connection2.source.nodeId &&\n            connection1.source.connectorType === connection2.source.connectorType &&\n            connection1.source.connectorId === connection2.source.connectorId &&\n            connection1.target.nodeId === connection2.target.nodeId &&\n            connection1.target.connectorType === connection2.target.connectorType &&\n            connection1.target.connectorId === connection2.target.connectorId\n        );\n    }\n\n    private collectUsedConnectors(connections: DfDataConnection[]): string[] {\n        const connectorIds = new Set<string>();\n\n        connections.forEach((connection) => {\n            connectorIds.add(connection.source.connectorId);\n            connectorIds.add(connection.target.connectorId);\n        });\n\n        return Array.from(connectorIds);\n    }\n\n    private commitUserChange(connections: DfDataConnection[]): void {\n        this.connectionsSignal.set(connections);\n        this.connectionsChangedSubject.next(connections);\n    }\n}\n","import {\n    computed,\n    Directive,\n    effect,\n    ElementRef,\n    inject,\n    input,\n    signal,\n} from '@angular/core';\nimport {type PolymorpheusContent} from '@taiga-ui/polymorpheus';\n\nimport {DRAW_FLOW_OPTIONS} from '../../ng-draw-flow.configs';\nimport {\n    type DfConnectionPoint,\n    type DfConnectorContentContext,\n    type DfConnectorPosition,\n    type DfDataConnectorConfig,\n    type DfPoint,\n} from '../../ng-draw-flow.interfaces';\nimport {DfInteractionStateService} from '../../services/interaction-state.service';\nimport {ConnectionsService} from '../connections/connections.service';\n\n@Directive({\n    host: {\n        '[attr.data-connector-type]': 'connectorType',\n        '[attr.data-node-id]': 'bindNodeId',\n        '[attr.data-connector-id]': 'bindConnectorId',\n        '[attr.data-position]': 'bindPosition',\n        '[class.df-has-content]': 'hasContent',\n        '[class.df-not-creatable]': '!connectorVisible',\n        '[class.df-disabled]': 'disabled',\n    },\n})\nexport abstract class BaseConnector {\n    private readonly isDisabled = signal(false);\n    private readonly options = inject(DRAW_FLOW_OPTIONS);\n\n    protected connectorType!: DfConnectionPoint;\n    protected readonly connectionsService = inject(ConnectionsService);\n    protected readonly interactionState = inject(DfInteractionStateService, {\n        optional: true,\n    });\n\n    public readonly content = input<\n        PolymorpheusContent<DfConnectorContentContext> | undefined\n    >();\n\n    public readonly contentContext = computed<DfConnectorContentContext>(() => ({\n        $implicit: this.data,\n    }));\n\n    public coordinates?: DfPoint;\n    public readonly nativeElement = inject(ElementRef).nativeElement;\n\n    constructor() {\n        effect(() => {\n            const connectorId = this.data?.connectorId;\n\n            if (!connectorId) {\n                return;\n            }\n\n            this.setupDisabledState(\n                this.connectionsService.usedConnectors().includes(connectorId),\n            );\n        });\n    }\n\n    public abstract get position(): DfConnectorPosition | undefined;\n\n    protected abstract get data(): DfDataConnectorConfig;\n\n    public get connectionsCreatable(): boolean {\n        return (\n            this.interactionState?.connectionsCreatable() ??\n            this.options.options.connectionsCreatable\n        );\n    }\n\n    public get connectorVisible(): boolean {\n        return this.connectionsCreatable;\n    }\n\n    public get disabled(): boolean {\n        return this.isDisabled() || (this.interactionState?.editingDisabled() ?? false);\n    }\n\n    public get hasContent(): boolean {\n        return this.content() !== undefined && this.content() !== null;\n    }\n\n    public get bindNodeId(): string | undefined {\n        return this.data?.nodeId;\n    }\n\n    public get bindConnectorId(): string | undefined {\n        return this.data?.connectorId;\n    }\n\n    public get bindPosition(): DfConnectorPosition | undefined {\n        return this.position;\n    }\n\n    public destroy(): void {\n        if (!this.data?.connectorId) {\n            return;\n        }\n\n        this.connectionsService.removeConnectionsByConnectorId(this.data.connectorId);\n    }\n\n    protected setupDisabledState(connected: boolean): void {\n        if (connected) {\n            this.nativeElement.setAttribute('data-connected', 'true');\n        } else {\n            this.nativeElement.removeAttribute('data-connected');\n        }\n\n        this.isDisabled.set((this.data?.single satisfies boolean) && connected);\n    }\n}\n","import {ChangeDetectionStrategy, Component, input} from '@angular/core';\nimport {PolymorpheusOutlet} from '@taiga-ui/polymorpheus';\n\nimport {\n    DfConnectionPoint,\n    DfConnectorPosition,\n    type DfDataConnectorConfig,\n} from '../../ng-draw-flow.interfaces';\nimport {BaseConnector} from './base-connector';\n\n@Component({\n    standalone: true,\n    selector: 'df-input',\n    imports: [PolymorpheusOutlet],\n    template: `\n        @if (hasContent) {\n            <span class=\"df-connector-content\">\n                <ng-container\n                    *polymorpheusOutlet=\"content() as value; context: contentContext()\"\n                >\n                    {{ value }}\n                </ng-container>\n            </span>\n        }\n    `,\n    styleUrl: './connector.style.less',\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DfInputComponent extends BaseConnector {\n    protected override connectorType = DfConnectionPoint.Input;\n\n    public readonly dataInput = input.required<DfDataConnectorConfig>({\n        alias: 'connectorData',\n    });\n\n    public readonly positionInput = input(DfConnectorPosition.Left, {\n        alias: 'position',\n    });\n\n    public get data(): DfDataConnectorConfig {\n        return this.dataInput();\n    }\n\n    public override get position(): DfConnectorPosition {\n        return this.positionInput();\n    }\n}\n","import {Injectable, InjectionToken, signal, untracked} from '@angular/core';\n\nimport {type DfId} from '../ng-draw-flow.interfaces';\n\nexport type DfConnectorLayoutOrder = number | null;\nexport type DfNodeConnectorOrders = ReadonlyMap<\n    DfId,\n    ReadonlyMap<DfId, DfConnectorLayoutOrder>\n>;\n\n@Injectable()\nexport class DfConnectorOrderRegistryService {\n    private readonly ordersSignal = signal<DfNodeConnectorOrders>(new Map());\n\n    public readonly orders = this.ordersSignal.asReadonly();\n\n    public set(nodeId: DfId, connectorId: DfId, order?: number): void {\n        const current = untracked(this.ordersSignal);\n        const nodeOrders = current.get(nodeId) ?? new Map();\n        const nextOrder = order ?? null;\n\n        if (nodeOrders.get(connectorId) === nextOrder) {\n            return;\n        }\n\n        const nextNodeOrders = new Map(nodeOrders);\n\n        nextNodeOrders.set(connectorId, nextOrder);\n        this.ordersSignal.set(new Map(current).set(nodeId, nextNodeOrders));\n    }\n\n    public remove(nodeId: DfId, connectorId: DfId): void {\n        const current = untracked(this.ordersSignal);\n        const nodeOrders = current.get(nodeId);\n\n        if (!nodeOrders?.has(connectorId)) {\n            return;\n        }\n\n        const next = new Map(current);\n        const nextNodeOrders = new Map(nodeOrders);\n\n        nextNodeOrders.delete(connectorId);\n\n        if (nextNodeOrders.size) {\n            next.set(nodeId, nextNodeOrders);\n        } else {\n            next.delete(nodeId);\n        }\n\n        this.ordersSignal.set(next);\n    }\n}\n\nexport const DF_CONNECTOR_ORDER_REGISTRY =\n    new InjectionToken<DfConnectorOrderRegistryService | null>(\n        '[DF_CONNECTOR_ORDER_REGISTRY]: Optional connector layout-order registry',\n        {factory: () => null},\n    );\n","/**\n * Handler that always returns `false`.\n */\nexport const DF_FALSE_HANDLER = (): false => false;\n\n/**\n * Handler that always returns `true`.\n */\nexport const DF_TRUE_HANDLER = (): true => true;\n","import {type DfPoint} from '../ng-draw-flow.interfaces';\n\nexport const INITIAL_COORDINATES: DfPoint = {x: 0, y: 0};\n","/**\n * Clamps a value between two inclusive limits\n *\n * @param value\n * @param min lower limit\n * @param max upper limit\n */\nexport function dfClamp(value: number, min: number, max: number): number {\n    return Math.min(max, Math.max(min, value));\n}\n","import {type DfConnectionPoint, type DfDataConnector} from '../ng-draw-flow.interfaces';\n\nexport function isConnectorType(type: string): type is DfConnectionPoint {\n    return ['input', 'output'].includes(type);\n}\n\n/**\n * Creates a unique string identifier for a connector.\n *\n * The function generates a string that uniquely identifies a connector\n * based on its key properties: node identifier, connector type, and\n * connector identifier. The resulting identifier is used\n * as a key in various data structures (e.g., in connectionPointsMap)\n * for tracking and updating connector positions.\n *\n * @param connector - Connector object containing nodeId, connectorType, and connectorId\n * @returns Collision-free JSON encoding of the connector identity tuple.\n */\nexport function createConnectorHash(connector: DfDataConnector): string {\n    return JSON.stringify([\n        connector.nodeId,\n        connector.connectorType,\n        connector.connectorId,\n    ]);\n}\n","/**\n * Deep comparison of two values\n * @param a - first value to compare\n * @param b - second value to compare\n * @param visited - Map to track visited objects (for circular reference detection)\n * @returns boolean result of comparison\n */\nexport function deepEqual(a: any, b: any, visited = new Map()): boolean {\n    // 1. Strict equality & primitives\n    if (a === b) {\n        return true;\n    }\n\n    if (a == null || b == null) {\n        return false;\n    } // handles null & undefined\n\n    const typeA = typeof a;\n    const typeB = typeof b;\n\n    if (typeA !== typeB) {\n        return false;\n    }\n\n    // Special-case NaN\n    if (typeA !== 'object') {\n        return typeA === 'number' && Number.isNaN(a) && Number.isNaN(b);\n    }\n\n    // 2. Circular-reference handling\n    if (visited.has(a)) {\n        return visited.get(a) === b;\n    }\n\n    visited.set(a, b);\n\n    // 3. Arrays\n    const isArrayA = Array.isArray(a);\n    const isArrayB = Array.isArray(b);\n\n    if (isArrayA !== isArrayB) {\n        return false;\n    }\n\n    if (isArrayA) {\n        if (a.length !== b.length) {\n            return false;\n        }\n\n        for (let i = 0; i < a.length; i++) {\n            if (!deepEqual(a[i], b[i], visited)) {\n                return false;\n            }\n        }\n\n        return true;\n    }\n\n    // 4. Special built-ins\n    if (a instanceof Date && b instanceof Date) {\n        return a.getTime() === b.getTime();\n    }\n\n    if (a instanceof RegExp && b instanceof RegExp) {\n        return a.toString() === b.toString();\n    }\n\n    // 5. Map\n    if (a instanceof Map && b instanceof Map) {\n        if (a.size !== b.size) {\n            return false;\n        }\n\n        for (const [key, value] of a.entries()) {\n            if (!b.has(key) || !deepEqual(value, b.get(key), visited)) {\n                return false;\n            }\n        }\n\n        return true;\n    }\n\n    // 6. Set\n    if (a instanceof Set && b instanceof Set) {\n        if (a.size !== b.size) {\n            return false;\n        }\n\n        const arrA = Array.from(a);\n        const arrB = Array.from(b);\n\n        const primitivesOnly = (arr: unknown[]): boolean =>\n            arr.every((item) => typeof item !== 'object' || item === null);\n\n        // Primitive sets → sort with comparator for deterministic equality\n        if (primitivesOnly(arrA) && primitivesOnly(arrB)) {\n            const primitiveCompare = (x: unknown, y: unknown): number =>\n                typeof x === 'number' && typeof y === 'number'\n                    ? x - y\n                    : String(x).localeCompare(String(y));\n\n            arrA.sort(primitiveCompare);\n            arrB.sort(primitiveCompare);\n\n            for (let i = 0; i < arrA.length; i++) {\n                if (arrA[i] !== arrB[i]) {\n                    return false;\n                }\n            }\n\n            return true;\n        }\n\n        // Non-primitive sets → element-wise deep comparison\n        return (\n            arrA.every((itemA) =>\n                arrB.some((itemB) => deepEqual(itemA, itemB, new Map(visited))),\n            ) &&\n            arrB.every((itemB) =>\n                arrA.some((itemA) => deepEqual(itemA, itemB, new Map(visited))),\n            )\n        );\n    }\n\n    // 7. Plain objects\n    const keysA = Object.keys(a);\n    const keysB = Object.keys(b);\n\n    if (keysA.length !== keysB.length) {\n        return false;\n    }\n\n    return keysA.every(\n        (key) =>\n            Object.prototype.hasOwnProperty.call(b, key) &&\n            deepEqual(a[key], b[key], visited),\n    );\n}\n","import {type DfDelta} from '../ng-draw-flow.interfaces';\n\nexport function dfDistanceBetweenPoints(\n    firstEvent: PointerEvent,\n    secondEvent: PointerEvent,\n): DfDelta {\n    const deltaX = secondEvent.clientX - firstEvent.clientX;\n    const deltaY = secondEvent.clientY - firstEvent.clientY;\n\n    return {deltaX, deltaY};\n}\n","export function dfDistanceBetweenTouches({touches}: TouchEvent): number {\n    return Math.hypot(\n        (touches[0]?.clientX ?? 0) - (touches[1]?.clientX ?? 0),\n        (touches[0]?.clientY ?? 0) - (touches[1]?.clientY ?? 0),\n    );\n}\n","import {type MonoTypeOperatorFunction, tap} from 'rxjs';\n\nexport function dfPreventDefault<T extends Event>(): MonoTypeOperatorFunction<T> {\n    return tap((event) => event.preventDefault());\n}\n\nexport function dfStopPropagation<T extends Event>(): MonoTypeOperatorFunction<T> {\n    return tap((event) => event.stopPropagation());\n}\n","/**\n * Adds 'px' to the number and turns it into a string\n */\nexport function dfPx(value: number): string {\n    return `${value}px`;\n}\n","import {InjectionToken} from '@angular/core';\n\nexport const DRAW_FLOW_ROOT_ELEMENT = new InjectionToken<HTMLElement>(\n    'DRAW_FLOW_ROOT_ELEMENT',\n);\n","import {Injectable, signal, type WritableSignal} from '@angular/core';\n\nimport {\n    type DfConnectorData,\n    type DfConnectorPosition,\n    type DfPoint,\n} from '../ng-draw-flow.interfaces';\n\n@Injectable()\nexport class CoordinatesService {\n    private readonly connectionPointsMap = new Map<\n        string,\n        WritableSignal<DfConnectorData | null>\n    >();\n\n    public getConnectionPointSignal(\n        connectorHash: string,\n    ): WritableSignal<DfConnectorData | null> {\n        return this.ensureConnectionPointSignal(connectorHash);\n    }\n\n    public addConnectionPoint(\n        connectorHash: string,\n        point: DfPoint,\n        position: DfConnectorPosition,\n    ): void {\n        this.ensureConnectionPointSignal(connectorHash).set({point, position});\n    }\n\n    public removeConnectionPoint(connectorHash: string): void {\n        const point = this.connectionPointsMap.get(connectorHash);\n\n        // A retained edge may still depend on an unresolved placeholder. Keep its\n        // identity until a real position can invalidate that dependency.\n        if (!point?.()) {\n            return;\n        }\n\n        point.set(null);\n        this.connectionPointsMap.delete(connectorHash);\n    }\n\n    private ensureConnectionPointSignal(\n        connectorHash: string,\n    ): WritableSignal<DfConnectorData | null> {\n        const pointSignal = this.connectionPointsMap.get(connectorHash);\n\n        if (pointSignal) {\n            return pointSignal;\n        }\n\n        const nextSignal = signal<DfConnectorData | null>(null);\n\n        this.connectionPointsMap.set(connectorHash, nextSignal);\n\n        return nextSignal;\n    }\n}\n","export interface DfPanZoomBounds {\n    readonly minX: number;\n    readonly minY: number;\n    readonly maxX: number;\n    readonly maxY: number;\n}\n\nexport interface DfPanZoomTrackedBounds extends DfPanZoomBounds {\n    readonly id: string;\n}\n\nexport class PanZoomBoundsTracker<T extends DfPanZoomBounds = DfPanZoomTrackedBounds> {\n    private readonly items = new Set<T>();\n    private bounds = {minX: Infinity, minY: Infinity, maxX: -Infinity, maxY: -Infinity};\n\n    private boundaryItems = {\n        minX: new Set<T>(),\n        minY: new Set<T>(),\n        maxX: new Set<T>(),\n        maxY: new Set<T>(),\n    };\n\n    public has(item: T): boolean {\n        return this.items.has(item);\n    }\n\n    public add(item: T): void {\n        this.items.add(item);\n\n        if (this.hasValidBounds(item)) {\n            this.updateBoundsIncremental(item);\n        }\n    }\n\n    public update(item: T, nextBounds: Partial<T>): void {\n        if (!this.items.has(item)) {\n            this.add(item);\n\n            return;\n        }\n\n        const previousBounds = {...item};\n\n        Object.assign(item, nextBounds);\n\n        if (!this.hasValidBounds(item)) {\n            this.removeFromBoundaryTracking(item, previousBounds);\n\n            if (this.needsRecalculation(previousBounds)) {\n                this.recalculateBounds();\n            }\n\n            return;\n        }\n\n        this.removeFromBoundaryTracking(item, previousBounds);\n\n        if (this.needsRecalculation(previousBounds)) {\n            this.recalculateBounds();\n        } else {\n            this.updateBoundsIncremental(item);\n        }\n    }\n\n    public remove(item: T): void {\n        if (!this.items.delete(item)) {\n            return;\n        }\n\n        const wasBoundaryItem = this.isOnBoundary(item);\n\n        this.removeFromBoundaryTracking(item);\n\n        if (wasBoundaryItem) {\n            this.recalculateBounds();\n        }\n    }\n\n    public clear(): void {\n        this.items.clear();\n        this.bounds = {minX: Infinity, minY: Infinity, maxX: -Infinity, maxY: -Infinity};\n        this.boundaryItems = {\n            minX: new Set<T>(),\n            minY: new Set<T>(),\n            maxX: new Set<T>(),\n            maxY: new Set<T>(),\n        };\n    }\n\n    public toJSON(): DfPanZoomBounds & {length: number} {\n        if (!this.items.size) {\n            return {length: 0, minX: 0, minY: 0, maxX: 0, maxY: 0};\n        }\n\n        if (this.bounds.minX === Infinity || this.bounds.maxX === -Infinity) {\n            return {\n                length: this.items.size,\n                minX: 0,\n                minY: 0,\n                maxX: 0,\n                maxY: 0,\n            };\n        }\n\n        return {\n            length: this.items.size,\n            ...this.bounds,\n        };\n    }\n\n    private updateBoundsIncremental(item: T): void {\n        if (!this.hasValidBounds(item)) {\n            return;\n        }\n\n        if (this.bounds.minX === Infinity || item.minX <= this.bounds.minX) {\n            if (item.minX < this.bounds.minX) {\n                this.boundaryItems.minX.clear();\n                this.bounds.minX = item.minX;\n            }\n\n            this.boundaryItems.minX.add(item);\n        }\n\n        if (this.bounds.minY === Infinity || item.minY <= this.bounds.minY) {\n            if (item.minY < this.bounds.minY) {\n                this.boundaryItems.minY.clear();\n                this.bounds.minY = item.minY;\n            }\n\n            this.boundaryItems.minY.add(item);\n        }\n\n        if (item.maxX >= this.bounds.maxX) {\n            if (item.maxX > this.bounds.maxX) {\n                this.boundaryItems.maxX.clear();\n                this.bounds.maxX = item.maxX;\n            }\n\n            this.boundaryItems.maxX.add(item);\n        }\n\n        if (item.maxY >= this.bounds.maxY) {\n            if (item.maxY > this.bounds.maxY) {\n                this.boundaryItems.maxY.clear();\n                this.bounds.maxY = item.maxY;\n            }\n\n            this.boundaryItems.maxY.add(item);\n        }\n    }\n\n    private recalculateBounds(): void {\n        this.bounds = {minX: Infinity, minY: Infinity, maxX: -Infinity, maxY: -Infinity};\n        this.boundaryItems = {\n            minX: new Set<T>(),\n            minY: new Set<T>(),\n            maxX: new Set<T>(),\n            maxY: new Set<T>(),\n        };\n\n        for (const item of this.items) {\n            this.updateBoundsIncremental(item);\n        }\n    }\n\n    private isOnBoundary(item: T): boolean {\n        return (\n            this.boundaryItems.minX.has(item) ||\n            this.boundaryItems.minY.has(item) ||\n            this.boundaryItems.maxX.has(item) ||\n            this.boundaryItems.maxY.has(item)\n        );\n    }\n\n    private removeFromBoundaryTracking(item: T, bounds: DfPanZoomBounds = item): void {\n        if (bounds.minX === this.bounds.minX) {\n            this.boundaryItems.minX.delete(item);\n        }\n\n        if (bounds.minY === this.bounds.minY) {\n            this.boundaryItems.minY.delete(item);\n        }\n\n        if (bounds.maxX === this.bounds.maxX) {\n            this.boundaryItems.maxX.delete(item);\n        }\n\n        if (bounds.maxY === this.bounds.maxY) {\n            this.boundaryItems.maxY.delete(item);\n        }\n    }\n\n    private needsRecalculation(previousBounds: DfPanZoomBounds): boolean {\n        return (\n            (previousBounds.minX === this.bounds.minX &&\n                this.boundaryItems.minX.size === 0) ||\n            (previousBounds.minY === this.bounds.minY &&\n                this.boundaryItems.minY.size === 0) ||\n            (previousBounds.maxX === this.bounds.maxX &&\n                this.boundaryItems.maxX.size === 0) ||\n            (previousBounds.maxY === this.bounds.maxY &&\n                this.boundaryItems.maxY.size === 0)\n        );\n    }\n\n    private hasValidBounds(item: T): boolean {\n        return (\n            Number.isFinite(item.minX) &&\n            Number.isFinite(item.minY) &&\n            Number.isFinite(item.maxX) &&\n            Number.isFinite(item.maxY)\n        );\n    }\n}\n","import {computed, Injectable, type Signal, signal} from '@angular/core';\n\nimport {type DfPoint} from '../../ng-draw-flow.interfaces';\nimport {\n    type DfPanZoomBounds,\n    type DfPanZoomTrackedBounds,\n    PanZoomBoundsTracker,\n} from './pan-zoom.bounds-tracker';\nimport {type DfPanzoomModel} from './pan-zoom.interfaces';\nimport {type DfPanSizeDimensions} from './pan-zoom.options';\n\nconst INITIAL_CAMERA: DfPanzoomModel = {\n    x: 0,\n    y: 0,\n    offsetX: 0,\n    offsetY: 0,\n    zoom: 1,\n};\n\nconst DEFAULT_WORKSPACE_GAP = 400;\n\nexport interface DfPanZoomUsableRect {\n    readonly minX: number;\n    readonly minY: number;\n    readonly maxX: number;\n    readonly maxY: number;\n}\n\nexport interface DfPanZoomWorkspaceRect extends DfPanZoomUsableRect {\n    readonly width: number;\n    readonly height: number;\n}\n\n@Injectable()\nexport class PanZoomService {\n    private readonly cameraSignal = signal<DfPanzoomModel>(INITIAL_CAMERA);\n    private readonly disabledSignal = signal<boolean>(false);\n    private readonly trackedNodesCountSignal = signal<number>(0);\n\n    private readonly usableRectSignal = signal<DfPanZoomUsableRect>({\n        minX: 0,\n        minY: 0,\n        maxX: 0,\n        maxY: 0,\n    });\n\n    private readonly boundsTracker = new PanZoomBoundsTracker();\n    private readonly nodeBounds = new Map<string, DfPanZoomTrackedBounds>();\n\n    private readonly legacyModelProxy = new Proxy({} as DfPanzoomModel, {\n        get: (_target, property): unknown => {\n            if (typeof property !== 'string') {\n                return undefined;\n            }\n\n            return this.cameraSignal()[property as keyof DfPanzoomModel];\n        },\n        set: (_target, property, value): boolean => {\n            if (typeof property !== 'string') {\n                return false;\n            }\n\n            this.patchCamera({[property]: value});\n\n            return true;\n        },\n        ownKeys: (): ArrayLike<string | symbol> => Reflect.ownKeys(this.cameraSignal()),\n        getOwnPropertyDescriptor: (_target, property) => {\n            if (typeof property !== 'string') {\n                return;\n            }\n\n            return {\n                enumerable: true,\n                configurable: true,\n                writable: true,\n                value: this.cameraSignal()[property as keyof DfPanzoomModel],\n            };\n        },\n    });\n\n    public readonly camera = this.cameraSignal.asReadonly();\n    public readonly disabled = this.disabledSignal.asReadonly();\n    public readonly usableRect = this.usableRectSignal.asReadonly();\n\n    public readonly workspaceRect = computed(() => {\n        const usableRect = this.usableRectSignal();\n\n        if (!this.trackedNodesCountSignal()) {\n            return toWorkspaceRect({\n                minX: -DEFAULT_WORKSPACE_GAP,\n                minY: -DEFAULT_WORKSPACE_GAP,\n                maxX: DEFAULT_WORKSPACE_GAP,\n                maxY: DEFAULT_WORKSPACE_GAP,\n            });\n        }\n\n        return toWorkspaceRect({\n            minX: usableRect.minX - DEFAULT_WORKSPACE_GAP,\n            minY: usableRect.minY - DEFAULT_WORKSPACE_GAP,\n            maxX: usableRect.maxX + DEFAULT_WORKSPACE_GAP,\n            maxY: usableRect.maxY + DEFAULT_WORKSPACE_GAP,\n        });\n    });\n\n    public readonly panSize: Signal<DfPanSizeDimensions> = computed(() => {\n        const workspaceRect = this.workspaceRect();\n\n        return {\n            width: workspaceRect.width,\n            height: workspaceRect.height,\n        };\n    });\n\n    public readonly workspaceOrigin: Signal<DfPoint> = computed(() => {\n        const workspaceRect = this.workspaceRect();\n\n        return {\n            x: -workspaceRect.minX,\n            y: -workspaceRect.minY,\n        };\n    });\n\n    public readonly workspaceCenter: Signal<DfPoint> = computed(() => {\n        const workspaceRect = this.workspaceRect();\n\n        return {\n            x: workspaceRect.minX + workspaceRect.width / 2,\n            y: workspaceRect.minY + workspaceRect.height / 2,\n        };\n    });\n\n    /** @deprecated Backward-compatible mutable camera access */\n    public get panzoomModel(): DfPanzoomModel {\n        return this.legacyModelProxy;\n    }\n\n    public set panzoomModel(model: DfPanzoomModel) {\n        this.setCamera(model);\n    }\n\n    /** @deprecated Backward-compatible mutable flag access */\n    public get panzoomDisabled(): boolean {\n        return this.disabledSignal();\n    }\n\n    public set panzoomDisabled(value: boolean) {\n        this.setDisabled(value);\n    }\n\n    public snapshot(): DfPanzoomModel {\n        return this.cameraSignal();\n    }\n\n    public setCamera(camera: DfPanzoomModel): void {\n        this.cameraSignal.set({...camera});\n    }\n\n    public patchCamera(camera: Partial<DfPanzoomModel>): void {\n        this.cameraSignal.update((current) => ({...current, ...camera}));\n    }\n\n    public setDisabled(value: boolean): void {\n        this.disabledSignal.set(value);\n    }\n\n    public isDisabled(): boolean {\n        return this.disabledSignal();\n    }\n\n    public upsertNodeBounds(id: string, bounds: DfPanZoomBounds): void {\n        const tracked = this.nodeBounds.get(id);\n\n        if (tracked) {\n            this.boundsTracker.update(tracked, bounds);\n        } else {\n            const item = {id, ...bounds};\n\n            this.nodeBounds.set(id, item);\n            this.boundsTracker.add(item);\n            this.trackedNodesCountSignal.set(this.nodeBounds.size);\n        }\n\n        this.syncUsableRect();\n    }\n\n    public removeNodeBounds(id: string): void {\n        const tracked = this.nodeBounds.get(id);\n\n        if (!tracked) {\n            return;\n        }\n\n        this.boundsTracker.remove(tracked);\n        this.nodeBounds.delete(id);\n        this.trackedNodesCountSignal.set(this.nodeBounds.size);\n        this.syncUsableRect();\n    }\n\n    public getBoundsForNodeIds(ids: readonly string[]): DfPanZoomUsableRect | null {\n        if (!ids.length) {\n            return null;\n        }\n\n        let minX = Number.POSITIVE_INFINITY;\n        let minY = Number.POSITIVE_INFINITY;\n        let maxX = Number.NEGATIVE_INFINITY;\n        let maxY = Number.NEGATIVE_INFINITY;\n\n        for (const id of ids) {\n            const bounds = this.nodeBounds.get(id);\n\n            if (!bounds) {\n                return null;\n            }\n\n            minX = Math.min(minX, bounds.minX);\n            minY = Math.min(minY, bounds.minY);\n            maxX = Math.max(maxX, bounds.maxX);\n            maxY = Math.max(maxY, bounds.maxY);\n        }\n\n        return {minX, minY, maxX, maxY};\n    }\n\n    private syncUsableRect(): void {\n        const rect = this.boundsTracker.toJSON();\n        const nextRect = {\n            minX: rect.minX,\n            minY: rect.minY,\n            maxX: rect.maxX,\n            maxY: rect.maxY,\n        };\n        const currentRect = this.usableRectSignal();\n\n        if (\n            currentRect.minX === nextRect.minX &&\n            currentRect.minY === nextRect.minY &&\n            currentRect.maxX === nextRect.maxX &&\n            currentRect.maxY === nextRect.maxY\n        ) {\n            return;\n        }\n\n        this.usableRectSignal.set(nextRect);\n    }\n}\n\nfunction toWorkspaceRect(bounds: DfPanZoomBounds): DfPanZoomWorkspaceRect {\n    return {\n        ...bounds,\n        width: bounds.maxX - bounds.minX,\n        height: bounds.maxY - bounds.minY,\n    };\n}\n","import {isConnectorType} from '../../../helpers';\nimport {type DfDataConnector} from '../../../ng-draw-flow.interfaces';\n\nexport function getConnectorDataset(element: HTMLElement): DfDataConnector | null {\n    const {nodeId, connectorId, connectorType, position} = element.dataset;\n    const isValidConnector =\n        nodeId && connectorId && connectorType && isConnectorType(connectorType);\n\n    return isValidConnector\n        ? {\n              nodeId,\n              connectorId,\n              connectorType,\n              position,\n          }\n        : null;\n}\n","import {DOCUMENT} from '@angular/common';\nimport {\n    effect,\n    inject,\n    Injectable,\n    type OnDestroy,\n    signal,\n    untracked,\n} from '@angular/core';\nimport {toObservable} from '@angular/core/rxjs-interop';\nimport {\n    animationFrameScheduler,\n    filter,\n    fromEvent,\n    map,\n    merge,\n    observeOn,\n    pairwise,\n    startWith,\n    Subject,\n    switchMap,\n    takeUntil,\n    tap,\n} from 'rxjs';\n\nimport {INITIAL_COORDINATES} from '../../../consts';\nimport {createConnectorHash, dfDistanceBetweenPoints} from '../../../helpers';\nimport {DRAW_FLOW_OPTIONS} from '../../../ng-draw-flow.configs';\nimport {\n    DfConnectionPoint,\n    type DfConnectorData,\n    DfConnectorPosition,\n    type DfDataConnection,\n    type DfDataConnector,\n    type DfOptions,\n} from '../../../ng-draw-flow.interfaces';\nimport {DRAW_FLOW_ROOT_ELEMENT} from '../../../ng-draw-flow.token';\nimport {CoordinatesService} from '../../../services/coordinates.service';\nimport {DfInteractionStateService} from '../../../services/interaction-state.service';\nimport {PanZoomService} from '../../pan-zoom/pan-zoom.service';\nimport {getConnectorDataset} from '../utils/get-coonector-dataset.util';\n\n@Injectable()\nexport class DraftConnectionService implements OnDestroy {\n    private readonly document = inject(DOCUMENT);\n    private readonly root = inject<HTMLElement>(DRAW_FLOW_ROOT_ELEMENT);\n    private readonly panZoomService = inject(PanZoomService);\n    private readonly coordinatesService = inject(CoordinatesService);\n    private readonly options = inject<DfOptions>(DRAW_FLOW_OPTIONS);\n    private readonly interactionState = inject(DfInteractionStateService, {\n        optional: true,\n    });\n\n    private readonly activeConnectorSignal = signal<DfDataConnector | null>(null);\n    private readonly lastConnectionCreatedSignal = signal<DfDataConnection | null>(null);\n    private sourceConnector!: DfDataConnector;\n    private readonly connectionCancelled$ = new Subject<void>();\n    private readonly connectionStart$ = new Subject<{\n        readonly connector: DfDataConnector;\n        readonly event?: PointerEvent;\n    }>();\n\n    protected readonly destroy$ = new Subject<void>();\n\n    public source = signal<DfConnectorData>({\n        point: INITIAL_COORDINATES,\n        position: DfConnectorPosition.Right,\n    });\n\n    public target = signal<DfConnectorData>({\n        point: INITIAL_COORDINATES,\n        position: DfConnectorPosition.Left,\n    });\n\n    public readonly isConnectionCreating = signal(false);\n    public readonly isConnectionCreating$ = toObservable(this.isConnectionCreating);\n    public readonly activeConnector = this.activeConnectorSignal.asReadonly();\n    public readonly lastConnectionCreated = this.lastConnectionCreatedSignal.asReadonly();\n\n    public readonly connectionCreated$ = new Subject<DfDataConnection>();\n    constructor() {\n        this.connectionSubscription();\n\n        this.interactionState?.connectionCreationCancellation$\n            .pipe(takeUntil(this.destroy$))\n            .subscribe(() => this.cancelConnection());\n\n        effect(() => {\n            if (!this.connectionsCreatable()) {\n                untracked(() => this.cancelConnection());\n            }\n        });\n    }\n\n    public ngOnDestroy(): void {\n        this.cancelConnection();\n        this.destroy$.next();\n        this.destroy$.complete();\n        this.connectionCancelled$.complete();\n        this.connectionStart$.complete();\n    }\n\n    public startConnection(connector: DfDataConnector, event?: PointerEvent): void {\n        if (this.isConnectionCreating()) {\n            return;\n        }\n\n        this.connectionStart$.next({connector, event});\n    }\n\n    private connectionSubscription(): void {\n        this.connectionStart$\n            .pipe(\n                filter(() => this.connectionsCreatable()),\n                tap(({connector}) => this.onDragStart(connector)),\n                switchMap(({event: startEvent}) =>\n                    fromEvent<PointerEvent>(this.document, 'pointermove').pipe(\n                        filter((event) => this.matchesPointer(event, startEvent)),\n                        startWith(...(startEvent ? [startEvent] : [])),\n                        observeOn(animationFrameScheduler),\n                        pairwise(),\n                        map(([previousEvent, currentEvent]) =>\n                            this.onDragMove(previousEvent, currentEvent),\n                        ),\n                        takeUntil(\n                            merge(\n                                this.connectionCancelled$,\n                                fromEvent<PointerEvent>(this.document, 'pointerup').pipe(\n                                    filter((event) =>\n                                        this.matchesPointer(event, startEvent),\n                                    ),\n                                    tap((event) => this.onDragEnd(event)),\n                                ),\n                                fromEvent<PointerEvent>(\n                                    this.document,\n                                    'pointercancel',\n                                ).pipe(\n                                    filter((event) =>\n                                        this.matchesPointer(event, startEvent),\n                                    ),\n                                    tap(() => this.cancelConnection()),\n                                ),\n                            ),\n                        ),\n                    ),\n                ),\n                takeUntil(this.destroy$),\n            )\n            .subscribe();\n    }\n\n    private onDragStart(connector: DfDataConnector): void {\n        if (!this.connectionsCreatable()) {\n            return;\n        }\n\n        this.sourceConnector = connector;\n        this.activeConnectorSignal.set(connector);\n        this.isConnectionCreating.set(true);\n        const sourceId = createConnectorHash(connector);\n        const sourcePoint = this.coordinatesService.getConnectionPointSignal(sourceId)();\n\n        if (!sourcePoint) {\n            return;\n        }\n\n        this.source.set(sourcePoint);\n        this.target.set({\n            ...sourcePoint,\n            position: this.getTargetPosition(this.source().position),\n        });\n    }\n\n    private onDragMove(previousEvent: PointerEvent, currentEvent: PointerEvent): void {\n        const {deltaX, deltaY} = dfDistanceBetweenPoints(previousEvent, currentEvent);\n        const {zoom} = this.panZoomService.snapshot();\n        const target = this.target();\n\n        this.target.set({\n            position: target.position,\n            point: {\n                x: target.point.x + deltaX / zoom,\n                y: target.point.y + deltaY / zoom,\n            },\n        });\n    }\n\n    private getTargetPosition(\n        startPosition: DfConnectorPosition | null,\n    ): DfConnectorPosition | null {\n        switch (startPosition) {\n            case DfConnectorPosition.Bottom:\n                return DfConnectorPosition.Top;\n            case DfConnectorPosition.Left:\n                return DfConnectorPosition.Right;\n            case DfConnectorPosition.Right:\n                return DfConnectorPosition.Left;\n            case DfConnectorPosition.Top:\n                return DfConnectorPosition.Bottom;\n            default:\n                return null;\n        }\n    }\n\n    private onDragEnd(event: PointerEvent): void {\n        const target =\n            event.target instanceof Element\n                ? event.target.closest<HTMLElement>('[data-connector-type]')\n                : null;\n        const targetConnector = target ? getConnectorDataset(target) : null;\n\n        if (\n            this.isConnectionCreating() &&\n            target &&\n            this.root.contains(target) &&\n            target.closest('ng-draw-flow') === this.root &&\n            !target.classList.contains('df-disabled') &&\n            !target.classList.contains('df-not-creatable') &&\n            targetConnector?.connectorType === DfConnectionPoint.Input &&\n            this.connectionsCreatable()\n        ) {\n            const connection: DfDataConnection = {\n                source: this.sourceConnector,\n                target: targetConnector,\n                label: this.sourceConnector.connectionLabel,\n            };\n\n            this.lastConnectionCreatedSignal.set(connection);\n            this.connectionCreated$.next(connection);\n        }\n\n        this.cancelConnection();\n    }\n\n    private matchesPointer(event: PointerEvent, startEvent?: PointerEvent): boolean {\n        return (\n            startEvent?.pointerId === undefined ||\n            event.pointerId === startEvent.pointerId\n        );\n    }\n\n    private cancelConnection(): void {\n        this.resetConnectors();\n        this.isConnectionCreating.set(false);\n        this.connectionCancelled$.next();\n    }\n\n    private connectionsCreatable(): boolean {\n        return (\n            this.interactionState?.connectionsCreatable() ??\n            this.options.options.connectionsCreatable\n        );\n    }\n\n    private resetConnectors(): void {\n        this.activeConnectorSignal.set(null);\n        this.source.set({\n            point: INITIAL_COORDINATES,\n            position: DfConnectorPosition.Right,\n        });\n        this.target.set({\n            point: INITIAL_COORDINATES,\n            position: null,\n        });\n    }\n}\n","import {\n    ChangeDetectionStrategy,\n    Component,\n    effect,\n    inject,\n    input,\n    output,\n} from '@angular/core';\nimport {PolymorpheusOutlet} from '@taiga-ui/polymorpheus';\n\nimport {\n    type DfConnectionLabel,\n    DfConnectionPoint,\n    DfConnectorPosition,\n    type DfDataConnectorConfig,\n    DfOutputMode,\n} from '../../ng-draw-flow.interfaces';\nimport {DF_CONNECTOR_ORDER_REGISTRY} from '../../services/connector-order-registry.service';\nimport {DraftConnectionService} from '../connections/draft-connection/draft-connection.service';\nimport {BaseConnector} from './base-connector';\n\n@Component({\n    standalone: true,\n    selector: 'df-output',\n    imports: [PolymorpheusOutlet],\n    template: `\n        @if (hasContent) {\n            <span class=\"df-connector-content\">\n                <ng-container\n                    *polymorpheusOutlet=\"content() as value; context: contentContext()\"\n                >\n                    {{ value }}\n                </ng-container>\n            </span>\n        }\n    `,\n    styleUrl: './connector.style.less',\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    host: {\n        '[attr.data-layout-order]': 'layoutOrder() ?? null',\n        '[class.df-action]': 'isAction',\n        '(click)': 'this.onActivate($event)',\n        '(pointerdown)': 'this.onDragStart($event)',\n    },\n})\nexport class DfOutputComponent extends BaseConnector {\n    private readonly draftConnectionService = inject(DraftConnectionService);\n    private readonly connectorOrderRegistry = inject(DF_CONNECTOR_ORDER_REGISTRY);\n    private connectionLabelOverride?: DfConnectionLabel;\n\n    protected override connectorType = DfConnectionPoint.Output;\n\n    public readonly dataInput = input.required<DfDataConnectorConfig>({\n        alias: 'connectorData',\n    });\n\n    public readonly positionInput = input(DfConnectorPosition.Right, {\n        alias: 'position',\n    });\n\n    public readonly connectionLabelInput = input<DfConnectionLabel | undefined>(\n        undefined,\n        {alias: 'connectionLabel'},\n    );\n\n    public readonly mode = input(DfOutputMode.Connection);\n    public readonly layoutOrder = input<number | undefined>();\n    public readonly activated = output<DfDataConnectorConfig>();\n\n    constructor() {\n        super();\n\n        const registry = this.connectorOrderRegistry;\n\n        if (!registry) {\n            return;\n        }\n\n        effect((onCleanup) => {\n            const {nodeId, connectorId} = this.dataInput();\n\n            registry.set(nodeId, connectorId, this.layoutOrder());\n            onCleanup(() => registry.remove(nodeId, connectorId));\n        });\n    }\n\n    public get data(): DfDataConnectorConfig {\n        return this.dataInput();\n    }\n\n    public override get position(): DfConnectorPosition {\n        return this.positionInput();\n    }\n\n    public get connectionLabel(): DfConnectionLabel | undefined {\n        return this.connectionLabelOverride ?? this.connectionLabelInput();\n    }\n\n    public get isAction(): boolean {\n        return this.mode() === DfOutputMode.Action;\n    }\n\n    public override get connectorVisible(): boolean {\n        return this.isAction || super.connectorVisible;\n    }\n\n    public setConnectionLabel(value: DfConnectionLabel | undefined): void {\n        this.connectionLabelOverride = value;\n    }\n\n    protected onDragStart(event: PointerEvent): void {\n        event.stopPropagation();\n\n        if (this.isAction || event.button !== 0) {\n            return;\n        }\n\n        const {nodeId, connectorId} = this.data;\n\n        if (!nodeId || !connectorId || this.disabled || !this.connectionsCreatable) {\n            return;\n        }\n\n        this.draftConnectionService.startConnection(\n            {\n                nodeId,\n                connectorId,\n                connectorType: DfConnectionPoint.Output,\n                position: this.position,\n                connectionLabel: this.connectionLabel,\n            },\n            event,\n        );\n    }\n\n    protected onActivate(event: Event): void {\n        if (!this.isAction) {\n            return;\n        }\n\n        event.preventDefault();\n        event.stopPropagation();\n\n        if (!this.disabled) {\n            this.activated.emit(this.data);\n        }\n    }\n}\n","import {type FactoryProvider, InjectionToken} from '@angular/core';\n\nexport type DfWheelBehavior = 'scroll' | 'zoom';\nexport type DfPanSize = DfPanSizeDimensions | number;\n\nexport interface DfPanSizeDimensions {\n    width: number;\n    height: number;\n}\n\nexport interface DfPanZoomBackgroundCanvasOptions {\n    visible: boolean;\n}\n\nexport interface DfPanZoomOptions {\n    /**\n     * @deprecated Dynamic workspace sizing ignores this option.\n     * Kept only for backward compatibility and will be removed in a future major version.\n     */\n    panSize: DfPanSize;\n    topPosition: number | null;\n    leftPosition: number | null;\n    minZoom: number;\n    maxZoom: number;\n    zoomStep: number;\n    zoomAnimationDuration: number;\n    zoomWheelSensitivity: number;\n    touchSensitivity: number;\n    wheelBehavior: DfWheelBehavior;\n    wheelSpeed: number;\n    wheelStep?: number;\n    pinchZoomSpeed: number;\n    backgroundCanvas: DfPanZoomBackgroundCanvasOptions;\n}\n\nexport const DF_PAN_ZOOM_DEFAULT_OPTIONS: DfPanZoomOptions = {\n    panSize: 2000,\n    topPosition: null,\n    leftPosition: null,\n    minZoom: 0.25,\n    maxZoom: 3,\n    zoomStep: 0.25,\n    zoomAnimationDuration: 300,\n    zoomWheelSensitivity: 0.01,\n    touchSensitivity: 0.01,\n    wheelBehavior: 'zoom',\n    wheelSpeed: 1,\n    wheelStep: 0.008,\n    pinchZoomSpeed: 1,\n    backgroundCanvas: {visible: true},\n};\n\nexport const DF_PAN_ZOOM_OPTIONS = new InjectionToken(\n    '[DF_PAN_ZOOM_OPTIONS]: [PAN_ZOOM_OPTIONS]',\n    {factory: () => DF_PAN_ZOOM_DEFAULT_OPTIONS},\n);\n\nexport function dfPanZoomOptionsProvider(\n    options: Partial<DfPanZoomOptions>,\n): FactoryProvider {\n    return {\n        provide: DF_PAN_ZOOM_OPTIONS,\n        useFactory: (): DfPanZoomOptions => ({\n            ...DF_PAN_ZOOM_DEFAULT_OPTIONS,\n            ...options,\n            backgroundCanvas: {\n                ...DF_PAN_ZOOM_DEFAULT_OPTIONS.backgroundCanvas,\n                ...options.backgroundCanvas,\n            },\n        }),\n    };\n}\n","const NODE_ID_KEYS = ['nodeIds', 'cycleNodes', 'isolatedNodes'] as const;\n\ntype ErrorRecord = Record<string, unknown>;\n\n/**\n * Extracts graph node ids from the error shapes supported by ng-draw-flow.\n *\n * Deliberately only inspects the error itself, its known id properties and the\n * compatibility `context` property. It must not walk Angular field trees or\n * arbitrary application objects attached to an error.\n */\nexport function collectInvalidNodeIds(errors: unknown): Set<string> {\n    const nodeIds = new Set<string>();\n\n    if (Array.isArray(errors)) {\n        errors.forEach((error) => collectError(error, nodeIds));\n    } else if (isRecord(errors)) {\n        if (isStructuredError(errors)) {\n            collectError(errors, nodeIds);\n        } else {\n            Object.values(errors).forEach((error) =>\n                collectLegacyErrorValue(error, nodeIds),\n            );\n        }\n    }\n\n    return nodeIds;\n}\n\nfunction collectError(error: unknown, nodeIds: Set<string>): void {\n    if (!isRecord(error)) {\n        return;\n    }\n\n    collectKnownIdProperties(error, nodeIds);\n\n    if (hasOwn(error, 'context')) {\n        collectCompatibilityContext(error.context, nodeIds);\n    }\n}\n\nfunction collectLegacyErrorValue(error: unknown, nodeIds: Set<string>): void {\n    if (isStringArray(error)) {\n        addIds(error, nodeIds);\n\n        return;\n    }\n\n    collectError(error, nodeIds);\n}\n\nfunction collectCompatibilityContext(context: unknown, nodeIds: Set<string>): void {\n    if (isStringArray(context)) {\n        addIds(context, nodeIds);\n\n        return;\n    }\n\n    if (isRecord(context)) {\n        collectKnownIdProperties(context, nodeIds);\n    }\n}\n\nfunction collectKnownIdProperties(error: ErrorRecord, nodeIds: Set<string>): void {\n    NODE_ID_KEYS.forEach((key) => {\n        const value = error[key];\n\n        if (isStringArray(value)) {\n            addIds(value, nodeIds);\n        }\n    });\n}\n\nfunction addIds(ids: readonly string[], nodeIds: Set<string>): void {\n    ids.forEach((id) => {\n        nodeIds.add(id);\n    });\n}\n\nfunction isStructuredError(error: ErrorRecord): boolean {\n    return typeof error.kind === 'string' || hasOwn(error, 'context');\n}\n\nfunction isRecord(value: unknown): value is ErrorRecord {\n    return typeof value === 'object' && value !== null;\n}\n\nfunction isStringArray(value: unknown): value is readonly string[] {\n    return Array.isArray(value) && value.every((item) => typeof item === 'string');\n}\n\nfunction hasOwn(value: ErrorRecord, key: string): boolean {\n    return Object.prototype.hasOwnProperty.call(value, key);\n}\n","import {InjectionToken, signal, type WritableSignal} from '@angular/core';\n\nexport const INVALID_NODES = new InjectionToken<WritableSignal<string[]>>(\n    '[INVALID_NODES]: Invalid nodes signal',\n    {factory: () => signal([])},\n);\n","import {DestroyRef, Directive, effect, inject, input, type OnInit} from '@angular/core';\nimport {takeUntilDestroyed} from '@angular/core/rxjs-interop';\nimport {AbstractControl, NgControl} from '@angular/forms';\nimport {merge} from 'rxjs';\n\nimport {collectInvalidNodeIds} from '../../helpers/collect-invalid-node-ids';\nimport {INVALID_NODES} from '../../validators/invalid-nodes.token';\n\nconst NO_ERRORS_INPUT = Symbol('NO_ERRORS_INPUT');\n\n@Directive({standalone: true, selector: '[dfErrors]'})\nexport class ErrorsDirective implements OnInit {\n    private readonly destroyRef = inject(DestroyRef);\n    private readonly ngControl = inject(NgControl, {optional: true, self: true});\n    private readonly $invalidNodes = inject(INVALID_NODES);\n\n    /**\n     * Graph validation errors supplied by a form binding. Signal Forms binds\n     * this state input automatically through the host directive exposure.\n     */\n    public readonly errors = input<unknown>(NO_ERRORS_INPUT);\n\n    constructor() {\n        effect(() => this.syncInvalidNodes());\n    }\n\n    public ngOnInit(): void {\n        const control = this.ngControl?.control;\n\n        if (!(control instanceof AbstractControl)) {\n            return;\n        }\n\n        merge(control.statusChanges, control.valueChanges)\n            .pipe(takeUntilDestroyed(this.destroyRef))\n            .subscribe(() => this.syncInvalidNodes());\n    }\n\n    private syncInvalidNodes(): void {\n        const inputErrors = this.errors();\n        const errors =\n            inputErrors === NO_ERRORS_INPUT\n                ? (this.ngControl?.control?.errors ?? null)\n                : inputErrors;\n\n        this.$invalidNodes.set(Array.from(collectInvalidNodeIds(errors)));\n    }\n}\n","import {dfClamp} from '../../helpers';\nimport {type DfPoint} from '../../ng-draw-flow.interfaces';\nimport {type DfPanzoomModel} from './pan-zoom.interfaces';\nimport {type DfPanSizeDimensions, type DfPanZoomOptions} from './pan-zoom.options';\n\nexport interface DfContainerOffsets {\n    readonly offsetX: number;\n    readonly offsetY: number;\n    readonly translateX: number;\n    readonly translateY: number;\n}\n\nexport interface DfPanZoomUsableRectBounds {\n    readonly minX: number;\n    readonly minY: number;\n    readonly maxX: number;\n    readonly maxY: number;\n}\n\nexport interface DfPanZoomWorldRectBounds {\n    readonly minX: number;\n    readonly minY: number;\n    readonly maxX: number;\n    readonly maxY: number;\n}\n\nexport function clampScale(scale: number, min: number, max: number): number {\n    return dfClamp(scale, min, max);\n}\n\nexport function moveBy(\n    camera: DfPanzoomModel,\n    deltaX: number,\n    deltaY: number,\n): DfPanzoomModel {\n    return {\n        ...camera,\n        x: camera.x + deltaX,\n        y: camera.y + deltaY,\n    };\n}\n\nexport function clampByPanSize(\n    camera: DfPanzoomModel,\n    panSize: Pick<DfPanSizeDimensions, 'height' | 'width'>,\n): DfPanzoomModel {\n    const maxOffsetX = camera.zoom * panSize.width;\n    const maxOffsetY = camera.zoom * panSize.height;\n\n    return {\n        ...camera,\n        x: dfClamp(camera.x, -maxOffsetX, maxOffsetX),\n        y: dfClamp(camera.y, -maxOffsetY, maxOffsetY),\n    };\n}\n\nexport function clampByUsableRect(\n    camera: DfPanzoomModel,\n    usableRect: DfPanZoomUsableRectBounds,\n    viewportSize: Pick<DOMRectReadOnly, 'height' | 'width'>,\n    zeroPoint: DfPoint,\n): DfPanzoomModel {\n    if (!viewportSize.width || !viewportSize.height || !camera.zoom) {\n        return camera;\n    }\n\n    const minCameraX = -usableRect.maxX * camera.zoom - zeroPoint.x;\n    const maxCameraX = -usableRect.minX * camera.zoom + viewportSize.width - zeroPoint.x;\n    const minCameraY = -usableRect.maxY * camera.zoom - zeroPoint.y;\n    const maxCameraY = -usableRect.minY * camera.zoom + viewportSize.height - zeroPoint.y;\n\n    return {\n        ...camera,\n        x: dfClamp(\n            camera.x,\n            Math.min(minCameraX, maxCameraX),\n            Math.max(minCameraX, maxCameraX),\n        ),\n        y: dfClamp(\n            camera.y,\n            Math.min(minCameraY, maxCameraY),\n            Math.max(minCameraY, maxCameraY),\n        ),\n    };\n}\n\nexport function zoomAtPoint(\n    camera: DfPanzoomModel,\n    point: DfPoint,\n    targetScale: number,\n    options: Pick<DfPanZoomOptions, 'maxZoom' | 'minZoom'>,\n): DfPanzoomModel {\n    const zoom = clampScale(targetScale, options.minZoom, options.maxZoom);\n\n    const dx = (point.x - camera.x) / camera.zoom;\n    const dy = (point.y - camera.y) / camera.zoom;\n    const dxNext = (point.x - camera.x) / zoom;\n    const dyNext = (point.y - camera.y) / zoom;\n\n    return {\n        ...camera,\n        x: camera.x + (dxNext - dx) * zoom,\n        y: camera.y + (dyNext - dy) * zoom,\n        zoom,\n    };\n}\n\nexport function getViewportZeroPoint(\n    rootSize: Pick<DOMRectReadOnly, 'height' | 'width'>,\n    options: Pick<DfPanZoomOptions, 'leftPosition' | 'topPosition'>,\n): DfPoint {\n    return {\n        x: options.leftPosition ?? rootSize.width / 2,\n        y: options.topPosition ?? rootSize.height / 2,\n    };\n}\n\nexport function getContainerOffsets(\n    rootSize: Pick<DOMRectReadOnly, 'height' | 'width'>,\n    options: Pick<DfPanZoomOptions, 'leftPosition' | 'topPosition'>,\n): DfContainerOffsets {\n    const zeroPoint = getViewportZeroPoint(rootSize, options);\n    const translateX = zeroPoint.x - rootSize.width / 2;\n    const translateY = zeroPoint.y - rootSize.height / 2;\n\n    return {\n        offsetX: -translateX,\n        offsetY: -translateY,\n        translateX,\n        translateY,\n    };\n}\n\nexport function getViewportCenter(\n    camera: Pick<DfPanzoomModel, 'x' | 'y' | 'zoom'>,\n    panSize: Pick<DfPanSizeDimensions, 'height' | 'width'>,\n): DfPoint {\n    const halfOfPanWidth = panSize.width / 2;\n    const halfOfPanHeight = panSize.height / 2;\n\n    return {\n        x: halfOfPanWidth + (camera.x * -1) / camera.zoom - halfOfPanWidth,\n        y: halfOfPanHeight + (camera.y * -1) / camera.zoom - halfOfPanHeight,\n    };\n}\n\nexport function alignCameraToWorldRect(\n    camera: DfPanzoomModel,\n    targetRect: Pick<DfPanZoomWorldRectBounds, 'minX' | 'minY'>,\n    viewportSize: Pick<DOMRectReadOnly, 'height' | 'width'>,\n    options: Pick<DfPanZoomOptions, 'leftPosition' | 'topPosition'>,\n): DfPanzoomModel {\n    const zeroPoint = getViewportZeroPoint(viewportSize, options);\n\n    return {\n        ...camera,\n        x:\n            options.leftPosition === null\n                ? camera.x\n                : options.leftPosition - zeroPoint.x - targetRect.minX * camera.zoom,\n        y:\n            options.topPosition === null\n                ? camera.y\n                : options.topPosition - zeroPoint.y - targetRect.minY * camera.zoom,\n    };\n}\n","export enum DfDragDropStage {\n    Start = 'start',\n    Move = 'move',\n    End = 'end',\n}\n","import {DOCUMENT} from '@angular/common';\nimport {inject, Injectable} from '@angular/core';\nimport {\n    animationFrameScheduler,\n    filter,\n    fromEvent,\n    map,\n    merge,\n    type Observable,\n    repeat,\n    share,\n    shareReplay,\n    switchMap,\n    take,\n    takeUntil,\n    throttleTime,\n} from 'rxjs';\n\nimport {DfDragDropStage} from './drag-drop.enum';\nimport {type DfDragDrop} from './drag-drop.interface';\n\n/**\n * Centralised RxJS-based drag-and-drop stream factory.\n * Creates **one** `pointermove / pointerup` listener on `document`\n * and produces per-element drag streams filtered by `pointerId`.\n */\n@Injectable({providedIn: 'root'})\nexport class DragDropService {\n    private readonly document = inject(DOCUMENT);\n\n    /** Cache for element-scoped `pointerdown` observables (lazy–created). */\n    private readonly pointerDownMap = new WeakMap<\n        HTMLElement,\n        Observable<PointerEvent>\n    >();\n\n    /** Cache for ready-made drag-stream observables (so we never duplicate work). */\n    private readonly dragDropStreams = new WeakMap<HTMLElement, Observable<DfDragDrop>>();\n\n    /** Shared `pointermove` stream on the whole document (ref-counted). */\n    private readonly pointerMove$ = fromEvent<PointerEvent>(\n        this.document,\n        'pointermove',\n    ).pipe(share());\n\n    /** Shared `pointerup` stream on the whole document (ref-counted). */\n    private readonly pointerUp$ = merge(\n        fromEvent<PointerEvent>(this.document, 'pointerup'),\n        fromEvent<PointerEvent>(this.document, 'pointercancel'),\n    ).pipe(share());\n\n    /**\n     * Returns (and caches) a drag-and-drop observable for the provided element.\n     * The observable emits:\n     *   • `DfDragDropStage.Move` every animation frame while the pointer is down;\n     *   • a final `DfDragDropStage.End` when the pointer is released.\n     */\n    public streamFor(el: HTMLElement): Observable<DfDragDrop> {\n        const cached = this.dragDropStreams.get(el);\n\n        if (cached) {\n            return cached;\n        }\n\n        const pointerDown$ =\n            this.pointerDownMap.get(el) ??\n            fromEvent<PointerEvent>(el, 'pointerdown', {passive: true}).pipe(share());\n\n        this.pointerDownMap.set(el, pointerDown$);\n\n        const drag$ = pointerDown$.pipe(\n            switchMap((startEvent: PointerEvent): Observable<DfDragDrop> => {\n                const id = startEvent.pointerId;\n                let lastPointerEvent = startEvent;\n\n                const pointerUpStream$ = this.pointerUp$.pipe(\n                    filter((e) => e.pointerId === id),\n                    take(1),\n                    map((): DfDragDrop => ({\n                        stage: DfDragDropStage.End,\n                        sourceElement: el,\n                        distance: {deltaX: 0, deltaY: 0},\n                    })),\n                    shareReplay({bufferSize: 1, refCount: true}),\n                );\n\n                const pointerMoveStream$ = this.pointerMove$.pipe(\n                    filter((e) => e.pointerId === id),\n                    throttleTime(16, animationFrameScheduler, {\n                        leading: true,\n                        trailing: true,\n                    }),\n                    map((e) => {\n                        const dx = e.clientX - lastPointerEvent.clientX;\n                        const dy = e.clientY - lastPointerEvent.clientY;\n\n                        lastPointerEvent = e;\n\n                        return {\n                            stage: DfDragDropStage.Move,\n                            sourceElement: el,\n                            distance: {deltaX: dx, deltaY: dy},\n                        };\n                    }),\n                    takeUntil(pointerUpStream$),\n                );\n\n                return merge(pointerMoveStream$, pointerUpStream$);\n            }),\n            repeat(),\n            share(),\n        );\n\n        this.dragDropStreams.set(el, drag$);\n\n        return drag$;\n    }\n}\n","import {Directive, ElementRef, inject} from '@angular/core';\nimport {outputFromObservable} from '@angular/core/rxjs-interop';\nimport {EMPTY, startWith, switchMap} from 'rxjs';\n\nimport {DfInteractionStateService} from '../../services/interaction-state.service';\nimport {DragDropService} from './drag-drop.service';\n\n@Directive({\n    standalone: true,\n    selector: '[dfDragDrop]',\n})\nexport class DragDropDirective {\n    private readonly interactionState = inject(DfInteractionStateService, {\n        optional: true,\n    });\n\n    private readonly dragDropService = inject(DragDropService);\n\n    protected readonly elementRef: ElementRef<HTMLElement> = inject(ElementRef);\n    protected readonly dfDragDrop = outputFromObservable(\n        (this.interactionState?.nodeDragCancellation$ ?? EMPTY).pipe(\n            startWith(undefined),\n            switchMap(() =>\n                this.dragDropService.streamFor(this.elementRef.nativeElement),\n            ),\n        ),\n        {alias: 'dfDragDrop'},\n    );\n}\n","export const DF_PAN_ZOOM_INITIAL_SCALE = 1;\n","import {computed, DestroyRef, inject, Injectable, signal} from '@angular/core';\nimport {takeUntilDestroyed} from '@angular/core/rxjs-interop';\nimport {animationFrameScheduler, Subject, type Subscription, take, timer} from 'rxjs';\n\nimport {INITIAL_COORDINATES} from '../../consts';\nimport {type DfDragDrop, DfDragDropStage} from '../../directives/drag-drop';\nimport {type DfPoint} from '../../ng-draw-flow.interfaces';\nimport {\n    clampByUsableRect,\n    clampScale,\n    getContainerOffsets,\n    getViewportZeroPoint,\n    moveBy,\n    zoomAtPoint,\n} from './pan-zoom.camera.math';\nimport {DF_PAN_ZOOM_INITIAL_SCALE} from './pan-zoom.const';\nimport {type DfPanzoomModel} from './pan-zoom.interfaces';\nimport {DF_PAN_ZOOM_OPTIONS, type DfPanZoomOptions} from './pan-zoom.options';\nimport {PanZoomService} from './pan-zoom.service';\n\nexport type DfPanZoomRenderMode = 'async' | 'sync';\n\nexport interface DfPanZoomViewportPanGesture {\n    readonly type: 'pan';\n    readonly deltaX: number;\n    readonly deltaY: number;\n}\n\nexport interface DfPanZoomViewportZoomGesture {\n    readonly type: 'zoom';\n    readonly point: DfPoint;\n    readonly deltaScale: number;\n}\n\nexport type DfPanZoomViewportGesture =\n    DfPanZoomViewportPanGesture | DfPanZoomViewportZoomGesture;\n\n@Injectable()\nexport class PanZoomControllerService {\n    private readonly destroyRef = inject(DestroyRef);\n    private readonly panZoomService = inject(PanZoomService);\n    private readonly panZoomOptions = inject<DfPanZoomOptions>(DF_PAN_ZOOM_OPTIONS);\n    private readonly draggingSignal = signal<boolean>(false);\n    private readonly transitionedSignal = signal<boolean>(true);\n\n    private readonly viewportSizeSignal = signal<{width: number; height: number}>({\n        width: 0,\n        height: 0,\n    });\n\n    private readonly viewportZeroPointSignal = signal<DfPoint>(INITIAL_COORDINATES);\n    private readonly layoutOffsetSignal = signal<DfPoint>(INITIAL_COORDINATES);\n    private readonly renderRequestsSubject = new Subject<DfPanZoomRenderMode>();\n    private readonly scaleChangesSubject = new Subject<number>();\n    private readonly pendingGestures: DfPanZoomViewportGesture[] = [];\n    private emittedZoom = Number.NaN;\n    private gestureFlushSubscription: Subscription | null = null;\n    public readonly dragging = this.draggingSignal.asReadonly();\n    public readonly transitioned = this.transitionedSignal.asReadonly();\n    public readonly viewportSize = this.viewportSizeSignal.asReadonly();\n    public readonly viewportZeroPoint = this.viewportZeroPointSignal.asReadonly();\n    public readonly layoutOffset = this.layoutOffsetSignal.asReadonly();\n    public readonly renderRequests$ = this.renderRequestsSubject.asObservable();\n    public readonly scaleChanges$ = this.scaleChangesSubject.asObservable();\n\n    public readonly cursor = computed(() =>\n        this.draggingSignal() ? 'grabbing' : 'initial',\n    );\n\n    public readonly panTransform = computed(() => {\n        const {x, y, zoom} = this.panZoomService.camera();\n        const {x: zeroPointX, y: zeroPointY} = this.viewportZeroPointSignal();\n        const translateX = x + zeroPointX;\n        const translateY = y + zeroPointY;\n\n        return `translate3d(${translateX}px, ${translateY}px, 0) scale(${zoom})`;\n    });\n\n    public readonly transitionDuration = computed(() =>\n        this.transitionedSignal()\n            ? `${this.panZoomOptions.zoomAnimationDuration}ms`\n            : '0s',\n    );\n\n    constructor() {\n        this.destroyRef.onDestroy(() => {\n            this.gestureFlushSubscription?.unsubscribe();\n            this.gestureFlushSubscription = null;\n            this.pendingGestures.length = 0;\n        });\n    }\n\n    public resetPanzoom(): void {\n        this.setPosition({\n            ...INITIAL_COORDINATES,\n            zoom: DF_PAN_ZOOM_INITIAL_SCALE,\n        });\n    }\n\n    public setPosition(position?: Partial<DfPoint> & {zoom?: number}): void {\n        const camera = this.panZoomService.snapshot();\n        const nextCamera = {\n            ...camera,\n            ...position,\n            zoom: position?.zoom || camera.zoom,\n        };\n\n        this.panZoomService.setCamera(nextCamera);\n\n        if (position?.zoom) {\n            this.emitScale(nextCamera.zoom);\n        }\n\n        this.requestRender();\n    }\n\n    public setScale(scale: number): void {\n        const clampedScale = clampScale(\n            scale,\n            this.panZoomOptions.minZoom,\n            this.panZoomOptions.maxZoom,\n        );\n\n        this.setZoom(clampedScale);\n    }\n\n    public zoomIn(): void {\n        const {zoomStep, maxZoom} = this.panZoomOptions;\n        const zoom = this.panZoomService.snapshot().zoom + zoomStep;\n\n        this.setZoom(zoom <= maxZoom ? zoom : maxZoom);\n    }\n\n    public zoomOut(): void {\n        const {zoomStep, minZoom} = this.panZoomOptions;\n        const zoom = this.panZoomService.snapshot().zoom - zoomStep;\n\n        this.setZoom(zoom >= minZoom ? zoom : minZoom);\n    }\n\n    public handlePan({distance, stage}: DfDragDrop): void {\n        if (stage === DfDragDropStage.Move) {\n            if (this.panZoomService.isDisabled()) {\n                return;\n            }\n\n            this.draggingSignal.set(true);\n            this.transitionedSignal.set(false);\n            this.panZoomService.setCamera(\n                this.clampCamera(\n                    moveBy(\n                        this.panZoomService.snapshot(),\n                        distance.deltaX,\n                        distance.deltaY,\n                    ),\n                ),\n            );\n\n            this.renderNow();\n\n            return;\n        }\n\n        this.draggingSignal.set(false);\n        this.transitionedSignal.set(true);\n        this.requestRender();\n    }\n\n    public syncContainerOffsets(rootSize: {width: number; height: number}): void {\n        if (!rootSize.width || !rootSize.height) {\n            return;\n        }\n\n        this.viewportSizeSignal.set(rootSize);\n        this.viewportZeroPointSignal.set(\n            getViewportZeroPoint(rootSize, {\n                leftPosition: this.panZoomOptions.leftPosition,\n                topPosition: this.panZoomOptions.topPosition,\n            }),\n        );\n\n        const offsets = getContainerOffsets(rootSize, {\n            leftPosition: this.panZoomOptions.leftPosition,\n            topPosition: this.panZoomOptions.topPosition,\n        });\n\n        this.panZoomService.patchCamera({\n            offsetX: offsets.offsetX,\n            offsetY: offsets.offsetY,\n        });\n        this.layoutOffsetSignal.set({\n            x: offsets.translateX,\n            y: offsets.translateY,\n        });\n        this.requestRender();\n    }\n\n    public queueGesture(gesture: DfPanZoomViewportGesture): void {\n        if (gesture.type === 'pan' && this.panZoomService.isDisabled()) {\n            return;\n        }\n\n        this.transitionedSignal.set(false);\n        this.pendingGestures.push(gesture);\n        this.scheduleGestureFlush();\n    }\n\n    public flushGestures(): void {\n        this.gestureFlushSubscription?.unsubscribe();\n        this.gestureFlushSubscription = null;\n\n        if (!this.pendingGestures.length) {\n            return;\n        }\n\n        const queue = this.pendingGestures.splice(0);\n        const camera = this.panZoomService.snapshot();\n        let nextCamera = camera;\n        let zoomChanged = false;\n\n        for (const gesture of queue) {\n            if (gesture.type === 'pan') {\n                nextCamera = this.clampCamera(\n                    moveBy(nextCamera, gesture.deltaX, gesture.deltaY),\n                );\n                continue;\n            }\n\n            if (!gesture.deltaScale) {\n                continue;\n            }\n\n            const previousZoom = nextCamera.zoom;\n\n            nextCamera = this.clampCamera(\n                zoomAtPoint(\n                    nextCamera,\n                    gesture.point,\n                    nextCamera.zoom + gesture.deltaScale,\n                    this.panZoomOptions,\n                ),\n            );\n\n            if (nextCamera.zoom !== previousZoom) {\n                zoomChanged = true;\n            }\n        }\n\n        if (\n            nextCamera.x !== camera.x ||\n            nextCamera.y !== camera.y ||\n            nextCamera.zoom !== camera.zoom\n        ) {\n            this.panZoomService.setCamera(nextCamera);\n        }\n\n        if (zoomChanged) {\n            this.emitScale(nextCamera.zoom);\n        }\n\n        this.renderNow();\n    }\n\n    private scheduleGestureFlush(): void {\n        if (this.gestureFlushSubscription) {\n            return;\n        }\n\n        this.gestureFlushSubscription = animationFrameScheduler.schedule(() =>\n            this.flushGestures(),\n        );\n    }\n\n    private setZoom(zoom: number): void {\n        const camera = this.panZoomService.snapshot();\n\n        this.transitionedSignal.set(true);\n        const nextCamera = this.clampCamera({...camera, zoom});\n\n        this.panZoomService.setCamera(nextCamera);\n        this.emitScale(nextCamera.zoom);\n        this.requestRender();\n\n        timer(this.panZoomOptions.zoomAnimationDuration)\n            .pipe(take(1), takeUntilDestroyed(this.destroyRef))\n            .subscribe(() => {\n                this.transitionedSignal.set(false);\n                this.requestRender();\n            });\n    }\n\n    private emitScale(zoom: number): void {\n        if (zoom === this.emittedZoom) {\n            return;\n        }\n\n        this.scaleChangesSubject.next(Math.round(zoom * 100));\n        this.emittedZoom = zoom;\n    }\n\n    private requestRender(): void {\n        this.renderRequestsSubject.next('async');\n    }\n\n    private renderNow(): void {\n        this.renderRequestsSubject.next('sync');\n    }\n\n    private clampCamera(camera: DfPanzoomModel): DfPanzoomModel {\n        const viewportSize = this.viewportSizeSignal();\n\n        if (!viewportSize.width || !viewportSize.height) {\n            return camera;\n        }\n\n        const zeroPoint = getViewportZeroPoint(viewportSize, {\n            leftPosition: this.panZoomOptions.leftPosition,\n            topPosition: this.panZoomOptions.topPosition,\n        });\n\n        return clampByUsableRect(\n            camera,\n            this.panZoomService.usableRect(),\n            viewportSize,\n            zeroPoint,\n        );\n    }\n}\n","import {isPlatformBrowser} from '@angular/common';\nimport {\n    type AfterViewInit,\n    ChangeDetectionStrategy,\n    Component,\n    DestroyRef,\n    effect,\n    ElementRef,\n    inject,\n    PLATFORM_ID,\n    viewChild,\n} from '@angular/core';\nimport {takeUntilDestroyed} from '@angular/core/rxjs-interop';\nimport {animationFrameScheduler, type Subscription} from 'rxjs';\n\nimport {DRAW_FLOW_ROOT_ELEMENT} from '../../ng-draw-flow.token';\nimport {PanZoomControllerService} from './pan-zoom.controller.service';\nimport {PanZoomService} from './pan-zoom.service';\n\nconst GRID_SIZE = 20;\nconst GRID_PATTERN_REPEAT = 5;\nconst GRID_DOT_SIZE = 2;\nconst GRID_MAJOR_DOT_SIZE = GRID_DOT_SIZE * 2;\nconst GRID_MAJOR_SIMPLE_DOT_SIZE = GRID_DOT_SIZE * 3;\nconst GRID_VISIBILITY_THRESHOLD = 0.125;\nconst GRID_PATTERN_SWITCH_SCALE = 0.7;\n\ninterface DfPanZoomBackgroundPalette {\n    readonly borderColor: string;\n    readonly gridColor: string;\n    readonly viewportBackground: string;\n    readonly workspaceBackground: string;\n}\n\ninterface DfPanZoomBackgroundPatterns {\n    readonly gridColor: string;\n    readonly normal: CanvasPattern | null;\n    readonly simple: CanvasPattern | null;\n}\n\n@Component({\n    standalone: true,\n    selector: 'df-pan-zoom-background-canvas',\n    template: `\n        <canvas\n            #backgroundCanvas\n            aria-hidden=\"true\"\n            class=\"pan-zoom-background__canvas\"\n        ></canvas>\n    `,\n    styleUrl: './pan-zoom-background-canvas.component.less',\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PanZoomBackgroundCanvasComponent implements AfterViewInit {\n    private readonly backgroundCanvasRef =\n        viewChild<ElementRef<HTMLCanvasElement>>('backgroundCanvas');\n\n    private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n    private readonly destroyRef = inject(DestroyRef);\n    private readonly drawFlowElement = inject<HTMLElement>(DRAW_FLOW_ROOT_ELEMENT);\n    private readonly platformId = inject(PLATFORM_ID);\n    private readonly panZoomService = inject(PanZoomService);\n    private readonly panZoomController = inject(PanZoomControllerService);\n    private scheduledRender?: Subscription;\n    private backgroundCanvas: HTMLCanvasElement | null = null;\n    private backgroundContext: CanvasRenderingContext2D | null = null;\n    private backgroundPatterns: DfPanZoomBackgroundPatterns | null = null;\n\n    constructor() {\n        this.destroyRef.onDestroy(() => this.scheduledRender?.unsubscribe());\n        this.watchRenderRequests();\n\n        effect(() => {\n            this.panZoomService.camera();\n            this.panZoomService.workspaceRect();\n            this.panZoomController.viewportZeroPoint();\n\n            if (!this.backgroundCanvas) {\n                return;\n            }\n\n            this.requestDraw();\n        });\n    }\n\n    public ngAfterViewInit(): void {\n        if (!isPlatformBrowser(this.platformId)) {\n            return;\n        }\n\n        this.backgroundCanvas = this.backgroundCanvasRef()?.nativeElement ?? null;\n        this.drawNow();\n    }\n\n    private watchRenderRequests(): void {\n        if (!isPlatformBrowser(this.platformId)) {\n            return;\n        }\n\n        this.panZoomController.renderRequests$\n            .pipe(takeUntilDestroyed(this.destroyRef))\n            .subscribe((mode) => {\n                if (mode === 'sync') {\n                    this.drawNow();\n                } else {\n                    this.requestDraw();\n                }\n            });\n    }\n\n    private requestDraw(): void {\n        if (this.scheduledRender && !this.scheduledRender.closed) {\n            return;\n        }\n\n        this.scheduledRender = animationFrameScheduler.schedule(() => {\n            this.scheduledRender = undefined;\n            this.drawBackground();\n        });\n    }\n\n    private drawNow(): void {\n        this.scheduledRender?.unsubscribe();\n        this.scheduledRender = undefined;\n        this.drawBackground();\n    }\n\n    private drawBackground(): void {\n        const canvas = this.backgroundCanvas ?? this.backgroundCanvasRef()?.nativeElement;\n        const context = this.getBackgroundContext(canvas);\n        const {width, height} = this.getViewportSize();\n\n        if (!canvas || !context || !width || !height) {\n            return;\n        }\n\n        const dpr = typeof window === 'undefined' ? 1 : window.devicePixelRatio || 1;\n        const pixelWidth = Math.round(width * dpr);\n        const pixelHeight = Math.round(height * dpr);\n\n        if (canvas.width !== pixelWidth || canvas.height !== pixelHeight) {\n            canvas.width = pixelWidth;\n            canvas.height = pixelHeight;\n            this.backgroundContext = canvas.getContext('2d');\n        }\n\n        const ctx = this.backgroundContext;\n\n        if (!ctx) {\n            return;\n        }\n\n        const palette = this.readBackgroundPalette();\n        const camera = this.panZoomService.snapshot();\n        const workspaceRect = this.panZoomService.workspaceRect();\n        const zeroPoint = this.panZoomController.viewportZeroPoint();\n        const workspaceScreenX =\n            camera.x + zeroPoint.x + workspaceRect.minX * camera.zoom;\n        const workspaceScreenY =\n            camera.y + zeroPoint.y + workspaceRect.minY * camera.zoom;\n        const workspaceScreenWidth = workspaceRect.width * camera.zoom;\n        const workspaceScreenHeight = workspaceRect.height * camera.zoom;\n\n        this.ensureBackgroundPatterns(ctx, palette.gridColor);\n\n        ctx.setTransform(1, 0, 0, 1, 0, 0);\n        ctx.clearRect(0, 0, canvas.width, canvas.height);\n        ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n\n        ctx.fillStyle = palette.viewportBackground;\n        ctx.fillRect(0, 0, width, height);\n\n        if (!workspaceScreenWidth || !workspaceScreenHeight) {\n            return;\n        }\n\n        ctx.fillStyle = palette.workspaceBackground;\n        ctx.fillRect(\n            workspaceScreenX,\n            workspaceScreenY,\n            workspaceScreenWidth,\n            workspaceScreenHeight,\n        );\n\n        ctx.strokeStyle = palette.borderColor;\n        ctx.lineWidth = 1;\n        ctx.strokeRect(\n            workspaceScreenX,\n            workspaceScreenY,\n            workspaceScreenWidth,\n            workspaceScreenHeight,\n        );\n\n        const pattern =\n            camera.zoom > GRID_PATTERN_SWITCH_SCALE\n                ? this.backgroundPatterns?.normal\n                : this.backgroundPatterns?.simple;\n\n        if (!pattern || camera.zoom < GRID_VISIBILITY_THRESHOLD) {\n            return;\n        }\n\n        ctx.save();\n        ctx.beginPath();\n        ctx.rect(\n            workspaceScreenX,\n            workspaceScreenY,\n            workspaceScreenWidth,\n            workspaceScreenHeight,\n        );\n        ctx.clip();\n        ctx.translate(camera.x + zeroPoint.x, camera.y + zeroPoint.y);\n        ctx.scale(camera.zoom, camera.zoom);\n        ctx.fillStyle = pattern;\n        ctx.fillRect(\n            workspaceRect.minX,\n            workspaceRect.minY,\n            workspaceRect.width,\n            workspaceRect.height,\n        );\n        ctx.restore();\n    }\n\n    private getBackgroundContext(\n        canvas?: HTMLCanvasElement | null,\n    ): CanvasRenderingContext2D | null {\n        if (this.backgroundContext) {\n            return this.backgroundContext;\n        }\n\n        if (!canvas) {\n            return null;\n        }\n\n        this.backgroundContext = canvas.getContext('2d');\n\n        return this.backgroundContext;\n    }\n\n    private getViewportSize(): {height: number; width: number} {\n        return {\n            width:\n                this.drawFlowElement.offsetWidth || this.host.nativeElement.clientWidth,\n            height:\n                this.drawFlowElement.offsetHeight || this.host.nativeElement.clientHeight,\n        };\n    }\n\n    private readBackgroundPalette(): DfPanZoomBackgroundPalette {\n        const styles = getComputedStyle(this.drawFlowElement);\n\n        return {\n            viewportBackground:\n                styles.getPropertyValue('--df-pan-zoom-viewport-background').trim() ||\n                '#eaeaea',\n            workspaceBackground:\n                styles.getPropertyValue('--df-pan-zoom-workspace-background').trim() ||\n                '#f9f9f9',\n            gridColor:\n                styles.getPropertyValue('--df-pan-zoom-grid-color').trim() || '#d0d2ce',\n            borderColor:\n                styles.getPropertyValue('--df-pan-zoom-border-color').trim() || '#eaeaea',\n        };\n    }\n\n    private ensureBackgroundPatterns(\n        ctx: CanvasRenderingContext2D,\n        gridColor: string,\n    ): void {\n        if (this.backgroundPatterns?.gridColor === gridColor) {\n            return;\n        }\n\n        this.backgroundPatterns = {\n            gridColor,\n            normal: this.createGridPattern(ctx, gridColor, false),\n            simple: this.createGridPattern(ctx, gridColor, true),\n        };\n    }\n\n    private createGridPattern(\n        ctx: CanvasRenderingContext2D,\n        color: string,\n        simple: boolean,\n    ): CanvasPattern | null {\n        const patternCanvas = document.createElement('canvas');\n        const patternContext = patternCanvas.getContext('2d');\n\n        if (!patternContext) {\n            return null;\n        }\n\n        const patternSize = GRID_PATTERN_REPEAT * GRID_SIZE;\n        const majorDotSize = simple ? GRID_MAJOR_SIMPLE_DOT_SIZE : GRID_MAJOR_DOT_SIZE;\n\n        patternCanvas.width = patternSize;\n        patternCanvas.height = patternSize;\n        patternContext.clearRect(0, 0, patternSize, patternSize);\n        patternContext.fillStyle = color;\n\n        for (let x = -1; x < GRID_PATTERN_REPEAT + 1; x++) {\n            for (let y = -1; y < GRID_PATTERN_REPEAT + 1; y++) {\n                if (x % GRID_PATTERN_REPEAT === 0 && y % GRID_PATTERN_REPEAT === 0) {\n                    patternContext.fillRect(\n                        x * GRID_SIZE - majorDotSize / 2,\n                        y * GRID_SIZE - majorDotSize / 2,\n                        majorDotSize,\n                        majorDotSize,\n                    );\n                } else if (!simple) {\n                    patternContext.fillRect(\n                        x * GRID_SIZE - GRID_DOT_SIZE / 2,\n                        y * GRID_SIZE - GRID_DOT_SIZE / 2,\n                        GRID_DOT_SIZE,\n                        GRID_DOT_SIZE,\n                    );\n                }\n            }\n        }\n\n        return ctx.createPattern(patternCanvas, 'repeat');\n    }\n}\n","import {inject, Injectable} from '@angular/core';\nimport {\n    filter,\n    fromEvent,\n    map,\n    merge,\n    type Observable,\n    scan,\n    share,\n    startWith,\n    switchMap,\n    takeUntil,\n    tap,\n    withLatestFrom,\n} from 'rxjs';\n\nimport {dfClamp, dfDistanceBetweenTouches} from '../../helpers';\nimport {DF_PAN_ZOOM_OPTIONS} from './pan-zoom.options';\nimport {PanZoomService} from './pan-zoom.service';\nimport {\n    type DfPanZoomGesture,\n    type DfPanZoomPanGesture,\n    type DfPanZoomZoomGesture,\n} from './pan-zoom-gestures.interfaces';\n\nconst TRACKPAD_DETECTION_STATE_TIMEOUT = 60_000;\n\n@Injectable()\nexport class PanZoomGesturesService {\n    private readonly panZoomOptions = inject(DF_PAN_ZOOM_OPTIONS);\n    private readonly panZoomService = inject(PanZoomService);\n    private readonly streams = new WeakMap<HTMLElement, Observable<DfPanZoomGesture>>();\n    private trackpadDetected = false;\n    private lastTrackpadDetectionTime: number | null = null;\n    private lastTrackpadDpr = 0;\n\n    public streamFor(nativeElement: HTMLElement): Observable<DfPanZoomGesture> {\n        const cached = this.streams.get(nativeElement);\n\n        if (cached) {\n            return cached;\n        }\n\n        const gestures$ = merge(\n            this.createWheelStream(nativeElement),\n            this.createTouchStream(nativeElement),\n        ).pipe(share());\n\n        this.streams.set(nativeElement, gestures$);\n\n        return gestures$;\n    }\n\n    private createWheelStream(nativeElement: HTMLElement): Observable<DfPanZoomGesture> {\n        const pointerPosition$ = merge(\n            fromEvent<PointerEvent>(nativeElement, 'pointermove', {passive: true}),\n            fromEvent<MouseEvent>(nativeElement, 'mousemove', {passive: true}),\n        ).pipe(\n            map(({clientX, clientY}) => ({clientX, clientY})),\n            startWith(this.getElementCenter(nativeElement)),\n        );\n\n        return fromEvent<WheelEvent>(nativeElement, 'wheel', {passive: false}).pipe(\n            tap((event) => {\n                event.preventDefault();\n                event.stopPropagation();\n            }),\n            withLatestFrom(pointerPosition$),\n            map(([event, pointer]) =>\n                this.mapWheelToGesture(event, nativeElement, pointer),\n            ),\n        );\n    }\n\n    private createTouchStream(\n        nativeElement: HTMLElement,\n    ): Observable<DfPanZoomZoomGesture> {\n        return fromEvent<TouchEvent>(nativeElement, 'touchstart', {passive: true}).pipe(\n            filter(({touches}) => touches.length > 1),\n            switchMap((startEvent) =>\n                fromEvent<TouchEvent>(nativeElement, 'touchmove', {passive: false}).pipe(\n                    tap((event) => {\n                        event.preventDefault();\n                        event.stopPropagation();\n                    }),\n                    scan(\n                        (prev, event) => {\n                            const distance = dfDistanceBetweenTouches(event);\n\n                            return {\n                                event,\n                                distance,\n                                deltaScale:\n                                    (distance - prev.distance) *\n                                    this.panZoomOptions.touchSensitivity,\n                            };\n                        },\n                        {\n                            event: startEvent,\n                            distance: dfDistanceBetweenTouches(startEvent),\n                            deltaScale: 0,\n                        },\n                    ),\n                    map(({event, deltaScale}) => {\n                        const [touch1, touch2] = [\n                            event.touches[0] ?? {clientX: 0, clientY: 0},\n                            event.touches[1] ?? {clientX: 0, clientY: 0},\n                        ];\n\n                        return {\n                            type: 'zoom',\n                            clientX: (touch1.clientX + touch2.clientX) / 2,\n                            clientY: (touch1.clientY + touch2.clientY) / 2,\n                            deltaScale,\n                            event,\n                        } as const;\n                    }),\n                    takeUntil(\n                        merge(\n                            fromEvent<TouchEvent>(nativeElement, 'touchend'),\n                            fromEvent<TouchEvent>(nativeElement, 'touchcancel'),\n                        ),\n                    ),\n                ),\n            ),\n        );\n    }\n\n    private mapWheelToGesture(\n        event: WheelEvent,\n        nativeElement: HTMLElement,\n        pointer: {clientX: number; clientY: number},\n    ): DfPanZoomGesture {\n        const isTrackpad = this.isTrackpadWheelEvent(event);\n        const isPinchLike = this.isPinchGesture(event);\n        const isTrackpadMove = isTrackpad && !isPinchLike;\n        const clientPosition = this.resolveWheelClientPosition(\n            event,\n            nativeElement,\n            pointer,\n        );\n\n        if (\n            isTrackpadMove ||\n            (!isTrackpad &&\n                !this.isMetaKeyEvent(event) &&\n                this.panZoomOptions.wheelBehavior === 'scroll')\n        ) {\n            return this.createPanGestureFromWheel(event);\n        }\n\n        const isPinchToZoom = isTrackpad && isPinchLike;\n        const acceleration = isPinchToZoom ? this.panZoomOptions.pinchZoomSpeed : 1;\n\n        return this.createZoomGestureFromWheel(event, acceleration, clientPosition);\n    }\n\n    private createPanGestureFromWheel(event: WheelEvent): DfPanZoomPanGesture {\n        const hasWrongHorizontalScroll = event.shiftKey && Math.abs(event.deltaY) > 0.001;\n\n        return {\n            type: 'pan',\n            deltaX: hasWrongHorizontalScroll ? -event.deltaY : -event.deltaX,\n            deltaY: hasWrongHorizontalScroll ? -event.deltaX : -event.deltaY,\n            event,\n        };\n    }\n\n    private createZoomGestureFromWheel(\n        event: WheelEvent,\n        acceleration: number,\n        clientPosition: {clientX: number; clientY: number},\n    ): DfPanZoomZoomGesture {\n        if (!event.deltaY) {\n            return {\n                type: 'zoom',\n                clientX: clientPosition.clientX,\n                clientY: clientPosition.clientY,\n                deltaScale: 0,\n                event,\n            };\n        }\n\n        const pinchSpeed =\n            Math.sign(event.deltaY) * dfClamp(Math.abs(event.deltaY), 1, 20);\n\n        // `wheelStep` has priority over deprecated `zoomWheelSensitivity`.\n        const wheelStep =\n            this.panZoomOptions.wheelStep ?? this.panZoomOptions.zoomWheelSensitivity;\n        const dScale =\n            wheelStep * this.panZoomOptions.wheelSpeed * pinchSpeed * acceleration;\n        const cameraScale = this.panZoomService.snapshot().zoom;\n\n        return {\n            type: 'zoom',\n            clientX: clientPosition.clientX,\n            clientY: clientPosition.clientY,\n            deltaScale: -dScale * cameraScale,\n            event,\n        };\n    }\n\n    private isMetaKeyEvent(event: WheelEvent): boolean {\n        return event.ctrlKey || event.metaKey;\n    }\n\n    private isPinchGesture(event: WheelEvent): boolean {\n        return this.isMetaKeyEvent(event) || event.deltaZ !== 0;\n    }\n\n    private isTrackpadWheelEvent(\n        event: WheelEvent,\n        dpr: number = globalThis.devicePixelRatio || 1,\n    ): boolean {\n        const now = globalThis.performance.now();\n\n        if (this.trackpadDetected && this.lastTrackpadDetectionTime !== null) {\n            if (\n                now - this.lastTrackpadDetectionTime >=\n                    TRACKPAD_DETECTION_STATE_TIMEOUT ||\n                this.lastTrackpadDpr !== dpr\n            ) {\n                this.trackpadDetected = false;\n                this.lastTrackpadDetectionTime = null;\n            }\n        }\n\n        const normalizedDeltaY = event.deltaY * dpr;\n        const normalizedDeltaX = event.deltaX * dpr;\n        const hasFractionalDelta =\n            !Number.isInteger(event.deltaY) ||\n            !Number.isInteger(event.deltaX) ||\n            !Number.isInteger(normalizedDeltaY) ||\n            !Number.isInteger(normalizedDeltaX);\n        const isSmallDelta = Math.abs(event.deltaY) < 50 && Math.abs(event.deltaX) < 50;\n\n        if ((event.ctrlKey || event.metaKey) && (hasFractionalDelta || isSmallDelta)) {\n            this.markAsTrackpad(dpr, now);\n\n            return true;\n        }\n\n        if (normalizedDeltaX !== 0 && !event.shiftKey) {\n            this.markAsTrackpad(dpr, now);\n\n            return true;\n        }\n\n        if (hasFractionalDelta) {\n            this.markAsTrackpad(dpr, now);\n\n            return true;\n        }\n\n        if (this.trackpadDetected && this.lastTrackpadDetectionTime !== null) {\n            if (isSmallDelta) {\n                this.lastTrackpadDetectionTime = now;\n            }\n\n            return true;\n        }\n\n        this.trackpadDetected = false;\n        this.lastTrackpadDetectionTime = null;\n\n        return false;\n    }\n\n    private markAsTrackpad(dpr: number, now: number): void {\n        this.trackpadDetected = true;\n        this.lastTrackpadDetectionTime = now;\n        this.lastTrackpadDpr = dpr;\n    }\n\n    private resolveWheelClientPosition(\n        event: WheelEvent,\n        nativeElement: HTMLElement,\n        fallback: {clientX: number; clientY: number},\n    ): {clientX: number; clientY: number} {\n        if (event.clientX !== 0 || event.clientY !== 0) {\n            return {clientX: event.clientX, clientY: event.clientY};\n        }\n\n        const rect = nativeElement.getBoundingClientRect();\n\n        if (this.isPointInsideRect(fallback, rect)) {\n            return fallback;\n        }\n\n        return this.getElementCenter(nativeElement);\n    }\n\n    private isPointInsideRect(\n        point: {clientX: number; clientY: number},\n        rect: DOMRect,\n    ): boolean {\n        return (\n            point.clientX >= rect.left &&\n            point.clientX <= rect.right &&\n            point.clientY >= rect.top &&\n            point.clientY <= rect.bottom\n        );\n    }\n\n    private getElementCenter(nativeElement: HTMLElement): {\n        clientX: number;\n        clientY: number;\n    } {\n        const rect = nativeElement.getBoundingClientRect();\n\n        return {\n            clientX: rect.left + rect.width / 2,\n            clientY: rect.top + rect.height / 2,\n        };\n    }\n}\n","import {isPlatformBrowser} from '@angular/common';\nimport {\n    ChangeDetectionStrategy,\n    ChangeDetectorRef,\n    Component,\n    DestroyRef,\n    ElementRef,\n    inject,\n    NgZone,\n    type OnDestroy,\n    type OnInit,\n    output,\n    PLATFORM_ID,\n    signal,\n} from '@angular/core';\nimport {takeUntilDestroyed} from '@angular/core/rxjs-interop';\nimport {WA_IS_E2E} from '@ng-web-apis/platform';\nimport {WaResizeObserver} from '@ng-web-apis/resize-observer';\nimport {animationFrameScheduler, type Subscription} from 'rxjs';\n\nimport {DragDropService} from '../../directives/drag-drop';\nimport {type DfPoint} from '../../ng-draw-flow.interfaces';\nimport {DRAW_FLOW_ROOT_ELEMENT} from '../../ng-draw-flow.token';\nimport {PanZoomControllerService} from './pan-zoom.controller.service';\nimport {DF_PAN_ZOOM_OPTIONS, type DfPanZoomOptions} from './pan-zoom.options';\nimport {PanZoomBackgroundCanvasComponent} from './pan-zoom-background-canvas.component';\nimport {type DfPanZoomGesture} from './pan-zoom-gestures.interfaces';\nimport {PanZoomGesturesService} from './pan-zoom-gestures.service';\n\n@Component({\n    standalone: true,\n    selector: 'df-pan-zoom',\n    imports: [PanZoomBackgroundCanvasComponent],\n    templateUrl: './pan-zoom.component.html',\n    styleUrl: './pan-zoom.component.less',\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    providers: [PanZoomControllerService, PanZoomGesturesService],\n    hostDirectives: [\n        {\n            directive: WaResizeObserver,\n            outputs: ['waResizeObserver'],\n        },\n    ],\n    host: {'(waResizeObserver)': 'onBoardResize($event)'},\n})\nexport class PanZoomComponent implements OnInit, OnDestroy {\n    private readonly cdr = inject(ChangeDetectorRef);\n    private readonly el = inject<ElementRef<HTMLElement>>(ElementRef);\n    private readonly drawFlowElement = inject<HTMLElement>(DRAW_FLOW_ROOT_ELEMENT);\n    private readonly destroyRef = inject(DestroyRef);\n    private readonly ngZone = inject(NgZone);\n    private readonly platformId = inject(PLATFORM_ID);\n    private readonly panZoomOptions = inject<DfPanZoomOptions>(DF_PAN_ZOOM_OPTIONS);\n    private readonly panZoomController = inject(PanZoomControllerService);\n    private readonly panZoomGestures = inject(PanZoomGesturesService);\n    private readonly dragDropService = inject(DragDropService);\n    private readonly isE2E = inject(WA_IS_E2E);\n    private renderFrameSubscription: Subscription | null = null;\n    private containerOffsetSyncSubscription: Subscription | null = null;\n\n    public readonly scale = output<number>();\n\n    protected readonly cursor = this.panZoomController.cursor;\n    protected readonly panTransform = this.panZoomController.panTransform;\n    protected readonly transitionDuration = !this.isE2E\n        ? signal('0s')\n        : this.panZoomController.transitionDuration;\n\n    constructor() {\n        this.watchController();\n        this.watchGestures();\n    }\n\n    public ngOnInit(): void {\n        this.syncContainerOffsets();\n    }\n\n    public ngOnDestroy(): void {\n        this.cancelScheduledRender();\n        this.cancelScheduledContainerOffsetSync();\n    }\n\n    public resetPanzoom(): void {\n        this.panZoomController.resetPanzoom();\n    }\n\n    public setPosition(position?: Partial<DfPoint> & {zoom?: number}): void {\n        this.panZoomController.setPosition(position);\n    }\n\n    public setScale(scale: number): void {\n        this.panZoomController.setScale(scale);\n    }\n\n    public zoomIn(): void {\n        this.panZoomController.zoomIn();\n    }\n\n    public zoomOut(): void {\n        this.panZoomController.zoomOut();\n    }\n\n    protected get backgroundCanvasVisible(): boolean {\n        return this.panZoomOptions.backgroundCanvas.visible;\n    }\n\n    protected onPan(event: Parameters<PanZoomControllerService['handlePan']>[0]): void {\n        this.panZoomController.handlePan(event);\n    }\n\n    protected onBoardResize(entries: readonly ResizeObserverEntry[]): void {\n        if (!entries.length) {\n            return;\n        }\n\n        this.requestContainerOffsetSync();\n    }\n\n    private watchController(): void {\n        this.panZoomController.scaleChanges$\n            .pipe(takeUntilDestroyed(this.destroyRef))\n            .subscribe((scale) => this.scale.emit(scale));\n\n        this.panZoomController.renderRequests$\n            .pipe(takeUntilDestroyed(this.destroyRef))\n            .subscribe((mode) => {\n                if (mode === 'sync') {\n                    this.renderNow();\n                } else {\n                    this.requestRender();\n                }\n            });\n    }\n\n    private watchGestures(): void {\n        if (!isPlatformBrowser(this.platformId)) {\n            return;\n        }\n\n        this.ngZone.runOutsideAngular(() => {\n            this.panZoomGestures\n                .streamFor(this.el.nativeElement)\n                .pipe(takeUntilDestroyed(this.destroyRef))\n                .subscribe((gesture) => this.processGesture(gesture));\n\n            this.dragDropService\n                .streamFor(this.el.nativeElement)\n                .pipe(takeUntilDestroyed(this.destroyRef))\n                .subscribe((event) => this.onPan(event));\n        });\n    }\n\n    private processGesture(gesture: DfPanZoomGesture): void {\n        if (gesture.type === 'pan') {\n            this.panZoomController.queueGesture(gesture);\n\n            return;\n        }\n\n        const viewportRect = this.el.nativeElement.getBoundingClientRect();\n        const zeroPoint = this.panZoomController.viewportZeroPoint();\n        const point: DfPoint = {\n            x: gesture.clientX - viewportRect.x - zeroPoint.x,\n            y: gesture.clientY - viewportRect.y - zeroPoint.y,\n        };\n\n        this.panZoomController.queueGesture({\n            type: 'zoom',\n            point,\n            deltaScale: gesture.deltaScale,\n        });\n    }\n\n    private requestRender(): void {\n        if (this.renderFrameSubscription) {\n            return;\n        }\n\n        this.renderFrameSubscription = animationFrameScheduler.schedule(() => {\n            this.renderFrameSubscription = null;\n            this.cdr.detectChanges();\n        });\n    }\n\n    private renderNow(): void {\n        this.cancelScheduledRender();\n        this.cdr.detectChanges();\n    }\n\n    private cancelScheduledRender(): void {\n        this.renderFrameSubscription?.unsubscribe();\n        this.renderFrameSubscription = null;\n    }\n\n    private requestContainerOffsetSync(): void {\n        if (this.containerOffsetSyncSubscription) {\n            return;\n        }\n\n        this.containerOffsetSyncSubscription = animationFrameScheduler.schedule(() => {\n            this.containerOffsetSyncSubscription = null;\n            this.syncContainerOffsets();\n        });\n    }\n\n    private cancelScheduledContainerOffsetSync(): void {\n        this.containerOffsetSyncSubscription?.unsubscribe();\n        this.containerOffsetSyncSubscription = null;\n    }\n\n    private syncContainerOffsets(): void {\n        const rootSize = {\n            width: this.drawFlowElement.offsetWidth,\n            height: this.drawFlowElement.offsetHeight,\n        };\n\n        if (!rootSize.width || !rootSize.height) {\n            return;\n        }\n\n        this.panZoomController.syncContainerOffsets(rootSize);\n    }\n}\n","<div\n    data-element=\"scene\"\n    class=\"pan-zoom__viewport\"\n>\n    @if (backgroundCanvasVisible) {\n        <df-pan-zoom-background-canvas />\n    }\n    <div\n        class=\"pan-zoom\"\n        [style.cursor]=\"cursor()\"\n        [style.transform]=\"panTransform()\"\n        [style.transition-duration]=\"transitionDuration()\"\n    >\n        <div\n            style=\"position: relative; width: 0; height: 0\"\n            class=\"pan-zoom__container\"\n        >\n            <ng-content />\n        </div>\n    </div>\n</div>\n","import {computed, Injectable, signal} from '@angular/core';\nimport {toObservable} from '@angular/core/rxjs-interop';\nimport {Subject} from 'rxjs';\n\nimport {type NgDrawFlowComponent} from '../ng-draw-flow.component';\nimport {\n    type DfDataConnection,\n    type DfDataModel,\n    type DfDataNode,\n    type DfEvent,\n    type DfPoint,\n} from '../ng-draw-flow.interfaces';\n\ntype Nullable<T> = T | null;\n\n/**\n * Root-scoped facade that mirrors `NgDrawFlowComponent` state and public\n * controls so host applications can interact with the editor without a\n * component reference.\n */\n@Injectable({providedIn: 'root'})\nexport class NgDrawFlowStoreService {\n    private host?: NgDrawFlowComponent;\n    private readonly selectedNodeSignal = signal<Nullable<DfDataNode>>(null);\n    private readonly dataModelSignal = signal<Nullable<DfDataModel>>(null);\n    private readonly selectedConnectionSignal = signal<Nullable<DfDataConnection>>(null);\n    private readonly scaleSignal = signal<number>(100);\n    private readonly nodeDeletedSubject = new Subject<DfEvent<DfDataNode>>();\n    private readonly nodeMovedSubject = new Subject<DfEvent<DfDataNode>>();\n    private readonly nodeSelectedSubject = new Subject<DfDataNode>();\n    private readonly connectionCreatedSubject = new Subject<DfEvent<DfDataConnection>>();\n    private readonly connectionDeletedSubject = new Subject<DfEvent<DfDataConnection>>();\n    private readonly connectionSelectedSubject = new Subject<DfDataConnection>();\n\n    private readonly lastNodeDeletedSignal = signal<Nullable<DfEvent<DfDataNode>>>(null);\n    private readonly lastNodeMovedSignal = signal<Nullable<DfEvent<DfDataNode>>>(null);\n    private readonly lastNodeSelectedSignal = signal<Nullable<DfDataNode>>(null);\n    private readonly lastConnectionCreatedSignal =\n        signal<Nullable<DfEvent<DfDataConnection>>>(null);\n\n    private readonly lastConnectionDeletedSignal =\n        signal<Nullable<DfEvent<DfDataConnection>>>(null);\n\n    private readonly lastConnectionSelectedSignal =\n        signal<Nullable<DfDataConnection>>(null);\n\n    /** Snapshot of the current editor data model. */\n    public readonly dataModel = this.dataModelSignal.asReadonly();\n\n    /** Stream of data model updates emitted after each change. */\n    public readonly dataModel$ = toObservable(this.dataModelSignal);\n\n    /** Snapshot of the currently selected node (if any). */\n    public readonly selectedNode = this.selectedNodeSignal.asReadonly();\n\n    /** Stream of node selection changes. */\n    public readonly selectedNode$ = toObservable(this.selectedNodeSignal);\n\n    /** Snapshot of the currently selected connection (if any). */\n    public readonly selectedConnection = this.selectedConnectionSignal.asReadonly();\n\n    /** Stream of connection selection changes. */\n    public readonly selectedConnection$ = toObservable(this.selectedConnectionSignal);\n\n    /** Snapshot of the current zoom scale in percents. */\n    public readonly scale = this.scaleSignal.asReadonly();\n\n    /** Stream of zoom scale updates. */\n    public readonly scale$ = toObservable(this.scaleSignal);\n\n    /** Whether a node or a connection is selected. */\n    public readonly hasSelection = computed(\n        () => !!this.selectedNodeSignal() || !!this.selectedConnectionSignal(),\n    );\n\n    /** Emits whenever a node is deleted (UI or API). */\n    public readonly nodeDeleted$ = this.nodeDeletedSubject.asObservable();\n\n    /** Last node deletion event. Signal-first counterpart of `nodeDeleted$`. */\n    public readonly lastNodeDeleted = this.lastNodeDeletedSignal.asReadonly();\n\n    /** Emits whenever a node moves. */\n    public readonly nodeMoved$ = this.nodeMovedSubject.asObservable();\n\n    /** Last node movement event. Signal-first counterpart of `nodeMoved$`. */\n    public readonly lastNodeMoved = this.lastNodeMovedSignal.asReadonly();\n\n    /** Emits whenever a node becomes selected. */\n    public readonly nodeSelected$ = this.nodeSelectedSubject.asObservable();\n\n    /** Last selected node event payload. Signal-first counterpart of `nodeSelected$`. */\n    public readonly lastNodeSelected = this.lastNodeSelectedSignal.asReadonly();\n\n    /** Emits whenever a connection is created. */\n    public readonly connectionCreated$ = this.connectionCreatedSubject.asObservable();\n\n    /** Last connection creation event. Signal-first counterpart of `connectionCreated$`. */\n    public readonly lastConnectionCreated = this.lastConnectionCreatedSignal.asReadonly();\n\n    /** Emits whenever a connection is removed. */\n    public readonly connectionDeleted$ = this.connectionDeletedSubject.asObservable();\n\n    /** Last connection deletion event. Signal-first counterpart of `connectionDeleted$`. */\n    public readonly lastConnectionDeleted = this.lastConnectionDeletedSignal.asReadonly();\n\n    /** Emits whenever a connection becomes selected. */\n    public readonly connectionSelected$ = this.connectionSelectedSubject.asObservable();\n\n    /** Last selected connection payload. Signal-first counterpart of `connectionSelected$`. */\n    public readonly lastConnectionSelected =\n        this.lastConnectionSelectedSignal.asReadonly();\n\n    /**\n     * Binds a component instance so store methods can forward commands and\n     * reflect state changes.\n     */\n    public attach(host: NgDrawFlowComponent): void {\n        this.host = host;\n    }\n\n    /**\n     * Unbinds the current component instance and clears all cached state.\n     */\n    public detach(host: NgDrawFlowComponent): void {\n        if (this.host !== host) {\n            return;\n        }\n\n        this.reset();\n        this.host = undefined;\n    }\n\n    /** Forwards a zoom-in command to the live editor. */\n    public zoomIn(): void {\n        this.host?.zoomIn();\n    }\n\n    /** Forwards a zoom-out command to the live editor. */\n    public zoomOut(): void {\n        this.host?.zoomOut();\n    }\n\n    /** Resets pan and zoom on the live editor. */\n    public resetPosition(): void {\n        this.host?.resetPosition();\n    }\n\n    /** Partially updates zoom and coordinates. */\n    public setPosition(position?: Partial<DfPoint> & {zoom?: number}): void {\n        this.host?.setPosition(position);\n    }\n\n    /**\n     * Applies an absolute zoom factor on the live editor and stores its\n     * percentage representation.\n     */\n    public setScale(scale: number): void {\n        if (this.host) {\n            this.host.setScale(scale);\n\n            return;\n        }\n\n        const percent = Math.round(scale * 100);\n\n        this.scaleSignal.set(percent);\n    }\n\n    /**\n     * Removes the provided connection via the live editor instance.\n     */\n    public removeConnection(connection: DfDataConnection): void {\n        this.host?.removeConnection(connection);\n    }\n\n    /**\n     * Removes the provided node via the live editor instance.\n     */\n    public removeNode(node: DfDataNode | string): void {\n        this.host?.removeNode(node);\n    }\n\n    /**\n     * Applies a model to the live editor and propagates it through the bound\n     * form control. Without an attached editor, only the cached snapshot changes.\n     */\n    public setDataModel(model: DfDataModel): void {\n        if (this.host) {\n            this.host.setDataModel(model);\n\n            return;\n        }\n\n        this.updateDataModel(model);\n    }\n\n    /**\n     * Replaces the cached data model and revalidates current selections.\n     */\n    public updateDataModel(model: DfDataModel): void {\n        this.dataModelSignal.set(this.cloneModel(model));\n\n        const selectedNode = this.selectedNodeSignal();\n\n        if (selectedNode) {\n            const nextSelectedNode = model.nodes.find(\n                (node) => node.id === selectedNode.id,\n            );\n\n            if (!nextSelectedNode) {\n                this.selectedNodeSignal.set(null);\n            } else if ('position' in nextSelectedNode) {\n                this.selectedNodeSignal.set(this.cloneNode(nextSelectedNode));\n            }\n        }\n\n        const selectedConnection = this.selectedConnectionSignal();\n\n        if (selectedConnection) {\n            const nextSelectedConnection = model.connections.find((connection) =>\n                this.isSameConnection(connection, selectedConnection),\n            );\n\n            this.selectedConnectionSignal.set(\n                nextSelectedConnection\n                    ? this.cloneConnection(nextSelectedConnection)\n                    : null,\n            );\n        }\n\n        this.clearSelectionOnScene();\n    }\n\n    /** Pushes a new zoom scale in percents without touching the live editor. */\n    public setScaleValue(scale: number): void {\n        this.scaleSignal.set(scale);\n    }\n\n    /** Stores the provided node as selected and clears connection selection. */\n    public setSelectedNode(node: DfDataNode): void {\n        this.selectedNodeSignal.set(this.cloneNode(node));\n        this.selectedConnectionSignal.set(null);\n        this.lastNodeSelectedSignal.set(this.cloneNode(node));\n        this.nodeSelectedSubject.next(node);\n    }\n\n    /** Clears node selection optionally guarding against mismatched ids. */\n    public clearSelectedNode(id?: string): void {\n        const current = this.selectedNodeSignal();\n\n        if (!current) {\n            return;\n        }\n\n        if (!id || current.id === id) {\n            this.selectedNodeSignal.set(null);\n            this.clearSelectionOnScene();\n        }\n    }\n\n    /** Updates cached node data when the selected node changes externally. */\n    public updateSelectedNode(node: DfDataNode): void {\n        const current = this.selectedNodeSignal();\n\n        if (current?.id === node.id) {\n            this.selectedNodeSignal.set(this.cloneNode(node));\n        }\n    }\n\n    /** Stores the provided connection as selected and clears node selection. */\n    public setSelectedConnection(connection: DfDataConnection): void {\n        this.selectedConnectionSignal.set(this.cloneConnection(connection));\n        this.selectedNodeSignal.set(null);\n        this.lastConnectionSelectedSignal.set(this.cloneConnection(connection));\n\n        this.connectionSelectedSubject.next(connection);\n    }\n\n    /** Clears connection selection optionally guarding by equality check. */\n    public clearSelectedConnection(connection?: DfDataConnection): void {\n        const current = this.selectedConnectionSignal();\n\n        if (!current) {\n            return;\n        }\n\n        if (!connection || this.isSameConnection(current, connection)) {\n            this.selectedConnectionSignal.set(null);\n            this.clearSelectionOnScene();\n        }\n    }\n\n    /** Updates cached connection data when the selected connection changes. */\n    public updateSelectedConnection(connection: DfDataConnection): void {\n        const current = this.selectedConnectionSignal();\n\n        if (current && this.isSameConnection(current, connection)) {\n            this.selectedConnectionSignal.set(this.cloneConnection(connection));\n        }\n    }\n\n    /** Emits a node deletion event and reconciles cached state. */\n    public emitNodeDeleted(event: DfEvent<DfDataNode>): void {\n        this.lastNodeDeletedSignal.set(this.cloneNodeEvent(event));\n\n        if (this.selectedNodeSignal()?.id === event.target.id) {\n            this.selectedNodeSignal.set(null);\n        }\n\n        this.updateDataModel(event.model);\n        this.nodeDeletedSubject.next(event);\n    }\n\n    /** Emits a node movement event and reconciles cached state. */\n    public emitNodeMoved(event: DfEvent<DfDataNode>): void {\n        this.lastNodeMovedSignal.set(this.cloneNodeEvent(event));\n        this.updateSelectedNode(event.target);\n        this.updateDataModel(event.model);\n        this.nodeMovedSubject.next(event);\n    }\n\n    /** Emits a connection creation event and reconciles cached state. */\n    public emitConnectionCreated(event: DfEvent<DfDataConnection>): void {\n        this.lastConnectionCreatedSignal.set(this.cloneConnectionEvent(event));\n        this.updateDataModel(event.model);\n        this.connectionCreatedSubject.next(event);\n    }\n\n    /** Emits a connection deletion event and reconciles cached state. */\n    public emitConnectionDeleted(event: DfEvent<DfDataConnection>): void {\n        this.lastConnectionDeletedSignal.set(this.cloneConnectionEvent(event));\n        this.clearSelectedConnection(event.target);\n        this.updateDataModel(event.model);\n        this.connectionDeletedSubject.next(event);\n    }\n\n    /** Records a connection as selected and notifies subscribers. */\n    public emitConnectionSelected(connection: DfDataConnection): void {\n        this.setSelectedConnection(connection);\n    }\n\n    /** Records a node as selected and notifies subscribers. */\n    public emitNodeSelected(node: DfDataNode): void {\n        this.setSelectedNode(node);\n    }\n\n    /** Clears all cached state (model, selections, scale). */\n    public clear(): void {\n        this.reset();\n    }\n\n    private reset(): void {\n        this.dataModelSignal.set(null);\n        this.selectedNodeSignal.set(null);\n        this.selectedConnectionSignal.set(null);\n        this.scaleSignal.set(100);\n        this.lastNodeDeletedSignal.set(null);\n        this.lastNodeMovedSignal.set(null);\n        this.lastNodeSelectedSignal.set(null);\n        this.lastConnectionCreatedSignal.set(null);\n        this.lastConnectionDeletedSignal.set(null);\n        this.lastConnectionSelectedSignal.set(null);\n        this.clearSelectionOnScene();\n    }\n\n    private cloneModel(model: DfDataModel): DfDataModel {\n        return {\n            ...model,\n            nodes: model.nodes.map((node) =>\n                'position' in node\n                    ? this.cloneNode(node)\n                    : {\n                          ...node,\n                          data: {...node.data},\n                      },\n            ),\n            connections: model.connections.map((connection) =>\n                this.cloneConnection(connection),\n            ),\n        };\n    }\n\n    private cloneNode(node: DfDataNode): DfDataNode {\n        return {\n            ...node,\n            data: {...node.data},\n            position: {...node.position},\n        };\n    }\n\n    private cloneConnection(connection: DfDataConnection): DfDataConnection {\n        return {\n            ...connection,\n            source: {...connection.source},\n            target: {...connection.target},\n            label: connection.label ? {...connection.label} : undefined,\n        };\n    }\n\n    private cloneNodeEvent(event: DfEvent<DfDataNode>): DfEvent<DfDataNode> {\n        return {\n            target: this.cloneNode(event.target),\n            model: this.cloneModel(event.model),\n        };\n    }\n\n    private cloneConnectionEvent(\n        event: DfEvent<DfDataConnection>,\n    ): DfEvent<DfDataConnection> {\n        return {\n            target: this.cloneConnection(event.target),\n            model: this.cloneModel(event.model),\n        };\n    }\n\n    private clearSelectionOnScene(): void {\n        if (!this.host || this.hasSelection()) {\n            return;\n        }\n\n        this.host.clearSelection();\n    }\n\n    private isSameConnection(left: DfDataConnection, right: DfDataConnection): boolean {\n        return (\n            left.source.nodeId === right.source.nodeId &&\n            left.source.connectorId === right.source.connectorId &&\n            left.target.nodeId === right.target.nodeId &&\n            left.target.connectorId === right.target.connectorId\n        );\n    }\n}\n","import {DOCUMENT, isPlatformBrowser} from '@angular/common';\nimport {inject, Injectable, NgZone, type OnDestroy, PLATFORM_ID} from '@angular/core';\n\ninterface SelectableItem {\n    element: HTMLElement;\n    callback(selected: boolean): void;\n}\n\n@Injectable()\nexport class SelectionService implements OnDestroy {\n    private readonly document = inject(DOCUMENT);\n    private readonly ngZone = inject(NgZone);\n    private readonly platformId = inject(PLATFORM_ID);\n    private readonly selectedElements = new Set<HTMLElement>();\n    private readonly registeredElements = new Map<HTMLElement, SelectableItem>();\n    private isDragging = false;\n    private clickedOnScene = false;\n    private startX: number | null = null;\n    private startY: number | null = null;\n    private readonly dragThreshold = 5;\n    private currentTarget: HTMLElement | null = null;\n    private readonly boundMouseDown = this.onMouseDown.bind(this);\n    private readonly boundMouseMove = this.onMouseMove.bind(this);\n    private readonly boundMouseUp = this.onMouseUp.bind(this);\n\n    constructor() {\n        // Use NgZone.runOutsideAngular to prevent change detection\n        // from running on every mouse event\n        if (isPlatformBrowser(this.platformId)) {\n            this.ngZone.runOutsideAngular(() => {\n                this.document.addEventListener('mousedown', this.boundMouseDown);\n                this.document.addEventListener('mousemove', this.boundMouseMove);\n                this.document.addEventListener('mouseup', this.boundMouseUp);\n            });\n        }\n    }\n\n    public ngOnDestroy(): void {\n        this.document.removeEventListener('mousedown', this.boundMouseDown);\n        this.document.removeEventListener('mousemove', this.boundMouseMove);\n        this.document.removeEventListener('mouseup', this.boundMouseUp);\n\n        this.registeredElements.clear();\n        this.selectedElements.clear();\n    }\n\n    /**\n     * Registers an element for selection tracking\n     * @param element HTML element to track\n     * @param callback Callback function triggered when selection changes\n     * @returns Function to unregister\n     */\n    public registerElement(\n        element: HTMLElement,\n        callback: (selected: boolean) => void,\n    ): () => void {\n        this.registeredElements.set(element, {element, callback});\n\n        // Return a function to unregister\n        return () => {\n            this.unregisterElement(element);\n        };\n    }\n\n    /**\n     * Unregisters an element\n     * @param element HTML element to unregister\n     */\n    public unregisterElement(element: HTMLElement): void {\n        if (this.selectedElements.has(element)) {\n            this.selectedElements.delete(element);\n        }\n\n        this.registeredElements.delete(element);\n    }\n\n    /**\n     * Selects an element\n     * @param element HTML element to select\n     * @param exclusive If true, deselects all other elements\n     */\n    public selectElement(element: HTMLElement, exclusive = true): void {\n        if (exclusive) {\n            this.clearSelection(element);\n        }\n\n        if (!this.selectedElements.has(element)) {\n            this.selectedElements.add(element);\n            const item = this.registeredElements.get(element);\n\n            if (item) {\n                // Run callback inside Angular zone for change detection\n                this.ngZone.run(() => {\n                    item.callback(true);\n                });\n            }\n        }\n    }\n\n    /**\n     * Deselects an element\n     * @param element HTML element to deselect\n     */\n    public deselectElement(element: HTMLElement): void {\n        if (this.selectedElements.has(element)) {\n            this.selectedElements.delete(element);\n            const item = this.registeredElements.get(element);\n\n            if (item) {\n                this.ngZone.run(() => {\n                    item.callback(false);\n                });\n            }\n        }\n    }\n\n    /**\n     * Clears selection of all elements except the excluded one\n     * @param exceptElement Element to exclude from clearing\n     */\n    public clearSelection(exceptElement?: HTMLElement): void {\n        this.selectedElements.forEach((element) => {\n            if (element !== exceptElement) {\n                this.deselectElement(element);\n            }\n        });\n    }\n\n    /**\n     * Checks if an element is selected\n     * @param element HTML element to check\n     * @returns true if the element is selected\n     */\n    public isSelected(element: HTMLElement): boolean {\n        return this.selectedElements.has(element);\n    }\n\n    /**\n     * Gets all selected elements\n     * @returns Array of selected HTML elements\n     */\n    public getSelectedElements(): HTMLElement[] {\n        return Array.from(this.selectedElements);\n    }\n\n    /**\n     * Mouse down event handler\n     */\n    private onMouseDown(event: MouseEvent): void {\n        this.startX = event.clientX;\n        this.startY = event.clientY;\n        this.isDragging = false;\n        this.currentTarget = event.target as HTMLElement;\n\n        // Find the nearest registered element\n        const targetElement = this.findRegisteredParent(this.currentTarget);\n\n        // If clicked on a registered element\n        if (targetElement) {\n            this.selectElement(targetElement);\n        }\n        // If clicked on the scene and it's not the start of dragging\n        else if (this.currentTarget.dataset.element === 'scene') {\n            // Remember that the click was on the scene\n            this.clickedOnScene = true;\n        }\n    }\n\n    /**\n     * Mouse move event handler\n     */\n    private onMouseMove(event: MouseEvent): void {\n        if (!this.startX || !this.startY) {\n            return;\n        }\n\n        const dx = event.clientX - this.startX;\n        const dy = event.clientY - this.startY;\n\n        // Check if the drag threshold has been exceeded\n        if (!this.isDragging && Math.sqrt(dx * dx + dy * dy) > this.dragThreshold) {\n            this.isDragging = true;\n        }\n    }\n\n    /**\n     * Mouse up event handler\n     */\n    private onMouseUp(_event: MouseEvent): void {\n        // If it was dragging and releasing on the scene,\n        // just reset the state without changing the selection\n        if (this.isDragging) {\n            this.reset();\n\n            return;\n        }\n\n        // If clicked on the scene (not while dragging)\n\n        if (this.clickedOnScene && !this.isDragging) {\n            // Clear selection only when clicking on the scene, not when dragging\n            this.clearSelection();\n        }\n\n        this.reset();\n    }\n\n    /**\n     * Finds the closest parent element that is registered in the service\n     */\n    private findRegisteredParent(element: HTMLElement | null): HTMLElement | null {\n        let current = element;\n\n        while (current) {\n            if (this.registeredElements.has(current)) {\n                return current;\n            }\n\n            current = current.parentElement;\n        }\n\n        return null;\n    }\n\n    /**\n     * Resets the drag state\n     */\n    private reset(): void {\n        this.startX = null;\n        this.startY = null;\n        this.isDragging = false;\n        this.currentTarget = null;\n        this.clickedOnScene = false; // Reset the scene click flag\n    }\n}\n","import {\n    Directive,\n    ElementRef,\n    inject,\n    type OnDestroy,\n    type OnInit,\n    output,\n} from '@angular/core';\n\nimport {SelectionService} from '../../services/selection.service';\n\n@Directive({\n    standalone: true,\n    selector: '[dfSelectableElement]',\n})\nexport class SelectableElementDirective implements OnInit, OnDestroy {\n    private selected = false;\n    private readonly el = inject(ElementRef<HTMLElement>);\n    private readonly selectionService = inject(SelectionService);\n    private unregisterFn: (() => void) | null = null;\n\n    protected readonly selectionChanged = output<boolean>({alias: 'dfSelectableElement'});\n\n    public ngOnInit(): void {\n        // Register the element in the service and save the unregistration function.\n        this.unregisterFn = this.selectionService.registerElement(\n            this.el.nativeElement,\n            (selected) => this.handleSelectionChange(selected),\n        );\n    }\n\n    public ngOnDestroy(): void {\n        // Unregister when the directive is destroyed\n        if (this.unregisterFn) {\n            this.unregisterFn();\n            this.unregisterFn = null;\n        }\n    }\n\n    private handleSelectionChange(selected: boolean): void {\n        if (this.selected !== selected) {\n            this.selected = selected;\n            this.selectionChanged.emit(selected);\n        }\n    }\n}\n","/** Restricts graph shortcuts to unhandled events from non-editable editor content. */\nexport function isEditorKeyboardEvent(event: KeyboardEvent, root: HTMLElement): boolean {\n    const target = event.target;\n    const path = event.composedPath();\n    const editableSelector =\n        'input, textarea, select, [contenteditable]:not([contenteditable=\"false\"]), [role=\"textbox\"], [role=\"combobox\"]';\n    const owningEditor = path.find(\n        (item) => item instanceof Element && item.matches('ng-draw-flow'),\n    );\n\n    return (\n        !event.defaultPrevented &&\n        !event.isComposing &&\n        target instanceof Element &&\n        (owningEditor ?? target.closest('ng-draw-flow')) === root &&\n        !target.closest(editableSelector) &&\n        !path.some((item) => item instanceof Element && item.matches(editableSelector))\n    );\n}\n","import {type DfPoint} from '../../../ng-draw-flow.interfaces';\n\nexport const calculateDistance = (source: DfPoint, target: DfPoint): number =>\n    Math.hypot(target.x - source.x, target.y - source.y);\n","import {type DfPoint} from '../../../../../../ng-draw-flow.interfaces';\n\nexport function getBezierEdgeCenter({\n    source,\n    target,\n    sourceControlPoint,\n    targetControlPoint,\n}: {\n    source: DfPoint;\n    target: DfPoint;\n    sourceControlPoint: DfPoint;\n    targetControlPoint: DfPoint;\n}): [number, number, number, number] {\n    const centerX =\n        source.x * 0.125 +\n        sourceControlPoint.x * 0.375 +\n        targetControlPoint.x * 0.375 +\n        target.x * 0.125;\n    const centerY =\n        source.y * 0.125 +\n        sourceControlPoint.y * 0.375 +\n        targetControlPoint.y * 0.375 +\n        target.y * 0.125;\n    const offsetX = Math.abs(centerX - source.x);\n    const offsetY = Math.abs(centerY - source.y);\n\n    return [centerX, centerY, offsetX, offsetY];\n}\n","export function calculateControlOffset(distance: number, curvature: number): number {\n    if (distance >= 0) {\n        return 0.5 * distance;\n    }\n\n    return curvature * 25 * Math.sqrt(-distance);\n}\n","import {type DfPoint} from '../../../ng-draw-flow.interfaces';\n\nexport const point = (x: number, y: number): DfPoint => ({x, y});\n","import {\n    type DfConnectorData,\n    DfConnectorPosition,\n    type DfPoint,\n} from '../../../../../../ng-draw-flow.interfaces';\nimport {point} from '../../../point';\nimport {calculateControlOffset} from './control-offset';\n\nexport function getControlWithCurvature(\n    sourceConnector: DfConnectorData,\n    target: DfPoint,\n    curvature: number,\n): DfPoint {\n    switch (sourceConnector.position!) {\n        case DfConnectorPosition.Bottom:\n            return point(\n                sourceConnector.point.x,\n                sourceConnector.point.y +\n                    calculateControlOffset(target.y - sourceConnector.point.y, curvature),\n            );\n        case DfConnectorPosition.Left:\n            return point(\n                sourceConnector.point.x -\n                    calculateControlOffset(sourceConnector.point.x - target.x, curvature),\n                sourceConnector.point.y,\n            );\n        case DfConnectorPosition.Right:\n            return point(\n                sourceConnector.point.x +\n                    calculateControlOffset(target.x - sourceConnector.point.x, curvature),\n                sourceConnector.point.y,\n            );\n        case DfConnectorPosition.Top:\n            return point(\n                sourceConnector.point.x,\n                sourceConnector.point.y -\n                    calculateControlOffset(sourceConnector.point.y - target.y, curvature),\n            );\n    }\n}\n","import {type DfConnectorData} from '../../../../../ng-draw-flow.interfaces';\nimport {getBezierEdgeCenter, getControlWithCurvature} from './helpers';\n\nexport function createBezierPath(\n    startConnector: DfConnectorData,\n    endConnector: DfConnectorData,\n    curvature = 0.25,\n): [path: string, labelX: number, labelY: number, offsetX: number, offsetY: number] {\n    const sourceControlPoint = getControlWithCurvature(\n        startConnector,\n        endConnector.point,\n        curvature,\n    );\n    const targetControlPoint = getControlWithCurvature(\n        endConnector,\n        startConnector.point,\n        curvature,\n    );\n    const [labelX, labelY, offsetX, offsetY] = getBezierEdgeCenter({\n        source: startConnector.point,\n        target: endConnector.point,\n        sourceControlPoint,\n        targetControlPoint,\n    });\n\n    return [\n        `M${startConnector.point.x},${startConnector.point.y} C${sourceControlPoint.x},${sourceControlPoint.y} ${targetControlPoint.x},${targetControlPoint.y} ${endConnector.point.x},${endConnector.point.y}`,\n        labelX,\n        labelY,\n        offsetX,\n        offsetY,\n    ];\n}\n","import {type DfPoint} from '../../../../../../ng-draw-flow.interfaces';\nimport {calculateDistance} from '../../../calculate-distance.util';\n\n/**\n * Builds an SVG path segment describing a rounded bend that smoothly joins\n * the straight legs coming **into** and **out of** the waypoint **cornerPoint**.\n *\n * @param startPoint  point before the bend\n * @param cornerPoint the actual “corner” point\n * @param endPoint    point after the bend\n * @param maxRadius   upper bound for the smoothing radius\n */\n\nexport function bend(\n    startPoint: DfPoint,\n    cornerPoint: DfPoint,\n    endPoint: DfPoint,\n    maxRadius: number,\n): string {\n    // Choose the largest radius that “fits” both legs and does not exceed maxRadius\n    const bendRadius = Math.min(\n        calculateDistance(startPoint, cornerPoint) / 2,\n        calculateDistance(cornerPoint, endPoint) / 2,\n        maxRadius,\n    );\n\n    // If all three points lie on the same straight line, no rounding is needed\n    const isColinear =\n        (startPoint.x === cornerPoint.x && cornerPoint.x === endPoint.x) ||\n        (startPoint.y === cornerPoint.y && cornerPoint.y === endPoint.y);\n\n    if (isColinear) {\n        return `L${cornerPoint.x} ${cornerPoint.y}`; // simple straight-line segment\n    }\n\n    // Determine whether we are entering the corner horizontally */\n    const enteringHorizontally = startPoint.y === cornerPoint.y;\n\n    // horizontal → vertical turn\n    if (enteringHorizontally) {\n        const xDir = startPoint.x < endPoint.x ? -1 : 1; // step “back” along X\n        const yDir = startPoint.y < endPoint.y ? 1 : -1; // and “forward” along Y\n\n        return (\n            `L ${cornerPoint.x + bendRadius * xDir},${cornerPoint.y}` + // straight segment\n            `Q ${cornerPoint.x},${cornerPoint.y} ${cornerPoint.x},${cornerPoint.y + bendRadius * yDir}` // quarter-circle\n        );\n    }\n\n    // vertical → horizontal turn\n    const xDir = startPoint.x < endPoint.x ? 1 : -1; // “forward” along X\n    const yDir = startPoint.y < endPoint.y ? -1 : 1; // step “back” along Y\n\n    return (\n        `L ${cornerPoint.x},${cornerPoint.y + bendRadius * yDir}` + // straight segment\n        `Q ${cornerPoint.x},${cornerPoint.y} ${cornerPoint.x + bendRadius * xDir},${cornerPoint.y}` // quarter-circle\n    );\n}\n","import {\n    DfConnectorPosition,\n    type DfPoint,\n} from '../../../../../../ng-draw-flow.interfaces';\n\n/**\n * Returns a unit vector (±1 on one axis, 0 on the other)\n * representing the first axial step of the edge immediately\n * after it leaves the source connector.\n *\n * ─ If the connector is **Left** or **Right**, movement is along **X**.\n * ─ Otherwise (Top / Bottom), movement is along **Y**.\n *\n * @param source      coordinates of the source connector\n * @param sourcePos   side of the source node (Left | Right | Top | Bottom)\n * @param target      coordinates of the target connector (used for direction)\n */\nexport function getPrimaryDirection(\n    source: DfPoint,\n    sourcePos: DfConnectorPosition,\n    target: DfPoint,\n): DfPoint {\n    // Horizontal connectors → move along X\n    if (\n        sourcePos === DfConnectorPosition.Left ||\n        sourcePos === DfConnectorPosition.Right\n    ) {\n        return source.x < target.x ? {x: 1, y: 0} : {x: -1, y: 0};\n    }\n\n    // Vertical connectors → move along Y\n    return source.y < target.y ? {x: 0, y: 1} : {x: 0, y: -1};\n}\n","import {type DfPoint} from '../../../../../../ng-draw-flow.interfaces';\n\n/**\n * Computes the geometric center between two endpoints **and**\n * returns the half-length (offset) on each axis.\n *\n * Tuple structure:\n *   [centerX, centerY, offsetX, offsetY]\n *\n * These values are later used for label placement and\n * “long-edge” detection in the renderer.\n */\nexport function getSmoothStepEdgeCenter({\n    source,\n    target,\n}: {\n    source: DfPoint;\n    target: DfPoint;\n}): [number, number, number, number] {\n    // Half of the absolute distance on each axis (always positive)\n    const offsetX = Math.abs(source.x - target.x) / 2;\n    const offsetY = Math.abs(source.y - target.y) / 2;\n\n    // Add the offset to the smaller coordinate on each axis\n    const centerX = target.x < source.x ? target.x + offsetX : source.x + offsetX;\n    const centerY = target.y < source.y ? target.y + offsetY : source.y + offsetY;\n\n    return [centerX, centerY, offsetX, offsetY];\n}\n","import {DfConnectorPosition, type DfPoint} from '../../../../../ng-draw-flow.interfaces';\n\n/**\n * Minimum length (in px) of the first straight segment that leaves a connector.\n */\nexport const MIN_SEGMENT_LENGTH = 20;\n\n/**\n * Unit vectors that describe where a connection should leave a connector\n * depending on its declared position.\n */\nexport const CONNECTOR_DIRECTIONS: Record<DfConnectorPosition, DfPoint> = {\n    [DfConnectorPosition.Left]: {x: -1, y: 0},\n    [DfConnectorPosition.Right]: {x: 1, y: 0},\n    [DfConnectorPosition.Top]: {x: 0, y: -1},\n    [DfConnectorPosition.Bottom]: {x: 0, y: 1},\n};\n","import {\n    type DfConnectorPosition,\n    type DfPoint,\n} from '../../../../../../ng-draw-flow.interfaces';\nimport {getPrimaryDirection} from '../helpers/get-primary-direction';\nimport {getSmoothStepEdgeCenter} from '../helpers/smooth-step-edge-center';\nimport {CONNECTOR_DIRECTIONS, MIN_SEGMENT_LENGTH} from '../smooth-step.consts';\n\ninterface ComputePointsParams {\n    source: DfPoint;\n    sourcePos: DfConnectorPosition;\n    target: DfPoint;\n    targetPos: DfConnectorPosition;\n    offset?: number;\n    centerOverride?: Partial<DfPoint>;\n}\n\n/**\n * Returns all points that form the polyline **before** the bezier smoothing is\n * applied. Additionally returns the center of the longest straight segment –\n * handy for label placement.\n */\nexport function computeWaypoints(\n    pointsParams: ComputePointsParams,\n): [DfPoint[], number, number] {\n    /**\n     * Unpack input, apply fall-backs\n     */\n    const {\n        source,\n        sourcePos,\n        target,\n        targetPos,\n        offset = MIN_SEGMENT_LENGTH,\n        centerOverride = {},\n    } = pointsParams;\n\n    /**\n     * Compute the unit directions for each connector\n     */\n    const sourceDir = CONNECTOR_DIRECTIONS[sourcePos];\n    const targetDir = CONNECTOR_DIRECTIONS[targetPos];\n\n    /**\n     * Create “gap points” that leave a small offset straight out\n     * of each connector so the edge never starts/ends inside a node\n     */\n    const sourceGap: DfPoint = {\n        x: source.x + sourceDir.x * offset,\n        y: source.y + sourceDir.y * offset,\n    };\n    const targetGap: DfPoint = {\n        x: target.x + targetDir.x * offset,\n        y: target.y + targetDir.y * offset,\n    };\n\n    /**\n     * Decide whether the first long segment should run horizontally\n     * or vertically.  This is the “primary axis” chosen so that we\n     * head *towards* the target rather than backwards.\n     */\n    const firstStep = getPrimaryDirection(sourceGap, sourcePos, targetGap);\n    const primaryAxis = firstStep.x === 0 ? 'y' : 'x';\n    const axisSign = firstStep[primaryAxis]; //  +1 or -1\n\n    /**\n     * Fallback geometric center used for label placement\n     */\n    const [fallbackCX, fallbackCY] = getSmoothStepEdgeCenter({source, target});\n    let labelCenterX = centerOverride.x ?? fallbackCX;\n    let labelCenterY = centerOverride.y ?? fallbackCY;\n\n    /**\n     * Build the elbow(s) — the intermediate waypoints\n     */\n    let elbows: DfPoint[] = [];\n    const sourceOpposesTarget = sourceDir[primaryAxis] * targetDir[primaryAxis] === -1; // true for Left→Right, Top→Bottom\n\n    // Case A ─ Opposite sides\n    if (sourceOpposesTarget) {\n        const verticalSplit: DfPoint[] = [\n            {x: labelCenterX, y: sourceGap.y},\n            {x: labelCenterX, y: targetGap.y},\n        ];\n        const horizontalSplit: DfPoint[] = [\n            {x: sourceGap.x, y: labelCenterY},\n            {x: targetGap.x, y: labelCenterY},\n        ];\n\n        const keepDirection = sourceDir[primaryAxis] === axisSign;\n\n        if (primaryAxis === 'x') {\n            elbows = keepDirection ? verticalSplit : horizontalSplit;\n        } else {\n            elbows = keepDirection ? horizontalSplit : verticalSplit;\n        }\n    }\n    // Case B ─ Same / mixed\n    else {\n        const sourceToTarget = [{x: sourceGap.x, y: targetGap.y}];\n        const targetToSource = [{x: targetGap.x, y: sourceGap.y}];\n\n        if (primaryAxis === 'x') {\n            elbows = sourceDir.x === axisSign ? targetToSource : sourceToTarget;\n        } else {\n            elbows = sourceDir.y === axisSign ? sourceToTarget : targetToSource;\n        }\n\n        /** Detect & flip elbow to avoid overlap with the nodes */\n        if (sourcePos !== targetPos) {\n            const crossAxis = primaryAxis === 'x' ? 'y' : 'x';\n            const sameCardinal = sourceDir[primaryAxis] === targetDir[crossAxis];\n\n            const mustFlip =\n                (sourceDir[primaryAxis] === 1 &&\n                    ((!sameCardinal && sourceGap[crossAxis] > targetGap[crossAxis]) ||\n                        (sameCardinal &&\n                            sourceGap[crossAxis] <= targetGap[crossAxis]))) ||\n                (sourceDir[primaryAxis] === -1 &&\n                    ((!sameCardinal && sourceGap[crossAxis] < targetGap[crossAxis]) ||\n                        (sameCardinal && sourceGap[crossAxis] >= targetGap[crossAxis])));\n\n            if (mustFlip) {\n                elbows = primaryAxis === 'x' ? sourceToTarget : targetToSource;\n            }\n        }\n\n        /** Re-compute label center so it sits on the longest straight leg */\n        const longestX = Math.max(\n            Math.abs(sourceGap.x - elbows[0]!.x),\n            Math.abs(targetGap.x - elbows[0]!.x),\n        );\n        const longestY = Math.max(\n            Math.abs(sourceGap.y - elbows[0]!.y),\n            Math.abs(targetGap.y - elbows[0]!.y),\n        );\n\n        if (longestX >= longestY) {\n            labelCenterX = (sourceGap.x + targetGap.x) / 2;\n            labelCenterY = elbows[0]!.y;\n        } else {\n            labelCenterX = elbows[0]!.x;\n            labelCenterY = (sourceGap.y + targetGap.y) / 2;\n        }\n    }\n\n    /**\n     * Assemble the full polyline: connector-center ➜ gap ➜ elbows\n     */\n    const polyline = [\n        source, // 0. start at connector center\n        sourceGap, // 1. leave the node\n        ...elbows, // 2. one or two elbows\n        targetGap, // 3. enter the target node\n        target, // 4. finish at connector center\n    ];\n\n    /**\n     * Return: [polyline points, labelCenterX, labelCenterY]\n     */\n    return [polyline, labelCenterX, labelCenterY];\n}\n","import {\n    type DfConnectorData,\n    DfConnectorPosition,\n    type DfPoint,\n} from '../../../../../ng-draw-flow.interfaces';\nimport {bend} from './path-parts/bend';\nimport {computeWaypoints} from './path-parts/waypoints';\n\n/**\n * Draws a smooth-step SVG path between two connectors.\n *\n * @param startConnector   Data for the start connector.\n * @param endConnector     Data for the end connector.\n * @param radius           Radius of each bend (in pixels).\n * @returns                A tuple with an SVG `d` attribute and label coordinates.\n */\nexport function createSmoothStepPath(\n    startConnector: DfConnectorData,\n    endConnector: DfConnectorData,\n    radius = 5,\n): [path: string, labelX: number, labelY: number] {\n    // Default to Bottom/Top when the position is null (e.g. while a draft edge is dragged).\n    const sourcePos = startConnector.position ?? DfConnectorPosition.Bottom;\n    const targetPos = endConnector.position ?? DfConnectorPosition.Top;\n\n    const [polyline, labelX, labelY] = computeWaypoints({\n        source: startConnector.point,\n        sourcePos,\n        target: endConnector.point,\n        targetPos,\n    });\n\n    /** Convert the polyline to an SVG path (M, L, Q commands). */\n    const path = polyline.reduce<string>(\n        (computedPath: string, point: DfPoint, pathStepIndex: number, arr: DfPoint[]) => {\n            /* a) First point — use `M` (move-to). */\n            if (pathStepIndex === 0) {\n                return `M${point.x} ${point.y}`;\n            }\n\n            /* b) Last point — straight segment `L`. */\n            if (pathStepIndex === arr.length - 1) {\n                return `${computedPath}L${point.x} ${point.y}`;\n            }\n\n            /* c) Intermediate waypoint — insert a rounded bend (`L` + `Q`). */\n            return `${computedPath}${bend(arr[pathStepIndex - 1]!, point, arr[pathStepIndex + 1]!, radius)}`;\n        },\n        '',\n    );\n\n    return [path, labelX, labelY]; // ready-made `d` attribute for <path>\n}\n","import {\n    ChangeDetectionStrategy,\n    Component,\n    computed,\n    inject,\n    input,\n    output,\n    type OutputEmitterRef,\n    type Signal,\n} from '@angular/core';\nimport {toObservable, toSignal} from '@angular/core/rxjs-interop';\nimport {PolymorpheusOutlet} from '@taiga-ui/polymorpheus';\nimport {\n    animationFrameScheduler,\n    concat,\n    delay,\n    distinctUntilChanged,\n    observeOn,\n    of,\n    skip,\n    startWith,\n    switchMap,\n} from 'rxjs';\n\nimport {SelectableElementDirective} from '../../../directives';\nimport {createConnectorHash} from '../../../helpers';\nimport {isEditorKeyboardEvent} from '../../../helpers/editor-keyboard-event';\nimport {DRAW_FLOW_OPTIONS} from '../../../ng-draw-flow.configs';\nimport {\n    DfArrowhead,\n    DfConnectionType,\n    type DfConnectorData,\n    type DfDataConnection,\n    type DfDataConnector,\n    type DfOptions,\n} from '../../../ng-draw-flow.interfaces';\nimport {DRAW_FLOW_ROOT_ELEMENT} from '../../../ng-draw-flow.token';\nimport {CoordinatesService} from '../../../services/coordinates.service';\nimport {DfInteractionStateService} from '../../../services/interaction-state.service';\nimport {NgDrawFlowStoreService} from '../../../services/ng-draw-flow-store.service';\nimport {ConnectionsService} from '../connections.service';\nimport {createBezierPath, createSmoothStepPath} from '../utils';\n\n@Component({\n    standalone: true,\n    selector: 'df-connection',\n    imports: [PolymorpheusOutlet, SelectableElementDirective],\n    templateUrl: './connection.component.svg',\n    styleUrl: '../connection.component.less',\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    host: {\n        '[class.df-selected-node-input]': 'this.selectedNodeInput()',\n        '[class.df-selected-node-output]': 'this.selectedNodeOutput()',\n        '(document:keydown.backspace)': 'this.handleKeyboardEvent($event)',\n        '(document:keydown.delete)': 'this.handleKeyboardEvent($event)',\n    },\n})\nexport class ConnectionComponent {\n    private readonly drawFlowElement = inject<HTMLElement>(DRAW_FLOW_ROOT_ELEMENT);\n    private readonly connectionsService = inject(ConnectionsService);\n    private readonly coordinatesService = inject(CoordinatesService);\n    private readonly store = inject(NgDrawFlowStoreService);\n    private readonly options = inject<DfOptions>(DRAW_FLOW_OPTIONS);\n    private readonly interactionState = inject(DfInteractionStateService, {\n        optional: true,\n    });\n\n    private readonly arrowhead = this.options.connection.arrowhead;\n    private readonly arrowWidth = this.arrowhead.width;\n    private readonly arrowHeight = this.arrowhead.height;\n    private readonly pathWithLabel: Signal<{\n        path: string;\n        labelX: number;\n        labelY: number;\n    }> = computed(() => {\n        const sourcePoint = this.getConnectionPoint(this.connection.source)();\n        const targetPoint = this.getConnectionPoint(this.connection.target)();\n\n        if (!sourcePoint || !targetPoint) {\n            return {path: '', labelX: 0, labelY: 0};\n        }\n\n        switch (this.options.connection.type) {\n            case DfConnectionType.SmoothStep: {\n                const [path, labelX, labelY] = createSmoothStepPath(\n                    sourcePoint,\n                    targetPoint,\n                    this.options.connection.curvature,\n                );\n\n                return {path, labelX, labelY};\n            }\n            case DfConnectionType.Bezier:\n            default: {\n                const curvature = this.options.connection.curvature;\n                const [path, labelX, labelY] = createBezierPath(\n                    sourcePoint,\n                    targetPoint,\n                    curvature,\n                );\n\n                return {path, labelX, labelY};\n            }\n        }\n    });\n\n    protected selected = false;\n    protected readonly arrowMarkerWidth = this.arrowWidth + this.arrowHeight;\n    protected readonly arrowMarkerHeight = this.arrowHeight * 2;\n    protected readonly arrowViewBox = `-${this.arrowMarkerWidth} -${this.arrowMarkerHeight / 2} ${this.arrowMarkerWidth} ${this.arrowMarkerHeight}`;\n    protected readonly arrowPoints = `-${this.arrowWidth},-${this.arrowHeight / 2} 0,0 -${this.arrowWidth},${this.arrowHeight / 2}`;\n    protected readonly arrowClosedPoints = `${this.arrowPoints} -${this.arrowWidth},-${this.arrowHeight / 2}`;\n\n    protected readonly markerEnd =\n        this.arrowhead.type === DfArrowhead.None\n            ? null\n            : `url(#df-arrowhead-${this.arrowhead.type})`;\n\n    protected readonly path = computed(() => this.pathWithLabel().path);\n\n    protected readonly labelPosition = computed(() => {\n        const {labelX, labelY} = this.pathWithLabel();\n\n        return {x: labelX, y: labelY};\n    });\n\n    protected readonly optimization = toSignal(\n        toObservable(this.path).pipe(\n            observeOn(animationFrameScheduler),\n            skip(1),\n            distinctUntilChanged(),\n            switchMap(() => concat(of(true), of(false).pipe(delay(400)))),\n            startWith(false),\n        ),\n        {initialValue: false},\n    );\n\n    protected readonly selectedNodeInput = computed(\n        () => this.connection.target.nodeId === this.connectionsService.selectedNodeId(),\n    );\n\n    protected readonly selectedNodeOutput = computed(\n        () => this.connection.source.nodeId === this.connectionsService.selectedNodeId(),\n    );\n\n    public readonly connectionDeleted: OutputEmitterRef<void> = output();\n    public readonly connectionSelected: OutputEmitterRef<void> = output();\n    public readonly connectionInput = input.required<DfDataConnection>({\n        alias: 'connection',\n    });\n\n    public get connection(): DfDataConnection {\n        return this.connectionInput();\n    }\n\n    public get deletable(): boolean {\n        return (\n            this.interactionState?.connectionsDeletable() ??\n            this.options.options.connectionsDeletable\n        );\n    }\n\n    protected handleKeyboardEvent(event: KeyboardEvent): void {\n        if (\n            !this.selected ||\n            !this.deletable ||\n            !isEditorKeyboardEvent(event, this.drawFlowElement)\n        ) {\n            return;\n        }\n\n        event.preventDefault();\n\n        this.store.clearSelectedConnection(this.connection);\n        this.connectionsService.removeConnection(this.connection);\n        this.connectionDeleted.emit();\n    }\n\n    protected onSelectedChanged(selected: boolean): void {\n        this.selected = selected;\n\n        if (selected) {\n            this.store.emitConnectionSelected(this.connection);\n            this.connectionSelected.emit();\n        } else {\n            this.store.clearSelectedConnection(this.connection);\n        }\n    }\n\n    private getConnectionPoint(\n        connector: DfDataConnector,\n    ): Signal<DfConnectorData | null> {\n        return this.coordinatesService.getConnectionPointSignal(\n            createConnectorHash(connector),\n        );\n    }\n}\n","<svg\n    class=\"connection\"\n    width=\"1\"\n    height=\"1\"\n    overflow=\"visible\"\n    preserveAspectRatio=\"none\"\n    [class.optimize-speed]=\"optimization()\"\n>\n    <!-- Marker start-->\n    <defs>\n        <marker\n            id=\"df-arrowhead-arrowClosed\"\n            [attr.viewBox]=\"arrowViewBox\"\n            refX=\"0\"\n            refY=\"0\"\n            [attr.markerWidth]=\"arrowMarkerWidth\"\n            [attr.markerHeight]=\"arrowMarkerHeight\"\n            orient=\"auto-start-reverse\"\n            markerUnits=\"strokeWidth\"\n        >\n            <polyline\n                [attr.points]=\"arrowClosedPoints\"\n                stroke-linecap=\"round\"\n                stroke-linejoin=\"round\"\n                fill=\"context-stroke\"\n                stroke=\"context-stroke\"\n            />\n        </marker>\n        <marker\n            id=\"df-arrowhead-arrow\"\n            [attr.viewBox]=\"arrowViewBox\"\n            refX=\"0\"\n            refY=\"0\"\n            [attr.markerWidth]=\"arrowMarkerWidth\"\n            [attr.markerHeight]=\"arrowMarkerHeight\"\n            orient=\"auto-start-reverse\"\n            markerUnits=\"strokeWidth\"\n        >\n            <polyline\n                [attr.points]=\"arrowPoints\"\n                stroke-linecap=\"round\"\n                stroke-linejoin=\"round\"\n                fill=\"none\"\n                stroke=\"context-stroke\"\n            />\n        </marker>\n    </defs>\n    <!-- Marker end-->\n\n    <!-- Connection line start-->\n    <path class=\"selectable-area\" [attr.d]=\"path()\" (dfSelectableElement)=\"onSelectedChanged($event)\" />\n    <path class=\"main-path\" [attr.d]=\"path()\" [class.df-selected]=\"selected\" [attr.marker-end]=\"markerEnd\" />\n    <!-- Connection line start-->\n\n    <!-- Label start -->\n    @if (connection.label) {\n    <foreignObject class=\"label-container\" width=\"1\" height=\"1\" overflow=\"visible\">\n        <div\n            xmlns=\"http://www.w3.org/1999/xhtml\"\n            class=\"label\"\n            [style.left.px]=\"labelPosition().x\"\n            [style.top.px]=\"labelPosition().y\"\n        >\n            <ng-container *polymorpheusOutlet=\"connection.label.content as label; context: connection.label.context\">\n                {{ label }}\n            </ng-container>\n        </div>\n    </foreignObject>\n    }\n    <!-- Label end -->\n</svg>\n","import {\n    ChangeDetectionStrategy,\n    Component,\n    computed,\n    inject,\n    type OutputRef,\n    type Signal,\n} from '@angular/core';\nimport {outputFromObservable} from '@angular/core/rxjs-interop';\n\nimport {DRAW_FLOW_OPTIONS} from '../../../ng-draw-flow.configs';\nimport {\n    DfConnectionType,\n    type DfDataConnection,\n    type DfOptions,\n} from '../../../ng-draw-flow.interfaces';\nimport {createBezierPath, createSmoothStepPath} from '../utils';\nimport {DraftConnectionService} from './draft-connection.service';\n\n@Component({\n    standalone: true,\n    selector: 'df-draft-connection',\n    templateUrl: './draft-connection.component.svg',\n    styleUrl: '../connection.component.less',\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DraftConnectionComponent {\n    private readonly draftConnectionService = inject(DraftConnectionService);\n    private readonly options: DfOptions = inject(DRAW_FLOW_OPTIONS);\n\n    protected readonly connectionCreated: OutputRef<DfDataConnection> =\n        outputFromObservable(this.draftConnectionService.connectionCreated$);\n\n    protected pathData: Signal<string> = computed(() => {\n        const sourcePoint = this.draftConnectionService.source();\n        const targetPoint = this.draftConnectionService.target();\n        const curvature = this.options.connection.curvature;\n\n        switch (this.options.connection.type) {\n            case DfConnectionType.SmoothStep: {\n                const [path] = createSmoothStepPath(sourcePoint, targetPoint, curvature);\n\n                return path;\n            }\n            case DfConnectionType.Bezier:\n            default: {\n                const [path] = createBezierPath(sourcePoint, targetPoint, curvature);\n\n                return path;\n            }\n        }\n    });\n}\n","<svg class=\"connection draft-connection\" width=\"1\" height=\"1\" overflow=\"visible\" preserveAspectRatio=\"none\">\n    <path class=\"main-path\" [attr.d]=\"pathData()\" />\n</svg>\n","import {Injectable, InjectionToken, signal} from '@angular/core';\n\nimport {type DfId, type DfNodeSize} from '../ng-draw-flow.interfaces';\n\n@Injectable()\nexport class DfNodeSizeRegistryService {\n    private readonly sizesSignal = signal<ReadonlyMap<DfId, DfNodeSize>>(new Map());\n\n    public readonly sizes = this.sizesSignal.asReadonly();\n\n    public set(nodeId: DfId, size: DfNodeSize): void {\n        if (!this.isValid(size)) {\n            return;\n        }\n\n        const current = this.sizesSignal();\n        const previous = current.get(nodeId);\n\n        if (previous?.width === size.width && previous.height === size.height) {\n            return;\n        }\n\n        this.sizesSignal.set(new Map(current).set(nodeId, {...size}));\n    }\n\n    public remove(nodeId: DfId): void {\n        const current = this.sizesSignal();\n\n        if (!current.has(nodeId)) {\n            return;\n        }\n\n        const next = new Map(current);\n\n        next.delete(nodeId);\n        this.sizesSignal.set(next);\n    }\n\n    private isValid(size: DfNodeSize): boolean {\n        return (\n            Number.isFinite(size.width) &&\n            Number.isFinite(size.height) &&\n            size.width > 0 &&\n            size.height > 0\n        );\n    }\n}\n\nexport const DF_NODE_SIZE_REGISTRY = new InjectionToken<DfNodeSizeRegistryService | null>(\n    '[DF_NODE_SIZE_REGISTRY]: Optional measured node-size registry',\n    {factory: () => null},\n);\n","import {\n    type DestroyRef,\n    effect,\n    type EnvironmentInjector,\n    type Signal,\n    untracked,\n} from '@angular/core';\nimport {takeUntilDestroyed} from '@angular/core/rxjs-interop';\nimport {map, merge, Observable, type Subscription, tap} from 'rxjs';\n\nimport {type DfDragDropDistance} from '../../directives';\nimport {createConnectorHash} from '../../helpers';\nimport {\n    DfConnectionPoint,\n    type DfDataNode,\n    type DfPoint,\n} from '../../ng-draw-flow.interfaces';\nimport {type CoordinatesService} from '../../services/coordinates.service';\nimport {type DfInputComponent, type DfOutputComponent} from '../connectors';\nimport {type DfNodeContentRenderer} from './node-content.renderer';\n\nexport interface DfNodeConnectorsControllerOptions {\n    readonly coordinatesService: CoordinatesService;\n    readonly destroyRef: DestroyRef;\n    readonly environmentInjector: EnvironmentInjector;\n    readonly getCenteredPosition: (node: DfDataNode) => DfPoint;\n    readonly getNode: () => DfDataNode;\n    readonly getNodeContentRenderer: () => DfNodeContentRenderer;\n    readonly getZoom: () => number;\n    readonly onConnectorDeleted: (connectorId: string) => void;\n}\n\nexport class NodeConnectorsController {\n    private readonly coordinateKeys = new Set<string>();\n    private previousInputs: DfInputComponent[] = [];\n    private previousOutputs: DfOutputComponent[] = [];\n    private connectorUpdatesSubscription: Subscription | null = null;\n\n    constructor(private readonly options: DfNodeConnectorsControllerOptions) {}\n\n    public updateCoordinates(): void {\n        const node = this.options.getNode();\n        const centeredCoordinates = this.options.getCenteredPosition(node);\n\n        this.updateCoordinatesAt(centeredCoordinates, node.id);\n    }\n\n    public updateCoordinatesAt(centeredCoordinates: DfPoint, nodeId: string): void {\n        const nodeContentRenderer = this.options.getNodeContentRenderer();\n\n        nodeContentRenderer.inputConnectors().forEach((input: DfInputComponent) => {\n            this.updateConnectorCoordinates(\n                centeredCoordinates,\n                nodeId,\n                input,\n                DfConnectionPoint.Input,\n            );\n        });\n\n        nodeContentRenderer.outputConnectors().forEach((output: DfOutputComponent) => {\n            this.updateConnectorCoordinates(\n                centeredCoordinates,\n                nodeId,\n                output,\n                DfConnectionPoint.Output,\n            );\n        });\n    }\n\n    public recalculatePositions(distance: DfDragDropDistance, zoom: number): void {\n        this.translateCoordinates({\n            deltaX: distance.deltaX / zoom,\n            deltaY: distance.deltaY / zoom,\n        });\n    }\n\n    public translateCoordinates(distance: DfDragDropDistance): void {\n        const nodeContentRenderer = this.options.getNodeContentRenderer();\n\n        nodeContentRenderer.inputConnectors().forEach((input: DfInputComponent) => {\n            this.recalculateConnectorPositionFromLast(\n                distance,\n                input,\n                DfConnectionPoint.Input,\n            );\n        });\n\n        nodeContentRenderer.outputConnectors().forEach((output: DfOutputComponent) => {\n            this.recalculateConnectorPositionFromLast(\n                distance,\n                output,\n                DfConnectionPoint.Output,\n            );\n        });\n    }\n\n    public watch(): void {\n        const nodeContentRenderer = this.options.getNodeContentRenderer();\n\n        this.disconnect();\n        this.previousOutputs = [...nodeContentRenderer.outputConnectors()];\n        this.previousInputs = [...nodeContentRenderer.inputConnectors()];\n\n        const connectorsUpdates$ = this.collectConnectorUpdateSources(\n            nodeContentRenderer,\n            () => this.applyOutputsConnectionLabel(),\n        );\n\n        if (!connectorsUpdates$.length) {\n            return;\n        }\n\n        this.connectorUpdatesSubscription = merge(...connectorsUpdates$)\n            .pipe(takeUntilDestroyed(this.options.destroyRef))\n            .subscribe(() => this.updateCoordinates());\n    }\n\n    public disconnect(): void {\n        this.connectorUpdatesSubscription?.unsubscribe();\n        this.connectorUpdatesSubscription = null;\n        this.coordinateKeys.forEach((key) =>\n            this.options.coordinatesService.removeConnectionPoint(key),\n        );\n        this.coordinateKeys.clear();\n        this.previousInputs = [];\n        this.previousOutputs = [];\n    }\n\n    public applyOutputsConnectionLabel(): void {\n        const node = this.options.getNode();\n        const connectionLabel = node.data.connectionLabel;\n\n        this.options.getNodeContentRenderer().applyConnectionLabel(connectionLabel);\n    }\n\n    private recalculateConnectorPositionFromLast(\n        distance: DfDragDropDistance,\n        connector: DfInputComponent | DfOutputComponent,\n        connectorType: DfConnectionPoint,\n    ): void {\n        const newConnectorPosition = {\n            x: (connector.coordinates?.x ?? 0) + distance.deltaX,\n            y: (connector.coordinates?.y ?? 0) + distance.deltaY,\n        };\n\n        const connectorData = createConnectorHash({\n            nodeId: connector.data.nodeId,\n            connectorType,\n            connectorId: connector.data.connectorId,\n        });\n\n        connector.coordinates = newConnectorPosition;\n        this.coordinateKeys.add(connectorData);\n\n        this.options.coordinatesService.addConnectionPoint(\n            connectorData,\n            newConnectorPosition,\n            connector.position,\n        );\n    }\n\n    private updateConnectorCoordinates(\n        position: DfPoint,\n        nodeId: string,\n        connector: DfInputComponent | DfOutputComponent,\n        connectorType: DfConnectionPoint,\n    ): void {\n        const calculatedConnectorPosition = this.calculateConnectorPosition(\n            connector.nativeElement,\n            position,\n        );\n\n        connector.coordinates = calculatedConnectorPosition;\n\n        const connectorData = createConnectorHash({\n            nodeId,\n            connectorType,\n            connectorId: connector.nativeElement.dataset.connectorId,\n        });\n\n        this.coordinateKeys.add(connectorData);\n\n        this.options.coordinatesService.addConnectionPoint(\n            connectorData,\n            calculatedConnectorPosition,\n            connector.position,\n        );\n    }\n\n    private calculateConnectorPosition(\n        element: HTMLElement,\n        nodePosition: DfPoint,\n    ): DfPoint {\n        const nodeElement = element.closest<HTMLElement>('[data-draw-flow-node]');\n\n        if (!nodeElement) {\n            return {\n                x: nodePosition.x + element.offsetLeft + element.clientWidth / 2,\n                y: nodePosition.y + element.offsetTop + element.clientHeight / 2,\n            };\n        }\n\n        // Layout offsets ignore transforms commonly used to center connector hosts.\n        const connectorRect = element.getBoundingClientRect();\n        const nodeRect = nodeElement.getBoundingClientRect();\n        const currentZoom = this.options.getZoom();\n        const zoom = currentZoom > 0 ? currentZoom : 1;\n\n        return {\n            x:\n                nodePosition.x +\n                (connectorRect.left + connectorRect.width / 2 - nodeRect.left) / zoom,\n            y:\n                nodePosition.y +\n                (connectorRect.top + connectorRect.height / 2 - nodeRect.top) / zoom,\n        };\n    }\n\n    private collectConnectorUpdateSources(\n        nodeContentRenderer: DfNodeContentRenderer,\n        onOutputsChanged: () => void,\n    ): Array<Observable<void>> {\n        const sources: Array<Observable<void>> = [];\n\n        this.addContentRendererUpdates(sources, nodeContentRenderer);\n        this.addInputsUpdates(sources, nodeContentRenderer);\n        this.addOutputsUpdates(sources, nodeContentRenderer, onOutputsChanged);\n\n        return sources;\n    }\n\n    private addContentRendererUpdates(\n        sources: Array<Observable<void>>,\n        nodeContentRenderer: DfNodeContentRenderer,\n    ): void {\n        sources.push(nodeContentRenderer.connectorUpdates$);\n    }\n\n    private addInputsUpdates(\n        sources: Array<Observable<void>>,\n        nodeContentRenderer: DfNodeContentRenderer,\n    ): void {\n        sources.push(\n            this.observeConnectors(nodeContentRenderer.inputConnectors).pipe(\n                tap((currentInputs: readonly DfInputComponent[]) => {\n                    this.handleRemovedInputs(currentInputs);\n                }),\n                map(() => undefined),\n            ),\n        );\n    }\n\n    private addOutputsUpdates(\n        sources: Array<Observable<void>>,\n        nodeContentRenderer: DfNodeContentRenderer,\n        onOutputsChanged: () => void,\n    ): void {\n        sources.push(\n            this.observeConnectors(nodeContentRenderer.outputConnectors).pipe(\n                tap((currentOutputs: readonly DfOutputComponent[]) => {\n                    this.handleRemovedOutputs(currentOutputs);\n                    onOutputsChanged();\n                }),\n                map(() => undefined),\n            ),\n        );\n    }\n\n    private observeConnectors<T>(connectors: Signal<T>): Observable<T> {\n        return new Observable((subscriber) => {\n            const watcher = effect(\n                () => {\n                    const value = connectors();\n\n                    untracked(() => subscriber.next(value));\n                },\n                {injector: this.options.environmentInjector, manualCleanup: true},\n            );\n\n            return () => watcher.destroy();\n        });\n    }\n\n    private handleRemovedInputs(currentArray: readonly DfInputComponent[]): void {\n        const removedInputs = this.previousInputs.filter(\n            (prev) => !currentArray.some((curr) => curr === prev),\n        );\n\n        if (removedInputs.length > 0) {\n            removedInputs.forEach((input: DfInputComponent) => {\n                this.removeCoordinates(input, DfConnectionPoint.Input);\n                this.options.onConnectorDeleted(input.data.connectorId);\n            });\n        }\n\n        this.previousInputs = [...currentArray];\n    }\n\n    private handleRemovedOutputs(currentArray: readonly DfOutputComponent[]): void {\n        const removedOutputs = this.previousOutputs.filter(\n            (prev) => !currentArray.some((curr) => curr === prev),\n        );\n\n        if (removedOutputs.length > 0) {\n            removedOutputs.forEach((output: DfOutputComponent) => {\n                this.removeCoordinates(output, DfConnectionPoint.Output);\n                this.options.onConnectorDeleted(output.data.connectorId);\n            });\n        }\n\n        this.previousOutputs = [...currentArray];\n    }\n\n    private removeCoordinates(\n        connector: DfInputComponent | DfOutputComponent,\n        connectorType: DfConnectionPoint,\n    ): void {\n        const key = createConnectorHash({...connector.data, connectorType});\n\n        this.coordinateKeys.delete(key);\n        this.options.coordinatesService.removeConnectionPoint(key);\n    }\n}\n","import {\n    type ComponentRef,\n    type EnvironmentInjector,\n    type Signal,\n    type Type,\n    type ViewContainerRef,\n} from '@angular/core';\nimport {outputToObservable} from '@angular/core/rxjs-interop';\nimport {type Observable} from 'rxjs';\n\nimport {type DfConnectionLabel} from '../../ng-draw-flow.interfaces';\nimport {type DrawFlowBaseNode} from '../../ng-draw-flow-node.base';\nimport {type DfInputComponent, type DfOutputComponent} from '../connectors';\n\nexport interface DfNodeContentInputs {\n    readonly nodeId: string;\n    readonly startNode: boolean;\n    readonly endNode: boolean;\n    readonly model: Record<string, any> & {type: string};\n    readonly selected: boolean;\n    readonly invalid: boolean;\n    readonly disabled: boolean;\n    readonly readonly: boolean;\n}\n\nexport interface DfNodeContentRenderer {\n    readonly nativeElement: HTMLElement;\n    readonly invalid: boolean;\n    readonly inputConnectors: Signal<readonly DfInputComponent[]>;\n    readonly outputConnectors: Signal<readonly DfOutputComponent[]>;\n    readonly connectorUpdates$: Observable<void>;\n\n    syncInputs(inputs: DfNodeContentInputs): void;\n    applyConnectionLabel(label: DfConnectionLabel | undefined): void;\n}\n\nclass ComponentNodeContentRenderer implements DfNodeContentRenderer {\n    public readonly inputConnectors = this.componentRef.instance.inputs;\n    public readonly outputConnectors = this.componentRef.instance.outputs;\n    public readonly connectorUpdates$ = outputToObservable(\n        this.componentRef.instance.connectorsUpdated,\n    );\n\n    constructor(private readonly componentRef: ComponentRef<DrawFlowBaseNode>) {}\n\n    public get nativeElement(): HTMLElement {\n        return this.componentRef.location.nativeElement;\n    }\n\n    public get invalid(): boolean {\n        return this.componentRef.instance.invalid;\n    }\n\n    public syncInputs(inputs: DfNodeContentInputs): void {\n        this.componentRef.setInput('nodeId', inputs.nodeId);\n        this.componentRef.setInput('startNode', inputs.startNode);\n        this.componentRef.setInput('endNode', inputs.endNode);\n        this.componentRef.setInput('model', inputs.model);\n        this.componentRef.setInput('selected', inputs.selected);\n        this.componentRef.setInput('invalid', inputs.invalid);\n        this.componentRef.setInput('disabled', inputs.disabled);\n        this.componentRef.setInput('readonly', inputs.readonly);\n    }\n\n    public applyConnectionLabel(label: DfConnectionLabel | undefined): void {\n        this.outputConnectors().forEach((output: DfOutputComponent) => {\n            output.setConnectionLabel(label);\n        });\n    }\n}\n\nexport function createComponentNodeContentRenderer(\n    containerRef: ViewContainerRef,\n    componentType: Type<DrawFlowBaseNode>,\n    environmentInjector: EnvironmentInjector,\n): DfNodeContentRenderer {\n    const componentRef = containerRef.createComponent(componentType, {\n        environmentInjector,\n    });\n\n    return new ComponentNodeContentRenderer(componentRef);\n}\n","import {\n    type EnvironmentInjector,\n    signal,\n    type Type,\n    type ViewContainerRef,\n} from '@angular/core';\n\nimport {type DrawFlowBaseNode} from '../../ng-draw-flow-node.base';\nimport {\n    createComponentNodeContentRenderer,\n    type DfNodeContentInputs,\n    type DfNodeContentRenderer,\n} from './node-content.renderer';\n\nexport class NodeContentHost {\n    private readonly rendererSignal = signal<DfNodeContentRenderer | null>(null);\n\n    public readonly renderer = this.rendererSignal.asReadonly();\n\n    constructor(private readonly environmentInjector: EnvironmentInjector) {}\n\n    public renderComponent(\n        containerRef: ViewContainerRef,\n        componentType: Type<DrawFlowBaseNode>,\n    ): DfNodeContentRenderer {\n        this.clear(containerRef);\n\n        const renderer = createComponentNodeContentRenderer(\n            containerRef,\n            componentType,\n            this.environmentInjector,\n        );\n\n        this.rendererSignal.set(renderer);\n\n        return renderer;\n    }\n\n    public clear(containerRef: ViewContainerRef): void {\n        containerRef.clear();\n        this.rendererSignal.set(null);\n    }\n\n    public syncInputs(inputs: DfNodeContentInputs): void {\n        this.rendererSignal()?.syncInputs(inputs);\n    }\n\n    public nativeElement(): HTMLElement | null {\n        return this.rendererSignal()?.nativeElement ?? null;\n    }\n}\n","import {\n    type DfDataInitialNode,\n    type DfDataNode,\n    type DfNodeSize,\n    type DfPoint,\n} from '../../ng-draw-flow.interfaces';\nimport {getViewportZeroPoint} from '../pan-zoom/pan-zoom.camera.math';\nimport {type DfPanZoomOptions} from '../pan-zoom/pan-zoom.options';\nimport {type PanZoomService} from '../pan-zoom/pan-zoom.service';\n\nexport interface DfNodeGeometryControllerOptions {\n    readonly drawFlowElement: HTMLElement;\n    readonly panZoomOptions: DfPanZoomOptions;\n    readonly panZoomService: PanZoomService;\n}\n\nexport class NodeGeometryController {\n    private nodeWidth = 0;\n    private nodeHeight = 0;\n    private resizeObserver: ResizeObserver | null = null;\n\n    constructor(private readonly options: DfNodeGeometryControllerOptions) {}\n\n    public resolveNode(node: DfDataInitialNode | DfDataNode): DfDataNode {\n        if (this.hasPosition(node)) {\n            return {\n                ...node,\n                position: {...node.position},\n            };\n        }\n\n        return {\n            ...node,\n            position: this.getCenterOfViewport(),\n        };\n    }\n\n    public resolveUpdatedNode(\n        node: DfDataInitialNode | DfDataNode,\n        currentNode: DfDataNode,\n    ): DfDataNode {\n        if (this.hasPosition(node)) {\n            return {\n                ...node,\n                position: {...node.position},\n            };\n        }\n\n        if (node.id === currentNode.id) {\n            return {\n                ...node,\n                position: currentNode.position,\n            };\n        }\n\n        return this.resolveNode(node);\n    }\n\n    public hasPositionChanged(\n        previousNode: DfDataNode,\n        currentNode: DfDataNode,\n    ): boolean {\n        return (\n            previousNode.position.x !== currentNode.position.x ||\n            previousNode.position.y !== currentNode.position.y\n        );\n    }\n\n    public measureContent(nativeElement: HTMLElement | null): void {\n        if (!nativeElement) {\n            return;\n        }\n\n        this.nodeWidth = nativeElement.offsetWidth;\n        this.nodeHeight = nativeElement.offsetHeight;\n    }\n\n    public measureElement(nativeElement: HTMLElement): DfNodeSize {\n        return {\n            width: nativeElement.offsetWidth,\n            height: nativeElement.offsetHeight,\n        };\n    }\n\n    public getCenteredPosition(node: DfDataNode): DfPoint {\n        return this.getCenteredPoint(node.position);\n    }\n\n    public getCenteredPoint(position: DfPoint): DfPoint {\n        const halfOfNodeWidth = this.nodeWidth / 2;\n        const halfOfNodeHeight = this.nodeHeight / 2;\n\n        return {\n            x: position.x - halfOfNodeWidth,\n            y: position.y - halfOfNodeHeight,\n        };\n    }\n\n    public applyPositionToStyle(\n        nativeElement: HTMLElement,\n        position: DfPoint,\n        dynamic: boolean,\n    ): void {\n        nativeElement.style.transform = dynamic\n            ? `translate3D(${position.x}px, ${position.y}px, 0)`\n            : `translate(${position.x}px, ${position.y}px)`;\n    }\n\n    public syncWorkspaceGeometry(node: DfDataNode): void {\n        this.syncWorkspaceGeometryAt(node.id, node.position);\n    }\n\n    public syncWorkspaceGeometryAt(nodeId: string, position: DfPoint): void {\n        const halfOfNodeWidth = this.nodeWidth / 2;\n        const halfOfNodeHeight = this.nodeHeight / 2;\n\n        this.options.panZoomService.upsertNodeBounds(nodeId, {\n            minX: position.x - halfOfNodeWidth,\n            minY: position.y - halfOfNodeHeight,\n            maxX: position.x + halfOfNodeWidth,\n            maxY: position.y + halfOfNodeHeight,\n        });\n    }\n\n    public removeWorkspaceGeometry(nodeId: string): void {\n        this.options.panZoomService.removeNodeBounds(nodeId);\n    }\n\n    public observeNodeSize(nativeElement: HTMLElement, onResize: () => void): void {\n        if (typeof ResizeObserver !== 'function') {\n            return;\n        }\n\n        this.resizeObserver = new ResizeObserver(onResize);\n        this.resizeObserver.observe(nativeElement);\n    }\n\n    public disconnect(): void {\n        this.resizeObserver?.disconnect();\n        this.resizeObserver = null;\n    }\n\n    public getCenterOfViewport(): DfPoint {\n        const {x: cameraX, y: cameraY, zoom} = this.options.panZoomService.snapshot();\n        const viewportWidth = this.options.drawFlowElement.offsetWidth;\n        const viewportHeight = this.options.drawFlowElement.offsetHeight;\n        const viewportCenterX = viewportWidth / 2;\n        const viewportCenterY = viewportHeight / 2;\n        const zeroPoint = getViewportZeroPoint(\n            {width: viewportWidth, height: viewportHeight},\n            {\n                leftPosition: this.options.panZoomOptions.leftPosition,\n                topPosition: this.options.panZoomOptions.topPosition,\n            },\n        );\n\n        return {\n            x: (viewportCenterX - zeroPoint.x - cameraX) / zoom,\n            y: (viewportCenterY - zeroPoint.y - cameraY) / zoom,\n        };\n    }\n\n    public clampPositionToPanBounds(position: DfPoint): DfPoint {\n        return position;\n    }\n\n    private hasPosition(node: DfDataInitialNode | DfDataNode): node is DfDataNode {\n        const position = (node as DfDataNode).position;\n\n        return !!position && Number.isFinite(position.x) && Number.isFinite(position.y);\n    }\n}\n","import {signal} from '@angular/core';\n\nimport {INITIAL_COORDINATES} from '../../consts';\nimport {\n    type DfDragDrop,\n    type DfDragDropDistance,\n    DfDragDropStage,\n} from '../../directives';\nimport {type DfDataNode, type DfPoint} from '../../ng-draw-flow.interfaces';\nimport {type NgDrawFlowStoreService} from '../../services/ng-draw-flow-store.service';\nimport {type ConnectionsService} from '../connections/connections.service';\nimport {type PanZoomService} from '../pan-zoom/pan-zoom.service';\n\nexport interface DfNodeInteractionControllerOptions {\n    readonly connectionsService: ConnectionsService;\n    readonly deletable: () => boolean;\n    readonly draggable: () => boolean;\n    readonly getCenteredPosition: (node: DfDataNode) => DfPoint;\n    readonly getNode: () => DfDataNode;\n    readonly isStartNode: () => boolean;\n    readonly nodeDragThreshold: number;\n    readonly panZoomService: PanZoomService;\n    readonly store: NgDrawFlowStoreService;\n    readonly applyPositionToStyle: (position: DfPoint, dynamic: boolean) => void;\n    readonly clampPosition: (position: DfPoint) => DfPoint;\n    readonly emitNodeDeleted: () => void;\n    readonly emitNodeMoved: (node: DfDataNode) => void;\n    readonly emitNodeSelected: (node: DfDataNode) => void;\n    readonly recalculateConnectorsPosition: (\n        distance: DfDragDropDistance,\n        zoom: number,\n    ) => void;\n    readonly refreshRenderedGeometry: (dynamic: boolean) => void;\n    readonly syncWorkspaceGeometry: () => void;\n}\n\nfunction createInitialCoordinates(): DfPoint {\n    return {...INITIAL_COORDINATES};\n}\n\nexport class NodeInteractionController {\n    private readonly cursorSignal = signal<'grabbing' | 'initial'>('initial');\n    private readonly selectedSignal = signal(false);\n\n    private accumulatedDelta = createInitialCoordinates();\n    private dragStartPosition: DfPoint | null = null;\n    private moved = false;\n\n    public readonly cursor = this.cursorSignal.asReadonly();\n    public readonly selected = this.selectedSignal.asReadonly();\n\n    constructor(private readonly options: DfNodeInteractionControllerOptions) {}\n\n    public handleKeyboardEvent(event: KeyboardEvent): void {\n        if (\n            !this.selectedSignal() ||\n            !this.options.deletable() ||\n            this.options.isStartNode()\n        ) {\n            return;\n        }\n\n        const node = this.options.getNode();\n\n        event.preventDefault();\n\n        this.options.store.clearSelectedNode(node.id);\n        this.options.emitNodeDeleted();\n    }\n\n    public setSelected(selected: boolean): void {\n        const node = this.options.getNode();\n\n        this.selectedSignal.set(selected);\n\n        if (selected) {\n            this.options.connectionsService.highlightConnectionsForNode(node.id);\n            this.options.store.emitNodeSelected(node);\n            this.options.emitNodeSelected(node);\n        } else {\n            this.options.connectionsService.highlightConnectionsForNode(null);\n            this.options.store.clearSelectedNode(node.id);\n        }\n    }\n\n    public handleDrag(event: DfDragDrop): void {\n        if (!this.options.draggable()) {\n            this.cancelDrag();\n\n            return;\n        }\n\n        if (this.options.isStartNode()) {\n            return;\n        }\n\n        if (event.stage === DfDragDropStage.Move) {\n            this.handleDragMove(event.distance);\n        } else {\n            this.handleDragEnd();\n        }\n    }\n\n    public clearHighlightedConnectionsFor(nodeId: string): void {\n        if (this.options.connectionsService.selectedNodeId() === nodeId) {\n            this.options.connectionsService.highlightConnectionsForNode(null);\n        }\n    }\n\n    public cancelDrag(): void {\n        const startPosition = this.dragStartPosition;\n\n        if (startPosition) {\n            const node = this.options.getNode();\n            const {zoom} = this.options.panZoomService.snapshot();\n            const delta = {\n                deltaX: (startPosition.x - node.position.x) * zoom,\n                deltaY: (startPosition.y - node.position.y) * zoom,\n            };\n\n            node.position = {...startPosition};\n            this.options.syncWorkspaceGeometry();\n            this.options.applyPositionToStyle(\n                this.options.getCenteredPosition(node),\n                false,\n            );\n            this.options.recalculateConnectorsPosition(delta, zoom);\n            this.options.refreshRenderedGeometry(false);\n        }\n\n        this.resetDragState();\n    }\n\n    private handleDragMove(distance: DfDragDropDistance): void {\n        const node = this.options.getNode();\n        const {zoom} = this.options.panZoomService.snapshot();\n\n        this.dragStartPosition ??= {...node.position};\n\n        if (distance.deltaX || distance.deltaY) {\n            this.moved = true;\n        }\n\n        this.cursorSignal.set('grabbing');\n        this.options.panZoomService.setDisabled(true);\n\n        this.accumulatedDelta.x += distance.deltaX / zoom;\n        this.accumulatedDelta.y += distance.deltaY / zoom;\n\n        const applyX =\n            Math.abs(this.accumulatedDelta.x) >= this.options.nodeDragThreshold;\n        const applyY =\n            Math.abs(this.accumulatedDelta.y) >= this.options.nodeDragThreshold;\n\n        if (!applyX && !applyY) {\n            return;\n        }\n\n        const previousPosition = {...node.position};\n        const requestedDeltaX = applyX ? this.accumulatedDelta.x : 0;\n        const requestedDeltaY = applyY ? this.accumulatedDelta.y : 0;\n        const unclampedPosition = {\n            x: node.position.x + requestedDeltaX,\n            y: node.position.y + requestedDeltaY,\n        };\n\n        node.position = this.options.clampPosition(unclampedPosition);\n        const appliedDeltaX = node.position.x - previousPosition.x;\n        const appliedDeltaY = node.position.y - previousPosition.y;\n\n        this.options.syncWorkspaceGeometry();\n        this.options.applyPositionToStyle(this.options.getCenteredPosition(node), true);\n        this.options.recalculateConnectorsPosition(\n            {\n                deltaX: appliedDeltaX * zoom,\n                deltaY: appliedDeltaY * zoom,\n            },\n            zoom,\n        );\n\n        if (applyX) {\n            this.accumulatedDelta.x = 0;\n        }\n\n        if (applyY) {\n            this.accumulatedDelta.y = 0;\n        }\n    }\n\n    private handleDragEnd(): void {\n        if (this.moved) {\n            const node = this.options.getNode();\n\n            this.options.emitNodeMoved({...node, position: {...node.position}});\n            this.options.refreshRenderedGeometry(false);\n        }\n\n        this.resetDragState();\n    }\n\n    private resetDragState(): void {\n        this.cursorSignal.set('initial');\n        this.accumulatedDelta = createInitialCoordinates();\n        this.dragStartPosition = null;\n        this.moved = false;\n        this.options.panZoomService.setDisabled(false);\n    }\n}\n","import {\n    type AfterViewInit,\n    ChangeDetectionStrategy,\n    ChangeDetectorRef,\n    Component,\n    computed,\n    DestroyRef,\n    effect,\n    type ElementRef,\n    EnvironmentInjector,\n    inject,\n    input,\n    type OnDestroy,\n    output,\n    untracked,\n    viewChild,\n    ViewContainerRef,\n} from '@angular/core';\nimport {takeUntilDestroyed} from '@angular/core/rxjs-interop';\nimport {animationFrameScheduler, type Subscription} from 'rxjs';\n\nimport {\n    type DfDragDrop,\n    DragDropDirective,\n    SelectableElementDirective,\n} from '../../directives';\nimport {isEditorKeyboardEvent} from '../../helpers/editor-keyboard-event';\nimport {DRAW_FLOW_OPTIONS} from '../../ng-draw-flow.configs';\nimport {\n    type DfDataInitialNode,\n    type DfDataNode,\n    type DfNodePositionAnimationEasing,\n    type DfOptions,\n    type DfPoint,\n} from '../../ng-draw-flow.interfaces';\nimport {DRAW_FLOW_ROOT_ELEMENT} from '../../ng-draw-flow.token';\nimport {CoordinatesService} from '../../services/coordinates.service';\nimport {DfInteractionStateService} from '../../services/interaction-state.service';\nimport {NgDrawFlowStoreService} from '../../services/ng-draw-flow-store.service';\nimport {DF_NODE_SIZE_REGISTRY} from '../../services/node-size-registry.service';\nimport {ConnectionsService} from '../connections/connections.service';\nimport {DF_PAN_ZOOM_OPTIONS} from '../pan-zoom/pan-zoom.options';\nimport {PanZoomService} from '../pan-zoom/pan-zoom.service';\nimport {NodeConnectorsController} from './node-connectors.controller';\nimport {NodeContentHost} from './node-content.host';\nimport {\n    type DfNodeContentInputs,\n    type DfNodeContentRenderer,\n} from './node-content.renderer';\nimport {NodeGeometryController} from './node-geometry.controller';\nimport {NodeInteractionController} from './node-interaction.controller';\n\n@Component({\n    standalone: true,\n    selector: 'df-node',\n    imports: [DragDropDirective, SelectableElementDirective],\n    templateUrl: './node.component.html',\n    styleUrl: './node.component.less',\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    host: {\n        '(document:keydown.backspace)': 'this.handleKeyboardEvent($event)',\n        '(document:keydown.delete)': 'this.handleKeyboardEvent($event)',\n    },\n})\nexport class NodeComponent implements AfterViewInit, OnDestroy {\n    private readonly cdr = inject(ChangeDetectorRef);\n    private readonly drawFlowElement = inject<HTMLElement>(DRAW_FLOW_ROOT_ELEMENT);\n    private readonly destroyRef = inject(DestroyRef);\n    private readonly panZoomService = inject(PanZoomService);\n    private readonly coordinatesService = inject(CoordinatesService);\n    private readonly store = inject(NgDrawFlowStoreService);\n    private readonly nodeSizeRegistry = inject(DF_NODE_SIZE_REGISTRY);\n    private readonly drawFlowOptions = inject<DfOptions>(DRAW_FLOW_OPTIONS);\n    private readonly environmentInjector = inject(EnvironmentInjector);\n    private readonly drawFlowComponents = this.drawFlowOptions.nodes;\n    private readonly connectionsService = inject(ConnectionsService);\n    private readonly interactionState = inject(DfInteractionStateService, {\n        optional: true,\n    });\n\n    private readonly nodeGeometry = new NodeGeometryController({\n        drawFlowElement: inject<HTMLElement>(DRAW_FLOW_ROOT_ELEMENT),\n        panZoomOptions: inject(DF_PAN_ZOOM_OPTIONS),\n        panZoomService: this.panZoomService,\n    });\n\n    private readonly nodeContentHost = new NodeContentHost(this.environmentInjector);\n\n    private resolvedNodeValue: DfDataNode | null = null;\n    private renderedPositionValue: DfPoint | null = null;\n    private positionAnimationFrameId: number | null = null;\n    private readonly nodeConnectors: NodeConnectorsController;\n    private readonly nodeInteraction: NodeInteractionController;\n    private nodeSizeSyncSubscription: Subscription | null = null;\n\n    public readonly nodeElementRef =\n        viewChild.required<ElementRef<HTMLElement>>('nodeElement');\n\n    public readonly containerRef = viewChild.required('container', {\n        read: ViewContainerRef,\n    });\n\n    public readonly node = input.required<DfDataInitialNode | DfDataNode>();\n\n    public readonly invalid = input(false);\n    public readonly touched = input(false);\n\n    public readonly nodeMoved = output<DfDataNode>();\n    public readonly nodeDeleted = output();\n    public readonly nodeSelected = output<DfDataNode>();\n    public readonly connectorDeleted = output<string>();\n\n    public readonly cursor = computed(() => this.nodeInteraction.cursor());\n\n    constructor() {\n        this.nodeConnectors = this.createNodeConnectorsController();\n        this.nodeInteraction = this.createNodeInteractionController();\n\n        this.interactionState?.nodeDragCancellation$\n            .pipe(takeUntilDestroyed(this.destroyRef))\n            .subscribe(() => this.nodeInteraction.cancelDrag());\n\n        effect(() => {\n            const nodeContentRenderer = this.nodeContentHost.renderer();\n\n            if (!nodeContentRenderer) {\n                return;\n            }\n\n            this.nodeContentHost.syncInputs(this.getNodeContentInputs());\n        });\n\n        effect(() => {\n            if (this.interactionState && !this.interactionState.nodesDraggable()) {\n                untracked(() => this.nodeInteraction.cancelDrag());\n            }\n        });\n\n        effect(() => {\n            const node = this.node();\n\n            untracked(() => {\n                this.applyNodeInputUpdate(node);\n            });\n        });\n    }\n\n    public ngAfterViewInit(): void {\n        this.initializeResolvedNode();\n        this.createNodeContentComponent();\n        this.measureNodeContent();\n        this.nodeConnectors.applyOutputsConnectionLabel();\n        this.nodeConnectors.watch();\n        this.refreshRenderedGeometry(false);\n        this.syncNodeSizeRegistry();\n        this.observeNodeSize();\n    }\n\n    public ngOnDestroy(): void {\n        this.cancelPositionAnimation();\n        this.cancelScheduledNodeSizeSync();\n\n        if (!this.resolvedNodeValue) {\n            this.nodeConnectors.disconnect();\n            this.nodeGeometry.disconnect();\n\n            return;\n        }\n\n        this.nodeInteraction.clearHighlightedConnectionsFor(this.getResolvedNode().id);\n        this.nodeSizeRegistry?.remove(this.getResolvedNode().id);\n        this.nodeConnectors.disconnect();\n        this.nodeGeometry.disconnect();\n        this.nodeGeometry.removeWorkspaceGeometry(this.getResolvedNode().id);\n    }\n\n    protected handleKeyboardEvent(event: KeyboardEvent): void {\n        if (isEditorKeyboardEvent(event, this.drawFlowElement)) {\n            this.nodeInteraction.handleKeyboardEvent(event);\n        }\n    }\n\n    protected createNodeContentComponent(): void {\n        const nodeType = this.getResolvedNode().data.type;\n        const nodeContentComponent = this.getNodeContentComponent(nodeType);\n\n        const nodeContentRenderer = this.nodeContentHost.renderComponent(\n            this.containerRef(),\n            nodeContentComponent,\n        );\n\n        nodeContentRenderer.syncInputs(this.getNodeContentInputs());\n\n        this.cdr.detectChanges();\n    }\n\n    protected onSelectedChanged(selected: boolean): void {\n        this.nodeInteraction.setSelected(selected);\n    }\n\n    protected onDrag(event: DfDragDrop): void {\n        this.cancelPositionAnimationForInteraction();\n        this.nodeInteraction.handleDrag(event);\n    }\n\n    protected isSelected(): boolean {\n        return this.nodeInteraction.selected();\n    }\n\n    protected isInvalid(): boolean {\n        return this.invalid() || this.nodeContentHost.renderer()?.invalid === true;\n    }\n\n    protected nodeClassName(): string {\n        const classNames = ['draw-flow-node'];\n\n        if (this.touched() && this.isInvalid()) {\n            classNames.push('df-invalid');\n        }\n\n        if (this.isSelected()) {\n            classNames.push('df-selected');\n        }\n\n        classNames.push(...this.getCustomClassNames());\n\n        return classNames.join(' ');\n    }\n\n    private createNodeConnectorsController(): NodeConnectorsController {\n        return new NodeConnectorsController({\n            coordinatesService: this.coordinatesService,\n            destroyRef: this.destroyRef,\n            environmentInjector: this.environmentInjector,\n            getCenteredPosition: (node) => this.nodeGeometry.getCenteredPosition(node),\n            getNode: () => this.getResolvedNode(),\n            getNodeContentRenderer: () => this.getNodeContentRenderer(),\n            getZoom: () => this.panZoomService.snapshot().zoom,\n            onConnectorDeleted: (connectorId) => {\n                this.connectorDeleted.emit(connectorId);\n            },\n        });\n    }\n\n    private createNodeInteractionController(): NodeInteractionController {\n        return new NodeInteractionController({\n            connectionsService: this.connectionsService,\n            deletable: () =>\n                this.interactionState?.nodesDeletable() ??\n                this.drawFlowOptions.options.nodesDeletable,\n            draggable: () =>\n                this.interactionState?.nodesDraggable() ??\n                this.drawFlowOptions.options.nodesDraggable,\n            getCenteredPosition: (node) => this.nodeGeometry.getCenteredPosition(node),\n            getNode: () => this.getResolvedNode(),\n            isStartNode: () => this.node().startNode === true,\n            nodeDragThreshold: this.drawFlowOptions.options.nodeDragThreshold,\n            panZoomService: this.panZoomService,\n            store: this.store,\n            applyPositionToStyle: (position, dynamic) => {\n                this.nodeGeometry.applyPositionToStyle(\n                    this.nodeElementRef().nativeElement,\n                    position,\n                    dynamic,\n                );\n            },\n            clampPosition: (position) =>\n                this.nodeGeometry.clampPositionToPanBounds(position),\n            emitNodeDeleted: () => {\n                this.nodeDeleted.emit();\n            },\n            emitNodeMoved: (node) => {\n                this.nodeMoved.emit(node);\n            },\n            emitNodeSelected: (node) => {\n                this.nodeSelected.emit(node);\n            },\n            recalculateConnectorsPosition: (distance, zoom) => {\n                this.recalculateConnectorPositions(distance, zoom);\n            },\n            refreshRenderedGeometry: (dynamic) => {\n                this.refreshRenderedGeometry(dynamic);\n            },\n            syncWorkspaceGeometry: () => {\n                this.syncWorkspaceGeometry();\n            },\n        });\n    }\n\n    private getCustomClassNames(): string[] {\n        const className = this.node().className;\n\n        if (!className) {\n            return [];\n        }\n\n        return Array.isArray(className) ? className : [className];\n    }\n\n    private initializeResolvedNode(): void {\n        this.resolvedNodeValue = this.nodeGeometry.resolveNode(this.node());\n        this.renderedPositionValue = {...this.resolvedNodeValue.position};\n    }\n\n    private applyNodeInputUpdate(node: DfDataInitialNode | DfDataNode): void {\n        if (!this.resolvedNodeValue) {\n            return;\n        }\n\n        const previousNode = this.resolvedNodeValue;\n\n        this.resolvedNodeValue = this.nodeGeometry.resolveUpdatedNode(\n            node,\n            this.resolvedNodeValue,\n        );\n\n        const nodeTypeChanged =\n            this.resolvedNodeValue.data.type !== previousNode.data.type;\n        const positionChanged = this.nodeGeometry.hasPositionChanged(\n            previousNode,\n            this.resolvedNodeValue,\n        );\n        const startNodeChanged =\n            (this.resolvedNodeValue.startNode === true) !==\n            (previousNode.startNode === true);\n        const endNodeChanged =\n            (this.resolvedNodeValue.endNode === true) !== (previousNode.endNode === true);\n        const nodeIdentityChanged = this.resolvedNodeValue.id !== previousNode.id;\n        const nodeDataChanged = this.resolvedNodeValue.data !== previousNode.data;\n        const connectionLabelChanged =\n            this.resolvedNodeValue.data.connectionLabel !==\n            previousNode.data.connectionLabel;\n        const contentInputsChanged =\n            nodeIdentityChanged || nodeDataChanged || startNodeChanged || endNodeChanged;\n\n        if (\n            !nodeTypeChanged &&\n            !positionChanged &&\n            !contentInputsChanged &&\n            !connectionLabelChanged\n        ) {\n            return;\n        }\n\n        if (nodeTypeChanged) {\n            this.createNodeContentComponent();\n            this.measureNodeContent();\n            this.nodeConnectors.watch();\n        } else if (contentInputsChanged) {\n            this.nodeContentHost.syncInputs(this.getNodeContentInputs());\n        }\n\n        if (nodeIdentityChanged) {\n            this.nodeSizeRegistry?.remove(previousNode.id);\n        }\n\n        if (nodeTypeChanged || connectionLabelChanged) {\n            this.nodeConnectors.applyOutputsConnectionLabel();\n        }\n\n        if (\n            nodeTypeChanged ||\n            positionChanged ||\n            nodeIdentityChanged ||\n            startNodeChanged ||\n            endNodeChanged\n        ) {\n            const animating =\n                positionChanged &&\n                !nodeTypeChanged &&\n                !nodeIdentityChanged &&\n                this.animatePositionChange(\n                    this.renderedPositionValue ?? previousNode.position,\n                    this.resolvedNodeValue.position,\n                );\n\n            if (!animating) {\n                this.refreshRenderedGeometry(false);\n            }\n\n            if (nodeTypeChanged || nodeIdentityChanged) {\n                this.syncNodeSizeRegistry();\n            }\n        }\n    }\n\n    private getResolvedNode(): DfDataNode {\n        if (!this.resolvedNodeValue) {\n            throw new Error('NodeComponent resolved node is not initialized');\n        }\n\n        return this.resolvedNodeValue;\n    }\n\n    private measureNodeContent(): void {\n        this.nodeGeometry.measureContent(this.nodeContentHost.nativeElement());\n    }\n\n    private observeNodeSize(): void {\n        this.nodeGeometry.observeNodeSize(this.nodeElementRef().nativeElement, () => {\n            this.scheduleNodeSizeSync();\n        });\n    }\n\n    private scheduleNodeSizeSync(): void {\n        if (this.nodeSizeSyncSubscription) {\n            return;\n        }\n\n        this.nodeSizeSyncSubscription = animationFrameScheduler.schedule(() => {\n            this.nodeSizeSyncSubscription = null;\n            this.syncNodeSize();\n        });\n    }\n\n    private cancelScheduledNodeSizeSync(): void {\n        this.nodeSizeSyncSubscription?.unsubscribe();\n        this.nodeSizeSyncSubscription = null;\n    }\n\n    private syncNodeSize(): void {\n        this.measureNodeContent();\n        this.refreshRenderedGeometry(false);\n        this.syncNodeSizeRegistry();\n    }\n\n    private syncNodeSizeRegistry(): void {\n        if (!this.nodeSizeRegistry || !this.resolvedNodeValue) {\n            return;\n        }\n\n        this.nodeSizeRegistry.set(\n            this.resolvedNodeValue.id,\n            this.nodeGeometry.measureElement(this.nodeElementRef().nativeElement),\n        );\n    }\n\n    private refreshRenderedGeometry(dynamic: boolean): void {\n        this.renderPosition(this.getResolvedNode().position, dynamic);\n    }\n\n    private renderPosition(\n        position: DfPoint,\n        dynamic: boolean,\n        translateConnectorCoordinates = false,\n    ): void {\n        const node = this.getResolvedNode();\n        const centeredPosition = this.nodeGeometry.getCenteredPoint(position);\n\n        this.nodeGeometry.applyPositionToStyle(\n            this.nodeElementRef().nativeElement,\n            centeredPosition,\n            dynamic,\n        );\n\n        if (translateConnectorCoordinates && this.renderedPositionValue) {\n            this.nodeConnectors.translateCoordinates({\n                deltaX: position.x - this.renderedPositionValue.x,\n                deltaY: position.y - this.renderedPositionValue.y,\n            });\n        } else {\n            this.nodeConnectors.updateCoordinatesAt(centeredPosition, node.id);\n        }\n\n        this.nodeGeometry.syncWorkspaceGeometryAt(node.id, position);\n        this.renderedPositionValue = {...position};\n    }\n\n    private recalculateConnectorPositions(\n        distance: DfDragDrop['distance'],\n        zoom: number,\n    ): void {\n        this.nodeConnectors.recalculatePositions(distance, zoom);\n    }\n\n    private syncWorkspaceGeometry(): void {\n        this.nodeGeometry.syncWorkspaceGeometry(this.getResolvedNode());\n    }\n\n    private animatePositionChange(from: DfPoint, to: DfPoint): boolean {\n        const animation = this.drawFlowOptions.positionAnimation;\n        const duration = animation?.duration ?? 0;\n\n        this.cancelPositionAnimation();\n\n        if (\n            (from.x === to.x && from.y === to.y) ||\n            duration <= 0 ||\n            typeof requestAnimationFrame !== 'function' ||\n            this.prefersReducedMotion()\n        ) {\n            return false;\n        }\n\n        let startedAt: number | null = null;\n\n        const renderFrame = (timestamp: number): void => {\n            startedAt ??= timestamp;\n\n            const progress = Math.min((timestamp - startedAt) / duration, 1);\n            const eased = this.ease(progress, animation?.easing ?? 'ease-in-out');\n\n            this.renderPosition(\n                {\n                    x: from.x + (to.x - from.x) * eased,\n                    y: from.y + (to.y - from.y) * eased,\n                },\n                true,\n                true,\n            );\n\n            if (progress < 1) {\n                this.positionAnimationFrameId = requestAnimationFrame(renderFrame);\n\n                return;\n            }\n\n            this.positionAnimationFrameId = null;\n            this.refreshRenderedGeometry(false);\n        };\n\n        this.positionAnimationFrameId = requestAnimationFrame(renderFrame);\n\n        return true;\n    }\n\n    private cancelPositionAnimationForInteraction(): void {\n        if (this.positionAnimationFrameId === null || !this.renderedPositionValue) {\n            return;\n        }\n\n        this.cancelPositionAnimation();\n        this.resolvedNodeValue = {\n            ...this.getResolvedNode(),\n            position: {...this.renderedPositionValue},\n        };\n    }\n\n    private cancelPositionAnimation(): void {\n        if (\n            this.positionAnimationFrameId !== null &&\n            typeof cancelAnimationFrame === 'function'\n        ) {\n            cancelAnimationFrame(this.positionAnimationFrameId);\n        }\n\n        this.positionAnimationFrameId = null;\n    }\n\n    private prefersReducedMotion(): boolean {\n        return (\n            typeof matchMedia === 'function' &&\n            matchMedia('(prefers-reduced-motion: reduce)').matches\n        );\n    }\n\n    private ease(progress: number, easing: DfNodePositionAnimationEasing): number {\n        if (easing === 'linear') {\n            return progress;\n        }\n\n        return progress < 0.5\n            ? 4 * progress * progress * progress\n            : 1 - Math.pow(-2 * progress + 2, 3) / 2;\n    }\n\n    private getNodeContentComponent(nodeType: string): DfOptions['nodes'][string] {\n        const nodeContentComponent = this.drawFlowComponents[nodeType];\n\n        if (!nodeContentComponent) {\n            throw new Error(\n                `NodeComponent cannot render node \"${this.getResolvedNode().id}\" because node type \"${nodeType}\" is not registered`,\n            );\n        }\n\n        return nodeContentComponent;\n    }\n\n    private getNodeContentRenderer(): DfNodeContentRenderer {\n        const nodeContentRenderer = this.nodeContentHost.renderer();\n\n        if (!nodeContentRenderer) {\n            throw new Error('NodeComponent content renderer is not initialized');\n        }\n\n        return nodeContentRenderer;\n    }\n\n    private getNodeContentInputs(): DfNodeContentInputs {\n        const node = this.getResolvedNode();\n\n        return {\n            nodeId: node.id,\n            startNode: node.startNode === true,\n            endNode: node.endNode === true,\n            model: node.data,\n            selected: this.nodeInteraction.selected(),\n            invalid: this.invalid(),\n            disabled: this.interactionState?.disabled() ?? false,\n            readonly: this.interactionState?.readonly() ?? false,\n        };\n    }\n}\n","<div\n    #nodeElement\n    data-draw-flow-node\n    [attr.data-node-id]=\"node().id\"\n    [attr.data-start-node]=\"node().startNode ? 'true' : null\"\n    [class]=\"nodeClassName()\"\n    [style.cursor]=\"cursor()\"\n    (dfDragDrop)=\"onDrag($event)\"\n    (dfSelectableElement)=\"onSelectedChanged($event)\"\n>\n    <div class=\"node-content\">\n        <ng-container #container />\n    </div>\n</div>\n","import {\n    ChangeDetectionStrategy,\n    Component,\n    forwardRef,\n    inject,\n    input,\n    output,\n    type Signal,\n    signal,\n} from '@angular/core';\nimport {takeUntilDestroyed} from '@angular/core/rxjs-interop';\nimport {type ControlValueAccessor, NG_VALUE_ACCESSOR} from '@angular/forms';\n\nimport {\n    type DfDataConnection,\n    type DfDataInitialNode,\n    type DfDataModel,\n    type DfDataNode,\n    type DfEvent,\n} from '../../ng-draw-flow.interfaces';\nimport {NgDrawFlowStoreService} from '../../services/ng-draw-flow-store.service';\nimport {INVALID_NODES} from '../../validators/invalid-nodes.token';\nimport {ConnectionComponent} from '../connections/connection/connection.component';\nimport {ConnectionsService} from '../connections/connections.service';\nimport {DraftConnectionComponent} from '../connections/draft-connection/draft-connection.component';\nimport {DraftConnectionService} from '../connections/draft-connection/draft-connection.service';\nimport {NodeComponent} from '../node/node.component';\n\n@Component({\n    standalone: true,\n    selector: 'df-scene',\n    imports: [ConnectionComponent, DraftConnectionComponent, NodeComponent],\n    templateUrl: './scene.component.html',\n    styleUrl: './scene.component.less',\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    providers: [\n        {\n            provide: NG_VALUE_ACCESSOR,\n            useExisting: forwardRef(() => SceneComponent),\n            multi: true,\n        },\n    ],\n    host: {'data-element': 'scene'},\n})\nexport class SceneComponent implements ControlValueAccessor {\n    private readonly connectionsService = inject(ConnectionsService);\n    private readonly draftConnectionService = inject(DraftConnectionService);\n    private readonly store = inject(NgDrawFlowStoreService);\n\n    public readonly touched = input(false);\n\n    protected readonly nodeSelected = output<DfDataNode>();\n    protected readonly nodeMoved = output<DfEvent<DfDataNode>>();\n    protected readonly nodeDeleted = output<DfEvent<DfDataNode>>();\n    protected readonly connectionCreated = output<DfEvent<DfDataConnection>>();\n    protected readonly connectionDeleted = output<DfEvent<DfDataConnection>>();\n    protected readonly connectionSelected = output<DfDataConnection>();\n\n    protected readonly isConnectionCreating =\n        this.draftConnectionService.isConnectionCreating;\n\n    protected readonly model = signal<DfDataModel>({nodes: [], connections: []});\n    protected $invalidNodes: Signal<string[]> = inject(INVALID_NODES);\n\n    constructor() {\n        this.initializeConnectionsSubscription();\n    }\n\n    public writeValue(value: DfDataModel | null | undefined): void {\n        const model = value ?? {nodes: [], connections: []};\n\n        this.model.set(model);\n        this.store.updateDataModel(model);\n        this.connectionsService.setConnections(model.connections);\n    }\n\n    public registerOnChange(fn: (value: DfDataModel) => void): void {\n        this.onChange = fn;\n    }\n\n    public registerOnTouched(_fn: () => void): void {}\n\n    public setDisabledState(_isDisabled: boolean): void {}\n\n    protected onConnectionCreated(connection: DfDataConnection): void {\n        this.connectionsService.addConnections([connection]);\n        const model = this.model();\n\n        const event: DfEvent<DfDataConnection> = {\n            target: connection,\n            model,\n        };\n\n        this.store.emitConnectionCreated(event);\n\n        if (this.model() === model) {\n            this.connectionCreated.emit(event);\n        }\n    }\n\n    protected onConnectionDeleted(connection: DfDataConnection): void {\n        const event: DfEvent<DfDataConnection> = {\n            target: connection,\n            model: this.model(),\n        };\n\n        this.store.emitConnectionDeleted(event);\n\n        if (this.model() === event.model) {\n            this.connectionDeleted.emit(event);\n        }\n    }\n\n    protected onConnectionSelected(connection: DfDataConnection): void {\n        this.connectionSelected.emit(connection);\n    }\n\n    protected onConnectorDeleted(connectorId: string): void {\n        this.connectionsService.removeConnectionsByConnectorId(connectorId);\n    }\n\n    protected onNodeMoved(updated: DfDataNode): void {\n        const model = this.updateModel((current) => ({\n            ...current,\n            nodes: current.nodes.map((n) => (n.id === updated.id ? updated : n)),\n        }));\n        const event: DfEvent<DfDataNode> = {\n            target: updated,\n            model,\n        };\n\n        this.store.emitNodeMoved(event);\n\n        if (this.model() !== model) {\n            return;\n        }\n\n        this.nodeMoved.emit(event);\n        this.emitModelChange(model);\n    }\n\n    protected onNodeDeleted(id: string): void {\n        const current = this.model();\n        const deleted = current.nodes.find((node) => node.id === id) as\n            DfDataNode | undefined;\n\n        if (!deleted) {\n            return;\n        }\n\n        const deletedConnections = current.connections.filter(\n            (connection) =>\n                connection.source.nodeId === id || connection.target.nodeId === id,\n        );\n        const model = this.updateModel(() => ({\n            ...current,\n            nodes: current.nodes.filter((node) => node.id !== id),\n            connections: current.connections.filter(\n                (connection) =>\n                    connection.source.nodeId !== id && connection.target.nodeId !== id,\n            ),\n        }));\n        const event: DfEvent<DfDataNode> = {target: deleted, model};\n\n        this.connectionsService.setConnections(model.connections);\n        this.store.emitNodeDeleted(event);\n\n        if (this.model() !== model) {\n            return;\n        }\n\n        this.nodeDeleted.emit(event);\n\n        for (const connection of deletedConnections) {\n            if (this.model() !== model) {\n                return;\n            }\n\n            const connectionEvent: DfEvent<DfDataConnection> = {\n                target: connection,\n                model,\n            };\n\n            this.store.emitConnectionDeleted(connectionEvent);\n\n            if (this.model() !== model) {\n                return;\n            }\n\n            this.connectionDeleted.emit(connectionEvent);\n        }\n\n        this.emitModelChange(model);\n    }\n\n    protected onNodeSelected(node: DfDataNode): void {\n        this.nodeSelected.emit(node);\n    }\n\n    protected trackByNodeId(_: number, node: DfDataInitialNode | DfDataNode): string {\n        return node.id;\n    }\n\n    protected trackByConnectionsFn(index: number, connection: DfDataConnection): string {\n        return `${connection.source.nodeId}-${connection.source.connectorId}to${connection.target.nodeId}-${connection.target.connectorId}-${index}`;\n    }\n\n    private initializeConnectionsSubscription(): void {\n        this.connectionsService.connectionsChanged$\n            .pipe(takeUntilDestroyed())\n            .subscribe((connections: DfDataConnection[]) => {\n                const model = this.updateModel((current) => ({\n                    ...current,\n                    connections,\n                }));\n\n                this.store.updateDataModel(model);\n                this.emitModelChange(model);\n            });\n    }\n\n    private onChange: (value: DfDataModel) => void = (_: DfDataModel) => {};\n    private updateModel(update: (model: DfDataModel) => DfDataModel): DfDataModel {\n        const model = update(this.model());\n\n        this.model.set(model);\n\n        return model;\n    }\n\n    private emitModelChange(model: DfDataModel): void {\n        if (this.model() === model) {\n            this.onChange(model);\n        }\n    }\n}\n","@for (node of model().nodes; track trackByNodeId($index, node)) {\n    <df-node\n        [invalid]=\"$invalidNodes().includes(node.id)\"\n        [node]=\"node\"\n        [touched]=\"touched()\"\n        (connectorDeleted)=\"onConnectorDeleted($event)\"\n        (nodeDeleted)=\"onNodeDeleted(node.id)\"\n        (nodeMoved)=\"onNodeMoved($event)\"\n        (nodeSelected)=\"onNodeSelected($event)\"\n    />\n}\n\n@for (connection of model().connections; track trackByConnectionsFn($index, connection)) {\n    <df-connection\n        [connection]=\"connection\"\n        (connectionDeleted)=\"onConnectionDeleted(connection)\"\n        (connectionSelected)=\"onConnectionSelected(connection)\"\n    />\n}\n\n@if (isConnectionCreating()) {\n    <df-draft-connection (connectionCreated)=\"onConnectionCreated($event)\" />\n}\n","import {\n    type AfterViewInit,\n    ChangeDetectionStrategy,\n    ChangeDetectorRef,\n    Component,\n    computed,\n    DestroyRef,\n    effect,\n    ElementRef,\n    forwardRef,\n    inject,\n    Injector,\n    input,\n    type OnDestroy,\n    type OnInit,\n    output,\n    Renderer2,\n    signal,\n    viewChild,\n} from '@angular/core';\nimport {takeUntilDestroyed} from '@angular/core/rxjs-interop';\nimport {\n    type ControlValueAccessor,\n    FormControl,\n    NG_VALUE_ACCESSOR,\n    NgControl,\n    NgControlStatus,\n    ReactiveFormsModule,\n} from '@angular/forms';\nimport {WaResizeObserver} from '@ng-web-apis/resize-observer';\nimport {debounceTime, startWith, Subject, switchMap, tap} from 'rxjs';\n\nimport {ConnectionsService} from './components/connections/connections.service';\nimport {DraftConnectionService} from './components/connections/draft-connection/draft-connection.service';\nimport {\n    alignCameraToWorldRect,\n    clampByUsableRect,\n    type DfPanZoomWorldRectBounds,\n    getViewportZeroPoint,\n} from './components/pan-zoom/pan-zoom.camera.math';\nimport {PanZoomComponent} from './components/pan-zoom/pan-zoom.component';\nimport {\n    DF_PAN_ZOOM_OPTIONS,\n    type DfPanZoomOptions,\n} from './components/pan-zoom/pan-zoom.options';\nimport {PanZoomService} from './components/pan-zoom/pan-zoom.service';\nimport {SceneComponent} from './components/scene/scene.component';\nimport {ErrorsDirective} from './directives';\nimport {DRAW_FLOW_OPTIONS} from './ng-draw-flow.configs';\nimport {\n    type DfDataConnection,\n    type DfDataModel,\n    type DfDataNode,\n    type DfEvent,\n    type DfInteractionOptions,\n    type DfPoint,\n} from './ng-draw-flow.interfaces';\nimport {DRAW_FLOW_ROOT_ELEMENT} from './ng-draw-flow.token';\nimport {CoordinatesService} from './services/coordinates.service';\nimport {DfInteractionStateService} from './services/interaction-state.service';\nimport {NgDrawFlowStoreService} from './services/ng-draw-flow-store.service';\nimport {SelectionService} from './services/selection.service';\nimport {INVALID_NODES} from './validators/invalid-nodes.token';\n\n/** Reuse Angular's reactive touched getter, including silent form updates. */\nclass ControlStatusReader extends NgControlStatus {\n    public get touched(): boolean {\n        return this.isTouched;\n    }\n}\n\n/**\n * Root component of **ng-draw-flow** – a lightweight graph editor\n * capable of rendering and manipulating hundreds of nodes and edges.\n *\n * * Acts as a form-field (`ControlValueAccessor`) whose value is the\n *   entire diagram (`DfDataModel`).\n * * Wraps the low-level services (`PanZoomService`, `ConnectionsService`\n *   …) and re-emits high-level events so host applications can stay\n *   framework-agnostic.\n * * Exposes a minimal public API (`zoomIn`, `zoomOut`, `resetPosition`,\n *   `setScale`, `removeConnection`, `removeNode`) for programmatic control.\n * * Broadcasts state and events through `NgDrawFlowStoreService` so host apps\n *   can react without a direct reference to the component instance.\n */\n@Component({\n    standalone: true,\n    selector: 'ng-draw-flow',\n    imports: [PanZoomComponent, ReactiveFormsModule, SceneComponent],\n    templateUrl: './ng-draw-flow.component.html',\n    styleUrl: './ng-draw-flow.component.less',\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    providers: [\n        PanZoomService,\n        ConnectionsService,\n        CoordinatesService,\n        DraftConnectionService,\n        SelectionService,\n        DfInteractionStateService,\n        {\n            provide: INVALID_NODES,\n            useFactory: () => signal<string[]>([]),\n        },\n        {\n            provide: NG_VALUE_ACCESSOR,\n            useExisting: forwardRef(() => NgDrawFlowComponent),\n            multi: true,\n        },\n        {\n            provide: DRAW_FLOW_ROOT_ELEMENT,\n            useFactory: ({nativeElement}: ElementRef<HTMLElement>) => nativeElement,\n            deps: [ElementRef],\n        },\n    ],\n    hostDirectives: [\n        {\n            directive: ErrorsDirective,\n            inputs: ['errors'],\n        },\n        {\n            directive: WaResizeObserver,\n            outputs: ['waResizeObserver'],\n        },\n    ],\n    host: {\n        '(waResizeObserver)': 'this.onResize($event)',\n        '(focusout)': 'this.onFocusOut($event)',\n        '(document:pointerup)': 'this.onPointerEnd($event)',\n        '(document:pointercancel)': 'this.onPointerEnd($event)',\n        '[attr.tabindex]': 'disabled() ? -1 : 0',\n        '[attr.aria-disabled]': 'disabled() || null',\n        '[attr.aria-readonly]': 'readonly() || null',\n        '[attr.aria-invalid]': 'invalid() || null',\n        '[attr.aria-busy]': 'pending() || null',\n        '[class.ng-draw-flow_disabled]': 'disabled()',\n        '[class.ng-draw-flow_readonly]': 'readonly()',\n        '[class.ng-draw-flow_invalid]': 'invalid()',\n        '[class.ng-draw-flow_touched]': 'isTouched()',\n        '[class.ng-draw-flow_dirty]': 'dirty()',\n        '[class.ng-draw-flow_pending]': 'pending()',\n    },\n})\nexport class NgDrawFlowComponent\n    implements ControlValueAccessor, OnInit, AfterViewInit, OnDestroy\n{\n    private readonly cdr = inject(ChangeDetectorRef);\n    private readonly injector = inject(Injector);\n    private controlStatus: ControlStatusReader | null = null;\n    private readonly cancelPendingChanges$ = new Subject<void>();\n    private pendingChange: DfDataModel | undefined;\n    private readonly destroyRef = inject(DestroyRef);\n    private readonly hostElement = inject<ElementRef<HTMLElement>>(ElementRef);\n    private readonly renderer = inject(Renderer2);\n    private readonly connectionsService = inject(ConnectionsService);\n    private readonly panZoomService = inject(PanZoomService);\n    private readonly panZoomOptions = inject<DfPanZoomOptions>(DF_PAN_ZOOM_OPTIONS);\n    private readonly selectionService = inject(SelectionService);\n    private readonly store = inject(NgDrawFlowStoreService);\n    private readonly interactionState = inject(DfInteractionStateService);\n    private readonly cvaDisabled = signal(false);\n    private readonly maxViewportFrameRetries = 5;\n    private frameRequestId: number | null = null;\n    private viewportFrameRetryCount = 0;\n    private shouldFrameViewport = false;\n    private hasFramedExternalModel = false;\n    private destroyed = false;\n    private interactionVersion = 0;\n    private readonly activePointers = new Set<number>();\n\n    protected readonly panzoom = viewChild.required(PanZoomComponent);\n\n    /** Form state inputs are populated automatically by Signal Forms. */\n    public readonly disabledInput = input(false, {alias: 'disabled'});\n    public readonly readonlyInput = input(false, {alias: 'readonly'});\n    public readonly invalid = input(false);\n    public readonly touched = input(false);\n    public readonly dirty = input(false);\n    public readonly pending = input(false);\n    /** Dynamic overrides for the legacy provider's interaction defaults. */\n    public readonly interactionOptions = input<Partial<DfInteractionOptions>>({});\n\n    protected readonly disabled = computed(\n        () => this.cvaDisabled() || this.disabledInput(),\n    );\n\n    protected readonly readonly = computed(() => this.readonlyInput());\n\n    /** Emits the current zoom percentage (100 === actual size) each time it changes. */\n    protected readonly scale = output<number>();\n\n    /** Fired after a new edge is successfully created. */\n    protected readonly connectionCreated = output<DfEvent<DfDataConnection>>();\n\n    /** Fired after an edge is removed—via UI, `removeConnection()` or `removeNode()`. */\n    protected readonly connectionDeleted = output<DfEvent<DfDataConnection>>();\n\n    /** Fired when an edge receives focus in the scene. */\n    protected readonly connectionSelected = output<DfDataConnection>();\n\n    /** Fired when a node receives focus in the scene. */\n    protected readonly nodeSelected = output<DfDataNode>();\n\n    /** Fired whenever the user drags a node to a new position. */\n    protected readonly nodeMoved = output<DfEvent<DfDataNode>>();\n\n    /** Fired when a node is removed from the graph. */\n    protected readonly nodeDeleted = output<DfEvent<DfDataNode>>();\n\n    protected readonly form = new FormControl<DfDataModel>(\n        {\n            nodes: [],\n            connections: [],\n        },\n        {\n            nonNullable: true,\n        },\n    );\n\n    protected readonly $rootReady = signal<boolean>(false);\n\n    constructor() {\n        this.interactionState.setDefaults(inject(DRAW_FLOW_OPTIONS).options);\n        effect(() => this.interactionState.setOptions(this.interactionOptions()));\n        effect(() => this.interactionState.setDisabled(this.disabled()));\n        effect(() => this.interactionState.setReadonly(this.readonly()));\n        this.destroyRef.onDestroy(\n            this.renderer.listen(\n                this.hostElement.nativeElement,\n                'pointerdown',\n                (event: PointerEvent) => this.onPointerDown(event),\n                {capture: true},\n            ),\n        );\n    }\n\n    public ngOnInit(): void {\n        // Resolve after CVA construction to avoid a NgControl injection cycle.\n        const ngControl = this.injector.get(NgControl, null, {self: true});\n\n        this.controlStatus = ngControl ? new ControlStatusReader(ngControl) : null;\n        this.watchFormChanges();\n    }\n\n    public ngAfterViewInit(): void {\n        this.store.attach(this);\n\n        const model = this.form.value;\n\n        if (model) {\n            this.store.updateDataModel(model);\n        }\n\n        this.scheduleViewportFraming();\n    }\n\n    public ngOnDestroy(): void {\n        this.destroyed = true;\n        this.cancelPendingChange();\n        this.cancelViewportFraming();\n        this.store.detach(this);\n    }\n\n    public writeValue(value: DfDataModel | null | undefined): void {\n        const model = value ?? {nodes: [], connections: []};\n\n        this.cancelInteraction();\n        this.applyModel(model, false);\n        this.cdr.markForCheck();\n\n        if (model.nodes.length) {\n            if (!this.hasFramedExternalModel) {\n                this.hasFramedExternalModel = true;\n                this.scheduleViewportFraming();\n            }\n        } else {\n            this.hasFramedExternalModel = false;\n        }\n    }\n\n    public registerOnChange(fn: (value: DfDataModel) => void): void {\n        this.onChange = fn;\n    }\n\n    public registerOnTouched(fn: () => void): void {\n        this.onTouched = fn;\n    }\n\n    public setDisabledState(isDisabled: boolean): void {\n        this.cvaDisabled.set(isDisabled);\n        this.interactionState.setDisabled(isDisabled || this.disabledInput());\n\n        if (isDisabled) {\n            this.form.disable({emitEvent: false});\n        } else {\n            this.form.enable({emitEvent: false});\n        }\n    }\n\n    /** Zooms one step *in* towards the center of the scene. */\n    public zoomIn(): void {\n        this.panzoom().zoomIn();\n    }\n\n    /** Zooms one step *out* from the center of the scene. */\n    public zoomOut(): void {\n        this.panzoom().zoomOut();\n    }\n\n    /** Partially updates zoom and coordinates. */\n    public setPosition(position?: Partial<DfPoint> & {zoom?: number}): void {\n        this.panzoom().setPosition(position);\n    }\n\n    /** Resets both zoom factor and pan offset to their defaults. */\n    public resetPosition(): void {\n        this.panzoom().resetPanzoom();\n        this.scheduleViewportFraming();\n    }\n\n    /**\n     * Applies an absolute zoom factor to the scene (1 === 100%) while respecting\n     * configured pan/zoom bounds.\n     */\n    public setScale(scale: number): void {\n        this.panzoom().setScale(scale);\n    }\n\n    /** Replaces the current model and propagates the change to the bound control. */\n    public setDataModel(model: DfDataModel): void {\n        this.cancelInteraction();\n        this.applyModel(model, true);\n    }\n\n    /** Method that removes an existing edge. */\n    public removeConnection(connection: DfDataConnection): void {\n        const current = this.form.value;\n        const deleted = current.connections.find((existing) =>\n            this.isSameConnection(existing, connection),\n        );\n\n        if (!deleted) {\n            return;\n        }\n\n        const model: DfDataModel = {\n            ...current,\n            connections: current.connections.filter(\n                (existing) => !this.isSameConnection(existing, connection),\n            ),\n        };\n        const event: DfEvent<DfDataConnection> = {target: deleted, model};\n\n        this.applyModel(model, false);\n        const version = this.interactionVersion;\n\n        this.store.emitConnectionDeleted(event);\n\n        if (version === this.interactionVersion && this.form.value === model) {\n            this.onChange(model);\n        }\n\n        this.connectionDeleted.emit(event);\n    }\n\n    /** Method that removes an existing node and all related edges. */\n    public removeNode(node: DfDataNode | string): void {\n        const nodeId = typeof node === 'string' ? node : node.id;\n        const current = this.form.value;\n        const deleted = current.nodes.find(({id}) => id === nodeId);\n\n        if (!deleted) {\n            return;\n        }\n\n        const deletedConnections = current.connections.filter(\n            (connection) =>\n                connection.source.nodeId === nodeId ||\n                connection.target.nodeId === nodeId,\n        );\n        const model: DfDataModel = {\n            ...current,\n            nodes: current.nodes.filter(({id}) => id !== nodeId),\n            connections: current.connections.filter(\n                (connection) =>\n                    connection.source.nodeId !== nodeId &&\n                    connection.target.nodeId !== nodeId,\n            ),\n        };\n        const event: DfEvent<DfDataNode> = {target: deleted as DfDataNode, model};\n\n        this.applyModel(model, false);\n        const version = this.interactionVersion;\n\n        this.store.emitNodeDeleted(event);\n\n        deletedConnections.forEach((connection) => {\n            const connectionEvent: DfEvent<DfDataConnection> = {\n                target: connection,\n                model,\n            };\n\n            if (version === this.interactionVersion && this.form.value === model) {\n                this.store.emitConnectionDeleted(connectionEvent);\n            }\n        });\n\n        if (version === this.interactionVersion && this.form.value === model) {\n            this.onChange(model);\n        }\n\n        this.nodeDeleted.emit(event);\n        deletedConnections.forEach((connection) => {\n            this.connectionDeleted.emit({target: connection, model});\n        });\n    }\n\n    /** Clears any active selection in the scene. */\n    public clearSelection(): void {\n        this.selectionService.clearSelection();\n    }\n\n    protected onScaleChange(scale: number): void {\n        this.store.setScaleValue(scale);\n        this.scale.emit(scale);\n    }\n\n    protected onConnectionCreated(event: DfEvent<DfDataConnection>): void {\n        this.connectionCreated.emit(event);\n    }\n\n    protected onConnectionDeleted(event: DfEvent<DfDataConnection>): void {\n        this.connectionDeleted.emit(event);\n    }\n\n    protected onNodeDeleted(event: DfEvent<DfDataNode>): void {\n        this.nodeDeleted.emit(event);\n    }\n\n    protected onNodeMoved(event: DfEvent<DfDataNode>): void {\n        this.nodeMoved.emit(event);\n    }\n\n    protected onResize(event: readonly ResizeObserverEntry[]): void {\n        const entry = event[0];\n\n        if (!entry) {\n            return;\n        }\n\n        const {width, height} = entry.contentRect;\n\n        this.$rootReady.set(Boolean(width && height));\n        this.scheduleViewportFraming();\n    }\n\n    protected onFocusOut(event: FocusEvent): void {\n        const nextTarget = event.relatedTarget;\n\n        if (\n            nextTarget instanceof Node &&\n            this.hostElement.nativeElement.contains(nextTarget)\n        ) {\n            return;\n        }\n\n        if (this.activePointers.size) {\n            return;\n        }\n\n        if (nextTarget === null) {\n            const version = this.interactionVersion;\n\n            queueMicrotask(() => {\n                if (\n                    !this.destroyed &&\n                    version === this.interactionVersion &&\n                    !this.hostElement.nativeElement.contains(\n                        this.hostElement.nativeElement.ownerDocument.activeElement,\n                    )\n                ) {\n                    this.markAsTouched();\n                }\n            });\n\n            return;\n        }\n\n        this.markAsTouched();\n    }\n\n    protected onPointerDown(event: PointerEvent): void {\n        if (\n            this.interactionState.editingDisabled() ||\n            this.isFocusableDescendant(event.target)\n        ) {\n            return;\n        }\n\n        this.activePointers.add(event.pointerId);\n    }\n\n    protected onPointerEnd(event: PointerEvent): void {\n        if (!this.activePointers.delete(event.pointerId)) {\n            return;\n        }\n\n        if (!this.interactionState.editingDisabled()) {\n            const version = this.interactionVersion;\n\n            // Descendant document listeners finish the drag before the form's\n            // blur/touch boundary flushes a pending value.\n            queueMicrotask(() => {\n                if (!this.destroyed && version === this.interactionVersion) {\n                    this.markAsTouched();\n                }\n            });\n        }\n    }\n\n    protected isTouched(): boolean {\n        return this.touched() || this.controlStatus?.touched === true;\n    }\n\n    protected markAsTouched(): void {\n        if (!this.disabled()) {\n            const version = this.interactionVersion;\n\n            this.flushPendingChange();\n\n            if (version === this.interactionVersion && !this.destroyed) {\n                this.onTouched();\n            }\n        }\n    }\n\n    private watchFormChanges(): void {\n        this.cancelPendingChanges$\n            .pipe(\n                startWith(undefined),\n                switchMap(() =>\n                    this.form.valueChanges.pipe(\n                        tap((value) => {\n                            this.pendingChange = value;\n                            this.store.updateDataModel(value);\n                        }),\n                        debounceTime(10),\n                    ),\n                ),\n                takeUntilDestroyed(this.destroyRef),\n            )\n            .subscribe(() => this.flushPendingChange());\n    }\n\n    private flushPendingChange(): void {\n        const value = this.pendingChange;\n\n        this.cancelPendingChange();\n\n        if (value) {\n            this.onChange(value);\n        }\n    }\n\n    private cancelPendingChange(): void {\n        this.pendingChange = undefined;\n        this.cancelPendingChanges$.next();\n    }\n\n    private onChange: (value: DfDataModel) => void = (_: DfDataModel) => {};\n\n    private onTouched: () => void = () => {};\n\n    private cancelInteraction(): void {\n        this.interactionVersion += 1;\n        this.activePointers.clear();\n        this.interactionState.cancelEditing();\n    }\n\n    private applyModel(model: DfDataModel, emitChange: boolean): void {\n        this.cancelPendingChange();\n        this.form.setValue(model, {emitEvent: false});\n        this.store.updateDataModel(model);\n        this.connectionsService.setConnections(model.connections);\n\n        if (emitChange) {\n            this.onChange(model);\n        }\n    }\n\n    private isFocusableDescendant(target: EventTarget | null): boolean {\n        if (!(target instanceof Element)) {\n            return false;\n        }\n\n        const focusable = target.closest(\n            'input, textarea, select, button, a[href], [contenteditable=\"true\"], [tabindex]:not([tabindex=\"-1\"])',\n        );\n\n        return Boolean(focusable && focusable !== this.hostElement.nativeElement);\n    }\n\n    private isSameConnection(left: DfDataConnection, right: DfDataConnection): boolean {\n        return (\n            left.source.nodeId === right.source.nodeId &&\n            left.source.connectorId === right.source.connectorId &&\n            left.target.nodeId === right.target.nodeId &&\n            left.target.connectorId === right.target.connectorId\n        );\n    }\n\n    private scheduleViewportFraming(retry = false): void {\n        if (\n            this.panZoomOptions.leftPosition === null &&\n            this.panZoomOptions.topPosition === null\n        ) {\n            return;\n        }\n\n        if (!retry) {\n            this.shouldFrameViewport = true;\n            this.viewportFrameRetryCount = 0;\n        }\n\n        if (!this.$rootReady()) {\n            return;\n        }\n\n        if (typeof requestAnimationFrame !== 'function') {\n            this.applyViewportFraming();\n\n            return;\n        }\n\n        this.cancelViewportFraming();\n        this.frameRequestId = requestAnimationFrame(() => {\n            this.frameRequestId = requestAnimationFrame(() => {\n                this.frameRequestId = null;\n                this.applyViewportFraming();\n            });\n        });\n    }\n\n    private cancelViewportFraming(): void {\n        if (this.frameRequestId !== null && typeof cancelAnimationFrame === 'function') {\n            cancelAnimationFrame(this.frameRequestId);\n            this.frameRequestId = null;\n        }\n    }\n\n    private applyViewportFraming(): void {\n        if (!this.shouldFrameViewport || !this.$rootReady()) {\n            return;\n        }\n\n        const targetRect = this.getViewportFramingTargetRect();\n\n        if (!targetRect) {\n            this.retryViewportFraming();\n\n            return;\n        }\n\n        const viewportSize = {\n            width: this.hostElement.nativeElement.offsetWidth,\n            height: this.hostElement.nativeElement.offsetHeight,\n        };\n\n        if (!viewportSize.width || !viewportSize.height) {\n            this.retryViewportFraming();\n\n            return;\n        }\n\n        const zeroPoint = getViewportZeroPoint(viewportSize, {\n            leftPosition: this.panZoomOptions.leftPosition,\n            topPosition: this.panZoomOptions.topPosition,\n        });\n        const nextCamera = clampByUsableRect(\n            alignCameraToWorldRect(\n                this.panZoomService.snapshot(),\n                targetRect,\n                viewportSize,\n                {\n                    leftPosition: this.panZoomOptions.leftPosition,\n                    topPosition: this.panZoomOptions.topPosition,\n                },\n            ),\n            this.panZoomService.usableRect(),\n            viewportSize,\n            zeroPoint,\n        );\n\n        this.shouldFrameViewport = false;\n        this.panZoomService.setCamera(nextCamera);\n        this.cdr.detectChanges();\n    }\n\n    private retryViewportFraming(): void {\n        if (this.viewportFrameRetryCount >= this.maxViewportFrameRetries) {\n            return;\n        }\n\n        this.viewportFrameRetryCount += 1;\n        this.scheduleViewportFraming(true);\n    }\n\n    private getViewportFramingTargetRect(): DfPanZoomWorldRectBounds | null {\n        const nodes = this.form.value?.nodes ?? [];\n\n        if (!nodes.length) {\n            return null;\n        }\n\n        const startNode = nodes.find((node) => node.startNode === true);\n\n        return this.panZoomService.getBoundsForNodeIds(\n            startNode ? [startNode.id] : nodes.map(({id}) => id),\n        );\n    }\n}\n","<df-pan-zoom (scale)=\"onScaleChange($event)\">\n    @if ($rootReady()) {\n        <df-scene\n            [formControl]=\"form\"\n            [touched]=\"isTouched()\"\n            (connectionCreated)=\"onConnectionCreated($event)\"\n            (connectionDeleted)=\"onConnectionDeleted($event)\"\n            (connectionSelected)=\"connectionSelected.emit($event)\"\n            (nodeDeleted)=\"onNodeDeleted($event)\"\n            (nodeMoved)=\"onNodeMoved($event)\"\n            (nodeSelected)=\"nodeSelected.emit($event)\"\n        />\n    }\n</df-pan-zoom>\n","import {\n    ChangeDetectorRef,\n    Directive,\n    inject,\n    input,\n    output,\n    viewChildren,\n} from '@angular/core';\n\nimport {DfInputComponent, DfOutputComponent} from './components/connectors';\n\n/**\n * Base abstract class for DrawFlow nodes.\n * Provides common functionality and structure for all node types in the flow diagram.\n */\n@Directive({standalone: true})\nexport abstract class DrawFlowBaseNode {\n    private readonly cdr = inject(ChangeDetectorRef);\n    /**\n     * Collection of input connectors for this node.\n     * Accessible from outside to monitor changes in the number of inputs.\n     */\n    public readonly inputs = viewChildren(DfInputComponent);\n\n    /**\n     * Collection of output connectors for this node.\n     * Accessible from outside to monitor changes in the number of outputs.\n     */\n    public readonly outputs = viewChildren(DfOutputComponent);\n\n    public readonly connectorsUpdated = output();\n\n    /**\n     * Unique identifier for the node.\n     * Can be used to create connector names in format `${nodeId}-${uniqConnectorId}`.\n     * @default ''\n     */\n    public readonly nodeIdSignal = input('', {alias: 'nodeId'});\n\n    /**\n     * Metadata for the node.\n     * Contains type information and other node-specific data.\n     */\n    public readonly modelSignal = input.required<Record<string, any> & {type: string}>({\n        alias: 'model',\n    });\n\n    /**\n     * Indicates if this node is a starting node in the flow.\n     * Can be used to apply special styling or behavior for start nodes.\n     * @default false\n     */\n    public readonly startNodeSignal = input(false, {alias: 'startNode'});\n\n    /**\n     * Indicates if this node is an ending node in the flow.\n     * Can be used to hide output connectors or apply special styling.\n     * @default false\n     */\n    public readonly endNodeSignal = input(false, {alias: 'endNode'});\n\n    /**\n     * Selection state of the node.\n     * Changes when the node is clicked or deselected.\n     * The editor applies the visual state to the node wrapper.\n     * @default false\n     */\n    public readonly selectedSignal = input(false, {alias: 'selected'});\n\n    /**\n     * Validation state of the node.\n     * Supplied by graph validators. Override `invalidState` to combine\n     * this input with local validation before the editor styles the wrapper.\n     * @default false\n     */\n    public readonly invalidSignal = input(false, {alias: 'invalid'});\n\n    /** Form-level disabled state. Custom node controls may bind to this explicitly. */\n    public readonly disabledSignal = input(false, {alias: 'disabled'});\n\n    /** Form-level readonly state. Custom node controls may bind to this explicitly. */\n    public readonly readonlySignal = input(false, {alias: 'readonly'});\n\n    public get nodeId(): string {\n        return this.nodeIdSignal();\n    }\n\n    public get model(): Record<string, any> & {type: string} {\n        return this.modelSignal();\n    }\n\n    public get startNode(): boolean {\n        return this.startNodeSignal();\n    }\n\n    public get endNode(): boolean {\n        return this.endNodeSignal();\n    }\n\n    public get selected(): boolean {\n        return this.selectedSignal();\n    }\n\n    public get invalid(): boolean {\n        return this.invalidState;\n    }\n\n    public get disabled(): boolean {\n        return this.disabledSignal();\n    }\n\n    public get readonly(): boolean {\n        return this.readonlySignal();\n    }\n\n    public markForCheck(): void {\n        this.cdr.markForCheck();\n    }\n\n    /**\n     * Effective validation state read by the editor wrapper.\n     * Override to combine graph validation with local component state,\n     * for example when a form inside the node is invalid.\n     */\n    protected get invalidState(): boolean {\n        return this.invalidSignal();\n    }\n}\n","import {type DfDataConnection, type DfId} from '../../ng-draw-flow.interfaces';\n\n/**\n * Builds an adjacency map from a list of connections\n * @param connections List of graph connections\n * @returns Object with adjacency map and array of unique node IDs\n */\nexport function buildAdjacencyMap(connections: DfDataConnection[]): {\n    adjacencyMap: Map<DfId, Set<DfId>>;\n    nodeIds: DfId[];\n} {\n    const adjacencyMap = new Map<DfId, Set<DfId>>();\n    const nodeIdsSet = new Set<DfId>();\n\n    connections.forEach((connection) => {\n        const sourceNodeId = connection.source.nodeId;\n        const targetNodeId = connection.target.nodeId;\n\n        nodeIdsSet.add(sourceNodeId);\n        nodeIdsSet.add(targetNodeId);\n\n        if (!adjacencyMap.has(sourceNodeId)) {\n            adjacencyMap.set(sourceNodeId, new Set<DfId>());\n        }\n\n        adjacencyMap.get(sourceNodeId)!.add(targetNodeId);\n    });\n\n    return {\n        adjacencyMap,\n        nodeIds: Array.from(nodeIdsSet),\n    };\n}\n\n/**\n * Iterative function to find cycle nodes\n * @param adjacencyMap Adjacency map\n * @param nodeIds Array of node IDs\n * @returns Array of node IDs that form a cycle, or empty array if no cycle is found\n */\nexport function findCycleNodes(\n    adjacencyMap: Map<DfId, Set<DfId>>,\n    nodeIds: DfId[],\n): DfId[] {\n    // Node states: 0 - not visited, 1 - in current path, 2 - fully processed\n    const nodeStates = new Map<DfId, number>();\n\n    // Initialize all nodes as not visited\n    nodeIds.forEach((nodeId) => {\n        nodeStates.set(nodeId, 0);\n    });\n\n    // Check each node as a possible starting point\n    for (const nodeId of nodeIds) {\n        if (nodeStates.get(nodeId) !== 0) {\n            continue;\n        }\n\n        const cycleResult = checkNodeForCycle(nodeId, adjacencyMap, nodeStates);\n\n        if (cycleResult.length > 0) {\n            return cycleResult;\n        }\n    }\n\n    return []; // No cycle found\n}\n\n/**\n * Helper function to check a specific node for cycles\n * @param startNodeId Starting node ID\n * @param adjacencyMap Adjacency map\n * @param nodeStates Map of node states\n * @returns Array of node IDs that form a cycle, or empty array if no cycle is found\n */\nfunction checkNodeForCycle(\n    startNodeId: DfId,\n    adjacencyMap: Map<DfId, Set<DfId>>,\n    nodeStates: Map<DfId, number>,\n): DfId[] {\n    // Use a stack for iterative DFS and a path array to track the current path\n    const stack: Array<{nodeId: DfId; processed: boolean}> = [\n        {nodeId: startNodeId, processed: false},\n    ];\n    const path: DfId[] = [];\n\n    while (stack.length > 0) {\n        const {nodeId, processed} = stack[stack.length - 1]!;\n\n        if (processed) {\n            // Node is fully processed\n            nodeStates.set(nodeId, 2);\n            stack.pop();\n\n            // Remove the node from the current path when backtracking\n            if (path.length > 0 && path[path.length - 1] === nodeId) {\n                path.pop();\n            }\n\n            continue;\n        }\n\n        // Another pending path may already have completed this node.\n        if (nodeStates.get(nodeId) !== 0) {\n            stack.pop();\n\n            continue;\n        }\n\n        // Mark the node as being in the current path\n        nodeStates.set(nodeId, 1);\n        stack[stack.length - 1]!.processed = true;\n        path.push(nodeId);\n\n        // Process neighbors\n        const cycleFound = processNeighbors({\n            nodeId,\n            adjacencyMap,\n            nodeStates,\n            path,\n            stack,\n        });\n\n        if (cycleFound.length > 0) {\n            return cycleFound;\n        }\n    }\n\n    return []; // No cycle found from this starting node\n}\n\ninterface ProcessNeighborsContext {\n    /** Current node ID */\n    nodeId: DfId;\n    /** Map of adjacency relationships between nodes */\n    adjacencyMap: Map<DfId, Set<DfId>>;\n    /** Map of node states (0 = unvisited, 1 = visiting, 2 = visited) */\n    nodeStates: Map<DfId, number>;\n    /** Current path */\n    path: DfId[];\n    /** DFS stack */\n    stack: Array<{nodeId: DfId; processed: boolean}>;\n}\n\n/**\n * Processes all neighbors of a given node during DFS.\n *\n * @param context Object containing traversal context, adjacency map and state tracking.\n * @returns Array of node IDs forming a cycle, or empty array if no cycle is found.\n */\nfunction processNeighbors({\n    nodeId,\n    adjacencyMap,\n    nodeStates,\n    path,\n    stack,\n}: ProcessNeighborsContext): DfId[] {\n    const neighbors = adjacencyMap.get(nodeId) || new Set<DfId>();\n\n    for (const neighbor of neighbors) {\n        const neighborState = nodeStates.get(neighbor);\n\n        if (neighborState === 1) {\n            // Cycle found - extract the cycle nodes from the path\n            const cycleStartIndex = path.indexOf(neighbor);\n\n            return path.slice(cycleStartIndex).concat([neighbor]);\n        }\n\n        if (neighborState === 0) {\n            // Add unvisited node to the stack\n            stack.push({nodeId: neighbor, processed: false});\n        }\n    }\n\n    return []; // No cycle found among neighbors\n}\n\n/**\n * Generates a collision-free key for the directed node topology.\n * @param connections Array of connections\n * @returns Serialized endpoint tuples; connector metadata cannot affect cycles.\n */\nexport function generateConnectionsKey(connections: DfDataConnection[]): string {\n    return JSON.stringify(\n        connections.map(({source, target}) => [source.nodeId, target.nodeId]),\n    );\n}\n","import {\n    type AbstractControl,\n    type ValidationErrors,\n    type ValidatorFn,\n} from '@angular/forms';\n\nimport {type DfDataModel, type DfId} from '../../ng-draw-flow.interfaces';\nimport {\n    type DfNodeValidationError,\n    type DfSignalValidator,\n} from '../graph-validation.interfaces';\nimport {buildAdjacencyMap, findCycleNodes, generateConnectionsKey} from './helpers';\n\nexport interface DfCycleDetectionError {\n    readonly hasCycle: true;\n    readonly cycleNodes: readonly DfId[];\n}\n\n/** Runs cycle detection without depending on an Angular form control. */\nexport function dfValidateCycles(\n    model: DfDataModel | null | undefined,\n): DfCycleDetectionError | null {\n    if (!model?.connections.length) {\n        return null;\n    }\n\n    const {adjacencyMap, nodeIds} = buildAdjacencyMap(model.connections);\n    const cycleNodes = findCycleNodes(adjacencyMap, nodeIds);\n\n    return cycleNodes.length ? {hasCycle: true, cycleNodes} : null;\n}\n\n/**\n * Validator for checking cycles in a graph\n *\n * ### Validation error shape\n * ```ts\n * {\n *   hasCycle: true,\n *   cycleNodes: DfId[] // array of nodeIds that form a cycle\n * }\n * ```\n * @returns ValidatorFn that returns an error if a cycle is detected in the graph\n */\nexport function dfCycleDetectionValidator(): ValidatorFn {\n    const validate = createCachedCycleValidator();\n\n    return (control: AbstractControl): ValidationErrors | null => {\n        return validate(readControlModel(control));\n    };\n}\n\n/** Creates a validator accepted directly by Signal Forms `validate()`. */\nexport function dfCycleDetectionSignalValidator(): DfSignalValidator {\n    const validate = createCachedCycleValidator();\n\n    return ({value}) => toSignalError(validate(value()));\n}\n\nfunction createCachedCycleValidator(): (\n    model: DfDataModel | null | undefined,\n) => DfCycleDetectionError | null {\n    let previousConnectionsKey: string | null = null;\n    let previousResult: DfCycleDetectionError | null = null;\n\n    return (model) => {\n        if (!model?.connections.length) {\n            previousConnectionsKey = null;\n            previousResult = null;\n\n            return null;\n        }\n\n        const currentConnectionsKey = generateConnectionsKey(model.connections);\n\n        if (previousConnectionsKey === currentConnectionsKey) {\n            return previousResult;\n        }\n\n        previousConnectionsKey = currentConnectionsKey;\n        previousResult = dfValidateCycles(model);\n\n        return previousResult;\n    };\n}\n\nfunction toSignalError(\n    error: DfCycleDetectionError | null,\n): DfNodeValidationError | undefined {\n    return error\n        ? {\n              kind: 'hasCycle',\n              nodeIds: error.cycleNodes,\n          }\n        : undefined;\n}\n\nfunction readControlModel(control: AbstractControl): DfDataModel | null | undefined {\n    const value: unknown = control.value;\n\n    return isDataModel(value) ? value : null;\n}\n\nfunction isDataModel(value: unknown): value is DfDataModel {\n    if (typeof value !== 'object' || value === null) {\n        return false;\n    }\n\n    const candidate = value as Partial<DfDataModel>;\n\n    return Array.isArray(candidate.nodes) && Array.isArray(candidate.connections);\n}\n","import {\n    type AbstractControl,\n    type ValidationErrors,\n    type ValidatorFn,\n} from '@angular/forms';\n\nimport {\n    type DfDataConnection,\n    type DfDataInitialNode,\n    type DfDataModel,\n    type DfDataNode,\n    type DfId,\n} from '../../ng-draw-flow.interfaces';\nimport {\n    type DfNodeValidationError,\n    type DfSignalValidator,\n} from '../graph-validation.interfaces';\n\nexport interface DfIsolatedNodesError {\n    readonly hasIsolatedNodes: true;\n    readonly isolatedNodes: readonly DfId[];\n}\n\n/** Finds disconnected nodes without depending on an Angular form control. */\nexport function dfValidateIsolatedNodes(\n    model: DfDataModel | null | undefined,\n): DfIsolatedNodesError | null {\n    if (!model?.nodes.length) {\n        return null;\n    }\n\n    const connectedIds = new Set<DfId>();\n\n    model.connections.forEach((connection: DfDataConnection) => {\n        connectedIds.add(connection.source.nodeId);\n        connectedIds.add(connection.target.nodeId);\n    });\n\n    const isolatedNodes = model.nodes\n        .filter((node: DfDataInitialNode | DfDataNode) => !connectedIds.has(node.id))\n        .map((node) => node.id);\n\n    return isolatedNodes.length ? {hasIsolatedNodes: true, isolatedNodes} : null;\n}\n\n/**\n * Validator that checks for *isolated* (disconnected) nodes — nodes that do **not** appear in any connection.\n *\n * ### Validation error shape\n * ```ts\n * {\n *   hasIsolatedNodes: boolean;\n *   isolatedNodes: DfId[] // array of nodeIds without connections\n * }\n * ```\n * When there are **no** isolated nodes, it returns `null` so the control is valid.\n */\nexport function dfIsolatedNodesValidator(): ValidatorFn {\n    return (control: AbstractControl): ValidationErrors | null => {\n        return dfValidateIsolatedNodes(readControlModel(control));\n    };\n}\n\n/** Creates a validator accepted directly by Signal Forms `validate()`. */\nexport function dfIsolatedNodesSignalValidator(): DfSignalValidator {\n    return ({value}) => toSignalError(dfValidateIsolatedNodes(value()));\n}\n\nfunction toSignalError(\n    error: DfIsolatedNodesError | null,\n): DfNodeValidationError | undefined {\n    return error\n        ? {\n              kind: 'hasIsolatedNodes',\n              nodeIds: error.isolatedNodes,\n          }\n        : undefined;\n}\n\nfunction readControlModel(control: AbstractControl): DfDataModel | null | undefined {\n    const value: unknown = control.value;\n\n    return isDataModel(value) ? value : null;\n}\n\nfunction isDataModel(value: unknown): value is DfDataModel {\n    if (typeof value !== 'object' || value === null) {\n        return false;\n    }\n\n    const candidate = value as Partial<DfDataModel>;\n\n    return Array.isArray(candidate.nodes) && Array.isArray(candidate.connections);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["readControlModel","toSignalError","isDataModel"],"mappings":"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"}