@foblex/flow 19.1.6 → 19.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, inject, Injectable, ElementRef, DestroyRef, Injector, input, effect, untracked, Directive, signal, numberAttribute, model, booleanAttribute, ChangeDetectionStrategy, Component, viewChild, Input, computed, contentChildren, contentChild, Renderer2, output, NgZone, ViewContainerRef, TemplateRef, runInInjectionContext, EventEmitter, Output, afterNextRender, NgModule } from '@angular/core';
2
+ import { InjectionToken, inject, Injectable, ElementRef, DestroyRef, Injector, input, effect, untracked, Directive, signal, computed, numberAttribute, model, booleanAttribute, ChangeDetectionStrategy, Component, viewChild, Input, contentChildren, contentChild, Renderer2, output, NgZone, ViewContainerRef, TemplateRef, runInInjectionContext, EventEmitter, Output, afterNextRender, NgModule } from '@angular/core';
3
3
  import { TransformModelExtensions, PointExtensions, RectExtensions, GetIntersections, RoundedRect, Point, LineExtensions, SizeExtensions, setRectToElement, adjustRectToMinSize, setRectToViewBox } from '@foblex/2d';
4
4
  import { __decorate } from 'tslib';
5
5
  import { FExecutionRegister, FMediator } from '@foblex/mediator';
@@ -980,11 +980,13 @@ class FitToFlowRequest {
980
980
  toCenter;
981
981
  animated;
982
982
  emitCanvasChange;
983
+ maxScale;
983
984
  static fToken = Symbol('FitToFlowRequest');
984
- constructor(toCenter, animated, emitCanvasChange = true) {
985
+ constructor(toCenter, animated, emitCanvasChange = true, maxScale) {
985
986
  this.toCenter = toCenter;
986
987
  this.animated = animated;
987
988
  this.emitCanvasChange = emitCanvasChange;
989
+ this.maxScale = maxScale;
988
990
  }
989
991
  }
990
992
 
@@ -997,16 +999,16 @@ let FitToFlow = class FitToFlow {
997
999
  return this._store.transform;
998
1000
  }
999
1001
  _mediator = inject(FMediator);
1000
- handle({ toCenter, animated, emitCanvasChange }) {
1002
+ handle({ toCenter, animated, emitCanvasChange, maxScale }) {
1001
1003
  const fNodesRect = this._mediator.execute(new CalculateNodesBoundingBoxRequest()) ||
1002
1004
  RectExtensions.initialize();
1003
1005
  if (fNodesRect.width === 0 || fNodesRect.height === 0) {
1004
1006
  return;
1005
1007
  }
1006
- this.fitToParent(fNodesRect, RectExtensions.fromElement(this._store.flowHost), this._store.nodes.getAll().map((x) => x._position), toCenter);
1008
+ this.fitToParent(fNodesRect, RectExtensions.fromElement(this._store.flowHost), this._store.nodes.getAll().map((x) => x._position), toCenter, maxScale);
1007
1009
  this._mediator.execute(new RedrawCanvasWithAnimationRequest(animated, ECanvasRedrawContext.VIEWPORT_ONLY, emitCanvasChange));
1008
1010
  }
1009
- fitToParent(rect, parentRect, points, toCenter) {
1011
+ fitToParent(rect, parentRect, points, toCenter, maxScale) {
1010
1012
  this._transform.scaledPosition = PointExtensions.initialize();
1011
1013
  this._transform.position = this._getZeroPositionWithoutScale(points);
1012
1014
  const itemsContainerWidth = rect.width / this._transform.scale + toCenter.x;
@@ -1016,6 +1018,11 @@ let FitToFlow = class FitToFlow {
1016
1018
  (itemsContainerWidth < parentRect.width && itemsContainerHeight < parentRect.height)) {
1017
1019
  this._transform.scale = Math.min(parentRect.width / itemsContainerWidth, parentRect.height / itemsContainerHeight);
1018
1020
  }
1021
+ // A small bounding box (a couple of nodes) would otherwise be magnified to
1022
+ // fill the viewport; the optional cap keeps the content readable (issue #147).
1023
+ if (maxScale != null && this._transform.scale > maxScale) {
1024
+ this._transform.scale = maxScale;
1025
+ }
1019
1026
  const newX = (parentRect.width - itemsContainerWidth * this._transform.scale) / 2 -
1020
1027
  this._transform.position.x * this._transform.scale;
1021
1028
  const newY = (parentRect.height - itemsContainerHeight * this._transform.scale) / 2 -
@@ -1971,6 +1978,21 @@ const F_CONNECTION_WAYPOINTS = new InjectionToken('F_CONNECTION_WAYPOINTS');
1971
1978
  class FConnectionWaypointsBase {
1972
1979
  hostElement = inject((ElementRef)).nativeElement;
1973
1980
  candidates = signal([], ...(ngDevMode ? [{ debugName: "candidates" }] : []));
1981
+ /**
1982
+ * Handle display positions supplied by the line builder (for example the
1983
+ * bend apex of a rounded segment corner). The waypoint model itself is
1984
+ * untouched — dragging and events always operate on the real waypoints.
1985
+ */
1986
+ handles = signal([], ...(ngDevMode ? [{ debugName: "handles" }] : []));
1987
+ /**
1988
+ * Where the waypoint handles are drawn and hit-tested: the builder-supplied
1989
+ * positions when they cover every waypoint, otherwise the waypoints
1990
+ * themselves.
1991
+ */
1992
+ displayedWaypoints = computed(() => {
1993
+ const handles = this.handles();
1994
+ return handles.length === this.waypoints().length ? handles : this.waypoints();
1995
+ }, ...(ngDevMode ? [{ debugName: "displayedWaypoints" }] : []));
1974
1996
  _activeIndex = 0;
1975
1997
  _waypoints = [];
1976
1998
  insert(candidate) {
@@ -2005,7 +2027,11 @@ function findWaypointCandidate(connection, position) {
2005
2027
  function findExistingWaypoint(connection, position) {
2006
2028
  const component = connection.fWaypoints();
2007
2029
  const radius = component?.radius() || 8;
2008
- return component?.waypoints().find((x) => isPointerInsidePoint(position, x, radius));
2030
+ // Handles can be drawn slightly off the raw waypoint (on the bend apex of a
2031
+ // rounded corner), so hit-test where they are rendered but hand back the
2032
+ // real waypoint — dragging always operates on the model value.
2033
+ const index = (component?.displayedWaypoints() ?? []).findIndex((x) => isPointerInsidePoint(position, x, radius));
2034
+ return index >= 0 ? component?.waypoints()[index] : undefined;
2009
2035
  }
2010
2036
 
2011
2037
  function pickWaypoint(connections, position) {
@@ -2060,13 +2086,13 @@ class FConnectionWaypoints extends FConnectionWaypointsBase {
2060
2086
  this._notifyDataChanged();
2061
2087
  }
2062
2088
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: FConnectionWaypoints, deps: null, target: i0.ɵɵFactoryTarget.Component });
2063
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.9", type: FConnectionWaypoints, isStandalone: true, selector: "f-connection-waypoints", inputs: { radius: { classPropertyName: "radius", publicName: "radius", isSignal: true, isRequired: false, transformFunction: null }, waypoints: { classPropertyName: "waypoints", publicName: "waypoints", isSignal: true, isRequired: false, transformFunction: null }, visibility: { classPropertyName: "visibility", publicName: "visibility", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { waypoints: "waypointsChange" }, host: { classAttribute: "f-component f-connection-waypoints" }, providers: [{ provide: F_CONNECTION_WAYPOINTS, useExisting: FConnectionWaypoints }], usesInheritance: true, ngImport: i0, template: "@if (visibility()) {\n <svg xmlns=\"http://www.w3.org/2000/svg\">\n <g>\n @for (candidate of candidates(); track $index) {\n <circle\n [attr.r]=\"radius()\"\n class=\"f-candidate\"\n [attr.cx]=\"candidate.x\"\n [attr.cy]=\"candidate.y\"\n ></circle>\n }\n @for (point of waypoints(); track $index) {\n <circle\n [attr.r]=\"radius()\"\n (contextmenu)=\"remove($index, $event)\"\n class=\"f-waypoint\"\n [attr.cx]=\"point.x\"\n [attr.cy]=\"point.y\"\n ></circle>\n }\n </g>\n </svg>\n}\n\n", styles: [":host{pointer-events:none;position:absolute}svg{display:block;vertical-align:middle;position:absolute;overflow:visible}circle{pointer-events:visible}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2089
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.9", type: FConnectionWaypoints, isStandalone: true, selector: "f-connection-waypoints", inputs: { radius: { classPropertyName: "radius", publicName: "radius", isSignal: true, isRequired: false, transformFunction: null }, waypoints: { classPropertyName: "waypoints", publicName: "waypoints", isSignal: true, isRequired: false, transformFunction: null }, visibility: { classPropertyName: "visibility", publicName: "visibility", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { waypoints: "waypointsChange" }, host: { classAttribute: "f-component f-connection-waypoints" }, providers: [{ provide: F_CONNECTION_WAYPOINTS, useExisting: FConnectionWaypoints }], usesInheritance: true, ngImport: i0, template: "@if (visibility()) {\n<svg xmlns=\"http://www.w3.org/2000/svg\">\n <g>\n @for (candidate of candidates(); track $index) {\n <circle\n [attr.r]=\"radius()\"\n class=\"f-candidate\"\n [attr.cx]=\"candidate.x\"\n [attr.cy]=\"candidate.y\"\n ></circle>\n } @for (point of displayedWaypoints(); track $index) {\n <circle\n [attr.r]=\"radius()\"\n (contextmenu)=\"remove($index, $event)\"\n class=\"f-waypoint\"\n [attr.cx]=\"point.x\"\n [attr.cy]=\"point.y\"\n ></circle>\n }\n </g>\n</svg>\n}\n", styles: [":host{pointer-events:none;position:absolute}svg{display:block;vertical-align:middle;position:absolute;overflow:visible}circle{pointer-events:visible}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2064
2090
  }
2065
2091
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: FConnectionWaypoints, decorators: [{
2066
2092
  type: Component,
2067
2093
  args: [{ selector: 'f-connection-waypoints', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, host: {
2068
2094
  class: 'f-component f-connection-waypoints',
2069
- }, providers: [{ provide: F_CONNECTION_WAYPOINTS, useExisting: FConnectionWaypoints }], template: "@if (visibility()) {\n <svg xmlns=\"http://www.w3.org/2000/svg\">\n <g>\n @for (candidate of candidates(); track $index) {\n <circle\n [attr.r]=\"radius()\"\n class=\"f-candidate\"\n [attr.cx]=\"candidate.x\"\n [attr.cy]=\"candidate.y\"\n ></circle>\n }\n @for (point of waypoints(); track $index) {\n <circle\n [attr.r]=\"radius()\"\n (contextmenu)=\"remove($index, $event)\"\n class=\"f-waypoint\"\n [attr.cx]=\"point.x\"\n [attr.cy]=\"point.y\"\n ></circle>\n }\n </g>\n </svg>\n}\n\n", styles: [":host{pointer-events:none;position:absolute}svg{display:block;vertical-align:middle;position:absolute;overflow:visible}circle{pointer-events:visible}\n"] }]
2095
+ }, providers: [{ provide: F_CONNECTION_WAYPOINTS, useExisting: FConnectionWaypoints }], template: "@if (visibility()) {\n<svg xmlns=\"http://www.w3.org/2000/svg\">\n <g>\n @for (candidate of candidates(); track $index) {\n <circle\n [attr.r]=\"radius()\"\n class=\"f-candidate\"\n [attr.cx]=\"candidate.x\"\n [attr.cy]=\"candidate.y\"\n ></circle>\n } @for (point of displayedWaypoints(); track $index) {\n <circle\n [attr.r]=\"radius()\"\n (contextmenu)=\"remove($index, $event)\"\n class=\"f-waypoint\"\n [attr.cx]=\"point.x\"\n [attr.cy]=\"point.y\"\n ></circle>\n }\n </g>\n</svg>\n}\n", styles: [":host{pointer-events:none;position:absolute}svg{display:block;vertical-align:middle;position:absolute;overflow:visible}circle{pointer-events:visible}\n"] }]
2070
2096
  }], propDecorators: { radius: [{ type: i0.Input, args: [{ isSignal: true, alias: "radius", required: false }] }], waypoints: [{ type: i0.Input, args: [{ isSignal: true, alias: "waypoints", required: false }] }, { type: i0.Output, args: ["waypointsChange"] }], visibility: [{ type: i0.Input, args: [{ isSignal: true, alias: "visibility", required: false }] }] } });
2071
2097
 
2072
2098
  var EFMarkerType;
@@ -2642,6 +2668,29 @@ function dist(a, b) {
2642
2668
  return Math.hypot(b.x - a.x, b.y - a.y);
2643
2669
  }
2644
2670
 
2671
+ /**
2672
+ * Control point for a cubic segment end that lies on an intermediate waypoint.
2673
+ * The tangent runs from the previous toward the next neighbor (Catmull-Rom
2674
+ * style), so the two segments meeting at the waypoint share one tangent
2675
+ * direction and the curve passes through it smoothly. Connector sides shape
2676
+ * only the real endpoints of the connection, never the waypoints.
2677
+ *
2678
+ * `distance` is positive for an outgoing control point and negative for an
2679
+ * incoming one.
2680
+ */
2681
+ function calculateSmoothControlPoint(anchor, previous, next, distance) {
2682
+ const dx = next.x - previous.x;
2683
+ const dy = next.y - previous.y;
2684
+ const length = Math.hypot(dx, dy);
2685
+ if (length === 0) {
2686
+ return { x: anchor.x, y: anchor.y };
2687
+ }
2688
+ return {
2689
+ x: anchor.x + (dx / length) * distance,
2690
+ y: anchor.y + (dy / length) * distance,
2691
+ };
2692
+ }
2693
+
2645
2694
  function mergePointChains(chains) {
2646
2695
  const out = [];
2647
2696
  for (const chain of chains) {
@@ -2763,13 +2812,19 @@ class CalculateAdaptiveCurveData {
2763
2812
  const clampedOffset = Math.max(0, offset ?? 0);
2764
2813
  const anchors = buildConnectionAnchors(source, target, waypoints);
2765
2814
  const segments = [];
2815
+ // Connector sides shape only the first and the last tangent; at
2816
+ // intermediate waypoints both adjacent segments share one Catmull-Rom
2817
+ // style tangent, so the curve passes through waypoints without kinks.
2766
2818
  for (let i = 0; i < anchors.length - 1; i++) {
2767
2819
  const a = anchors[i];
2768
2820
  const b = anchors[i + 1];
2769
- const h0 = CalculateAdaptiveCurveData._handleLength(a, b, sourceSide, clampedOffset);
2770
- const h3 = CalculateAdaptiveCurveData._handleLength(b, a, targetSide, clampedOffset);
2771
- const c1 = CalculateAdaptiveCurveData._softControl(sourceSide, a, b, h0);
2772
- const c2 = CalculateAdaptiveCurveData._softControl(targetSide, b, a, h3);
2821
+ const handle = Math.hypot(b.x - a.x, b.y - a.y) / 3;
2822
+ const c1 = i === 0
2823
+ ? CalculateAdaptiveCurveData._softControl(sourceSide, a, b, CalculateAdaptiveCurveData._handleLength(a, b, sourceSide, clampedOffset))
2824
+ : calculateSmoothControlPoint(a, anchors[i - 1], b, handle);
2825
+ const c2 = i === anchors.length - 2
2826
+ ? CalculateAdaptiveCurveData._softControl(targetSide, b, a, CalculateAdaptiveCurveData._handleLength(b, a, targetSide, clampedOffset))
2827
+ : calculateSmoothControlPoint(b, a, anchors[i + 2], -handle);
2773
2828
  segments.push({ p0: a, c1, c2, p3: b, chainIndex: i });
2774
2829
  }
2775
2830
  const points = sampleMultiCubicUniform(segments, 12);
@@ -2787,11 +2842,19 @@ class CalculateBezierCurveData {
2787
2842
  handle({ source, sourceSide, target, targetSide, offset, waypoints, }) {
2788
2843
  const anchors = buildConnectionAnchors(source, target, waypoints);
2789
2844
  const segments = [];
2845
+ // Connector sides shape only the first and the last tangent; at
2846
+ // intermediate waypoints both adjacent segments share one Catmull-Rom
2847
+ // style tangent, so the curve passes through waypoints without kinks.
2790
2848
  for (let i = 0; i < anchors.length - 1; i++) {
2791
2849
  const a = anchors[i];
2792
2850
  const b = anchors[i + 1];
2793
- const c1 = getAnglePoint(sourceSide, a, b, offset ?? 0);
2794
- const c2 = getAnglePoint(targetSide, b, a, offset ?? 0);
2851
+ const handle = Math.hypot(b.x - a.x, b.y - a.y) / 3;
2852
+ const c1 = i === 0
2853
+ ? getAnglePoint(sourceSide, a, b, offset ?? 0)
2854
+ : calculateSmoothControlPoint(a, anchors[i - 1], b, handle);
2855
+ const c2 = i === anchors.length - 2
2856
+ ? getAnglePoint(targetSide, b, a, offset ?? 0)
2857
+ : calculateSmoothControlPoint(b, a, anchors[i + 2], -handle);
2795
2858
  segments.push({ p0: a, c1, c2, p3: b, chainIndex: i });
2796
2859
  }
2797
2860
  const points = sampleMultiCubicUniform(segments, 12);
@@ -2894,6 +2957,38 @@ function createSegmentLinePath(points, borderRadius) {
2894
2957
  parts.push(`L ${last.x + END_EPS} ${last.y + END_EPS}`);
2895
2958
  return parts.join(' ');
2896
2959
  }
2960
+ /**
2961
+ * The point of the rendered path closest to corner `b` — the apex of the
2962
+ * rounded bend `getBend` produces for it, or `b` itself when the corner is
2963
+ * rendered sharp. Uses the same bend-size clamping as `getBend`, so the
2964
+ * result always lies on the path.
2965
+ */
2966
+ function calculateCornerApex(a, b, c, size) {
2967
+ if (size <= 0) {
2968
+ return { x: b.x, y: b.y };
2969
+ }
2970
+ const collinearX = Math.abs(a.x - b.x) <= EPS$1 && Math.abs(b.x - c.x) <= EPS$1;
2971
+ const collinearY = Math.abs(a.y - b.y) <= EPS$1 && Math.abs(b.y - c.y) <= EPS$1;
2972
+ if (collinearX || collinearY) {
2973
+ return { x: b.x, y: b.y };
2974
+ }
2975
+ const ab = Math.hypot(b.x - a.x, b.y - a.y);
2976
+ const bc = Math.hypot(c.x - b.x, c.y - b.y);
2977
+ const bendSize = Math.min(ab * 0.5, bc * 0.5, size);
2978
+ if (bendSize < MIN_VISIBLE || ab === 0 || bc === 0) {
2979
+ return { x: b.x, y: b.y };
2980
+ }
2981
+ // The bend is a quadratic from (b - bendSize*din) to (b + bendSize*dout)
2982
+ // with control b; its apex at t = 0.5 is b + 0.25 * bendSize * (dout - din).
2983
+ const dinX = (b.x - a.x) / ab;
2984
+ const dinY = (b.y - a.y) / ab;
2985
+ const doutX = (c.x - b.x) / bc;
2986
+ const doutY = (c.y - b.y) / bc;
2987
+ return {
2988
+ x: b.x + 0.25 * bendSize * (doutX - dinX),
2989
+ y: b.y + 0.25 * bendSize * (doutY - dinY),
2990
+ };
2991
+ }
2897
2992
  function getBend(a, b, c, size) {
2898
2993
  const x = b.x;
2899
2994
  const y = b.y;
@@ -2933,17 +3028,24 @@ const CONNECTOR_SIDE_POINT = {
2933
3028
  [EFConnectableSide.BOTTOM]: PointExtensions.initialize(0, 1),
2934
3029
  [EFConnectableSide.AUTO]: PointExtensions.initialize(0, 0),
2935
3030
  };
3031
+ const HARD_VIOLATION_SCORE = 1000;
3032
+ const ARRIVAL_AXIS_SCORE = 8;
3033
+ const BEND_SCORE = 1;
3034
+ const LENGTH_SCORE = 1e-6;
3035
+ const NODE_ZONE_SCORE = 1;
3036
+ const NODE_ZONE_SCORE_LIMIT = 600;
2936
3037
  class CalculateSegmentLineData {
2937
3038
  handle({ source, sourceSide, target, targetSide, waypoints, offset, radius, }) {
2938
3039
  const anchors = buildConnectionAnchors(source, target, waypoints);
2939
- const chains = [];
3040
+ const chains = anchors.length === 2
3041
+ ? [this._getPathPoints(source, sourceSide, target, targetSide, offset ?? 0)]
3042
+ : this._buildWaypointChains(anchors, sourceSide, targetSide, offset ?? 0);
2940
3043
  const candidates = [];
2941
- for (let i = 0; i < anchors.length - 1; i++) {
2942
- const a = anchors[i];
2943
- const b = anchors[i + 1];
2944
- const points = this._getPathPoints(a, sourceSide, b, targetSide, offset ?? 0);
2945
- chains.push(points);
2946
- candidates.push(...calculatePolylineCandidates(points));
3044
+ for (const chain of chains) {
3045
+ const candidate = this._calculateChainCandidate(chain);
3046
+ if (candidate) {
3047
+ candidates.push(candidate);
3048
+ }
2947
3049
  }
2948
3050
  const polyline = normalizePolyline(mergePointChains(chains));
2949
3051
  const penultimatePoint = polyline.length > 1 ? polyline[polyline.length - 2] : source;
@@ -2954,8 +3056,205 @@ class CalculateSegmentLineData {
2954
3056
  secondPoint,
2955
3057
  points: polyline,
2956
3058
  candidates,
3059
+ waypointHandles: this._calculateWaypointHandles(waypoints ?? [], polyline, radius ?? 0),
2957
3060
  };
2958
3061
  }
3062
+ /**
3063
+ * Display positions for the waypoint handles. A waypoint that is a rounded
3064
+ * corner of the polyline maps to the apex of its bend, so the handle sits on
3065
+ * the rendered path; a waypoint lying mid-segment is already on the line.
3066
+ */
3067
+ _calculateWaypointHandles(waypoints, polyline, radius) {
3068
+ return waypoints.map((waypoint) => {
3069
+ const index = polyline.findIndex((point) => point.x === waypoint.x && point.y === waypoint.y);
3070
+ if (index <= 0 || index >= polyline.length - 1) {
3071
+ return { x: waypoint.x, y: waypoint.y };
3072
+ }
3073
+ return calculateCornerApex(polyline[index - 1], waypoint, polyline[index + 1], radius);
3074
+ });
3075
+ }
3076
+ /**
3077
+ * Routes the connection through intermediate waypoints. Connector sides and
3078
+ * the connector gap apply only at the real endpoints; waypoints are
3079
+ * pass-through anchors, so no connector-like stubs appear around them. Each
3080
+ * chain is an explicit orthogonal route that never doubles back on the
3081
+ * direction it arrived with — a same-line reversal would be collapsed by
3082
+ * polyline normalization and would detach the path from the waypoint.
3083
+ */
3084
+ _buildWaypointChains(anchors, sourceSide, targetSide, offset) {
3085
+ const sourceDirection = CONNECTOR_SIDE_POINT[sourceSide];
3086
+ const targetDirection = CONNECTOR_SIDE_POINT[targetSide];
3087
+ const nodeZones = [
3088
+ { anchor: anchors[0], direction: { x: -sourceDirection.x, y: -sourceDirection.y } },
3089
+ {
3090
+ anchor: anchors[anchors.length - 1],
3091
+ direction: { x: -targetDirection.x, y: -targetDirection.y },
3092
+ },
3093
+ ].filter((zone) => zone.direction.x !== 0 || zone.direction.y !== 0);
3094
+ const chains = [];
3095
+ let leaveDirection = null;
3096
+ for (let i = 0; i < anchors.length - 1; i++) {
3097
+ const a = anchors[i];
3098
+ const b = anchors[i + 1];
3099
+ const isFirstChain = i === 0;
3100
+ const isLastChain = i === anchors.length - 2;
3101
+ let chain;
3102
+ if (isFirstChain) {
3103
+ const sourceGap = {
3104
+ x: a.x + sourceDirection.x * offset,
3105
+ y: a.y + sourceDirection.y * offset,
3106
+ };
3107
+ const route = this._routeOrthogonal(sourceGap, sourceDirection, b, null, nodeZones);
3108
+ chain = [a, ...route];
3109
+ }
3110
+ else if (isLastChain) {
3111
+ const targetGap = {
3112
+ x: b.x + targetDirection.x * offset,
3113
+ y: b.y + targetDirection.y * offset,
3114
+ };
3115
+ const stubDirection = { x: -targetDirection.x, y: -targetDirection.y };
3116
+ const route = this._routeOrthogonal(a, leaveDirection, targetGap, stubDirection, nodeZones);
3117
+ chain = [...route, b];
3118
+ }
3119
+ else {
3120
+ chain = this._routeOrthogonal(a, leaveDirection, b, null, nodeZones);
3121
+ }
3122
+ chains.push(chain);
3123
+ leaveDirection = this._calculateArrivalDirection(isLastChain ? chain.slice(0, -1) : chain);
3124
+ }
3125
+ return chains;
3126
+ }
3127
+ /**
3128
+ * Connects two points with an axis-aligned route. Candidates are the
3129
+ * straight segment, both L-shapes, and both Z-shapes; the route that keeps
3130
+ * the constraints wins. `leaveDirection` is the motion the path arrived
3131
+ * with (its reversal as a first move is forbidden); `stubDirection` is the
3132
+ * upcoming connector stub motion (arriving against it is forbidden).
3133
+ * A non-dominant-axis arrival is only softly penalized, so waypoints are
3134
+ * entered along the axis they are farther away on.
3135
+ */
3136
+ _routeOrthogonal(from, leaveDirection, to, stubDirection, nodeZones) {
3137
+ if (from.x === to.x && from.y === to.y) {
3138
+ return [from];
3139
+ }
3140
+ const corners = [];
3141
+ if (from.x === to.x || from.y === to.y) {
3142
+ corners.push([]);
3143
+ }
3144
+ corners.push([{ x: to.x, y: from.y }]);
3145
+ corners.push([{ x: from.x, y: to.y }]);
3146
+ const centerBetweenPoints = calculateCenterBetweenPoints(from, to);
3147
+ corners.push([
3148
+ { x: centerBetweenPoints.x, y: from.y },
3149
+ { x: centerBetweenPoints.x, y: to.y },
3150
+ ]);
3151
+ corners.push([
3152
+ { x: from.x, y: centerBetweenPoints.y },
3153
+ { x: to.x, y: centerBetweenPoints.y },
3154
+ ]);
3155
+ const dominantAxis = Math.abs(to.x - from.x) >= Math.abs(to.y - from.y) ? 'x' : 'y';
3156
+ let bestRoute = null;
3157
+ let bestScore = Number.POSITIVE_INFINITY;
3158
+ for (const cornerPoints of corners) {
3159
+ const route = this._compactRoute([from, ...cornerPoints, to]);
3160
+ const score = this._scoreRoute(route, leaveDirection, stubDirection, dominantAxis, nodeZones);
3161
+ if (score < bestScore) {
3162
+ bestScore = score;
3163
+ bestRoute = route;
3164
+ }
3165
+ }
3166
+ return bestRoute ?? [from, to];
3167
+ }
3168
+ _compactRoute(points) {
3169
+ const route = [points[0]];
3170
+ for (let i = 1; i < points.length; i++) {
3171
+ const last = route[route.length - 1];
3172
+ if (points[i].x !== last.x || points[i].y !== last.y) {
3173
+ route.push(points[i]);
3174
+ }
3175
+ }
3176
+ return route;
3177
+ }
3178
+ _scoreRoute(route, leaveDirection, stubDirection, dominantAxis, nodeZones) {
3179
+ let score = 0;
3180
+ let length = 0;
3181
+ let zoneLength = 0;
3182
+ for (let i = 0; i < route.length - 1; i++) {
3183
+ length += Math.abs(route[i + 1].x - route[i].x) + Math.abs(route[i + 1].y - route[i].y);
3184
+ for (const zone of nodeZones) {
3185
+ zoneLength += this._calculateSegmentLengthInZone(route[i], route[i + 1], zone);
3186
+ }
3187
+ }
3188
+ score += Math.min(NODE_ZONE_SCORE_LIMIT, zoneLength * NODE_ZONE_SCORE);
3189
+ const first = this._segmentDirection(route[0], route[1]);
3190
+ if (leaveDirection &&
3191
+ (leaveDirection.x !== 0 || leaveDirection.y !== 0) &&
3192
+ first.x === -leaveDirection.x &&
3193
+ first.y === -leaveDirection.y) {
3194
+ score += HARD_VIOLATION_SCORE;
3195
+ }
3196
+ const arrival = this._segmentDirection(route[route.length - 2], route[route.length - 1]);
3197
+ if (stubDirection && arrival.x === -stubDirection.x && arrival.y === -stubDirection.y) {
3198
+ score += HARD_VIOLATION_SCORE;
3199
+ }
3200
+ if (!stubDirection && arrival[dominantAxis] === 0) {
3201
+ score += ARRIVAL_AXIS_SCORE;
3202
+ }
3203
+ return score + (route.length - 2) * BEND_SCORE + length * LENGTH_SCORE;
3204
+ }
3205
+ _segmentDirection(a, b) {
3206
+ return { x: Math.sign(b.x - a.x), y: Math.sign(b.y - a.y) };
3207
+ }
3208
+ /**
3209
+ * Length of the part of an axis-aligned segment lying inside the half-plane
3210
+ * behind a connector (where the endpoint's node body is).
3211
+ */
3212
+ _calculateSegmentLengthInZone(a, b, zone) {
3213
+ const zoneAxis = zone.direction.x !== 0 ? 'x' : 'y';
3214
+ const zoneSign = zone.direction[zoneAxis];
3215
+ const boundary = zone.anchor[zoneAxis];
3216
+ const start = (a[zoneAxis] - boundary) * zoneSign;
3217
+ const end = (b[zoneAxis] - boundary) * zoneSign;
3218
+ if (start <= 0 && end <= 0) {
3219
+ return 0;
3220
+ }
3221
+ const segmentLength = Math.abs(b.x - a.x) + Math.abs(b.y - a.y);
3222
+ if (a[zoneAxis] === b[zoneAxis]) {
3223
+ return segmentLength;
3224
+ }
3225
+ const insideLength = Math.max(start, end) - Math.max(0, Math.min(start, end));
3226
+ return Math.min(segmentLength, Math.max(0, insideLength));
3227
+ }
3228
+ /**
3229
+ * Waypoint-creation candidate for one chain: the midpoint of its longest
3230
+ * straight segment. Corner rounding consumes at most half of each adjacent
3231
+ * segment, so this point always lies on the rendered path — a length-based
3232
+ * chain midpoint can land on a rounded corner and float off the line.
3233
+ */
3234
+ _calculateChainCandidate(chain) {
3235
+ let bestLength = 0;
3236
+ let candidate = null;
3237
+ for (let i = 0; i < chain.length - 1; i++) {
3238
+ const length = Math.abs(chain[i + 1].x - chain[i].x) + Math.abs(chain[i + 1].y - chain[i].y);
3239
+ if (length > bestLength) {
3240
+ bestLength = length;
3241
+ candidate = {
3242
+ x: (chain[i].x + chain[i + 1].x) / 2,
3243
+ y: (chain[i].y + chain[i + 1].y) / 2,
3244
+ };
3245
+ }
3246
+ }
3247
+ return candidate;
3248
+ }
3249
+ _calculateArrivalDirection(chain) {
3250
+ for (let i = chain.length - 1; i > 0; i--) {
3251
+ const direction = this._segmentDirection(chain[i - 1], chain[i]);
3252
+ if (direction.x !== 0 || direction.y !== 0) {
3253
+ return direction;
3254
+ }
3255
+ }
3256
+ return null;
3257
+ }
2959
3258
  _getPathPoints(source, sourceSide, target, targetSide, offset) {
2960
3259
  const sourceDirection = CONNECTOR_SIDE_POINT[sourceSide];
2961
3260
  const targetDirection = CONNECTOR_SIDE_POINT[targetSide];
@@ -3531,11 +3830,12 @@ class FConnectionBase extends MIXIN_BASE$1 {
3531
3830
  }
3532
3831
  setLine({ point1, point2 }) {
3533
3832
  this.line = LineExtensions.initialize(point1, point2);
3534
- const { path, points, penultimatePoint, secondPoint, candidates } = this._getPathResult(point1, point2);
3833
+ const { path, points, penultimatePoint, secondPoint, candidates, waypointHandles } = this._getPathResult(point1, point2);
3535
3834
  this.path = path;
3536
3835
  this._penultimatePoint = penultimatePoint || point1;
3537
3836
  this._secondPoint = secondPoint || point2;
3538
3837
  this.fWaypoints()?.candidates.set(candidates || []);
3838
+ this.fWaypoints()?.handles.set(waypointHandles || []);
3539
3839
  this._contentLayoutEngine.layout(points || [], this._contents());
3540
3840
  }
3541
3841
  _contents() {
@@ -8107,96 +8407,363 @@ class CreateConnectionFinalizeRequest {
8107
8407
  }
8108
8408
  }
8109
8409
 
8110
- class ResolveConnectableOutputForOutletRequest {
8111
- outlet;
8112
- static fToken = Symbol('ResolveConnectableOutputForOutletRequest');
8113
- constructor(outlet) {
8114
- this.outlet = outlet;
8115
- }
8116
- }
8117
-
8118
- let ResolveConnectableOutputForOutlet = class ResolveConnectableOutputForOutlet {
8119
- _store = inject(FComponentsStore);
8120
- handle({ outlet }) {
8121
- const node = this._findOwnerNode(outlet);
8122
- if (!node) {
8123
- throw new Error('The fOutlet must belong to an fNode');
8124
- }
8125
- const output = this._findFirstConnectableOutputInNode(node);
8126
- if (!output) {
8127
- throw new Error('Outlet requires at least one connectable output in the same node.');
8128
- }
8129
- return output;
8410
+ let uniqueId$6 = 0;
8411
+ class FConnectionComponent extends FConnectionBase {
8412
+ fId = input(`f-connection-${uniqueId$6++}`, ...(ngDevMode ? [{ debugName: "fId", alias: 'fConnectionId' }] : [{ alias: 'fConnectionId' }]));
8413
+ fSourceId = input('', ...(ngDevMode ? [{ debugName: "fSourceId", transform: (value) => stringAttribute(value) || '' }] : [{
8414
+ transform: (value) => stringAttribute(value) || '',
8415
+ }]));
8416
+ fTargetId = input('', ...(ngDevMode ? [{ debugName: "fTargetId", transform: (value) => stringAttribute(value) || '' }] : [{
8417
+ transform: (value) => stringAttribute(value) || '',
8418
+ }]));
8419
+ /** @deprecated Use `fSourceId`. */
8420
+ fOutputId = input('', ...(ngDevMode ? [{ debugName: "fOutputId", transform: (value) => stringAttribute(value) || '' }] : [{
8421
+ transform: (value) => stringAttribute(value) || '',
8422
+ }]));
8423
+ /** @deprecated Use `fTargetId`. */
8424
+ fInputId = input('', ...(ngDevMode ? [{ debugName: "fInputId", transform: (value) => stringAttribute(value) || '' }] : [{
8425
+ transform: (value) => stringAttribute(value) || '',
8426
+ }]));
8427
+ fRadius = 8;
8428
+ fOffset = 12;
8429
+ fBehavior = EFConnectionBehavior.FIXED;
8430
+ fType = EFConnectionType.STRAIGHT;
8431
+ fSelectionDisabled = input(false, ...(ngDevMode ? [{ debugName: "fSelectionDisabled", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
8432
+ fReassignableStart = input(false, ...(ngDevMode ? [{ debugName: "fReassignableStart", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
8433
+ fDraggingDisabled = input(false, ...(ngDevMode ? [{ debugName: "fDraggingDisabled", alias: 'fReassignDisabled',
8434
+ transform: booleanAttribute }] : [{
8435
+ alias: 'fReassignDisabled',
8436
+ transform: booleanAttribute,
8437
+ }]));
8438
+ fSourceSide = input(EFConnectionConnectableSide.DEFAULT, ...(ngDevMode ? [{ debugName: "fSourceSide", transform: (x) => {
8439
+ return castToEnum(x, 'fSourceSide', EFConnectionConnectableSide);
8440
+ } }] : [{
8441
+ transform: (x) => {
8442
+ return castToEnum(x, 'fSourceSide', EFConnectionConnectableSide);
8443
+ },
8444
+ }]));
8445
+ fTargetSide = input(EFConnectionConnectableSide.DEFAULT, ...(ngDevMode ? [{ debugName: "fTargetSide", transform: (x) => {
8446
+ return castToEnum(x, 'fTargetSide', EFConnectionConnectableSide);
8447
+ } }] : [{
8448
+ transform: (x) => {
8449
+ return castToEnum(x, 'fTargetSide', EFConnectionConnectableSide);
8450
+ },
8451
+ }]));
8452
+ /** @deprecated Use `fTargetSide`. */
8453
+ fInputSide = input(EFConnectionConnectableSide.DEFAULT, ...(ngDevMode ? [{ debugName: "fInputSide", transform: (x) => {
8454
+ return castToEnum(x, 'fInputSide', EFConnectionConnectableSide);
8455
+ } }] : [{
8456
+ transform: (x) => {
8457
+ return castToEnum(x, 'fInputSide', EFConnectionConnectableSide);
8458
+ },
8459
+ }]));
8460
+ /** @deprecated Use `fSourceSide`. */
8461
+ fOutputSide = input(EFConnectionConnectableSide.DEFAULT, ...(ngDevMode ? [{ debugName: "fOutputSide", transform: (x) => {
8462
+ return castToEnum(x, 'fOutputSide', EFConnectionConnectableSide);
8463
+ } }] : [{
8464
+ transform: (x) => {
8465
+ return castToEnum(x, 'fOutputSide', EFConnectionConnectableSide);
8466
+ },
8467
+ }]));
8468
+ get boundingElement() {
8469
+ return this.fPath().hostElement;
8130
8470
  }
8131
- _findOwnerNode(outlet) {
8132
- const host = outlet.hostElement;
8133
- return this._store.nodes.getAll().find((n) => n.isContains(host));
8471
+ _mediator = inject(FMediator);
8472
+ ngOnInit() {
8473
+ this._mediator.execute(new AddConnectionToStoreRequest(this));
8134
8474
  }
8135
- _findFirstConnectableOutputInNode(node) {
8136
- return getAllSourceConnectors(this._store).find((x) => node.isContains(x.hostElement) && x.canBeConnected);
8475
+ ngOnChanges() {
8476
+ this._mediator.execute(new EmitConnectionsChangesRequest());
8137
8477
  }
8138
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: ResolveConnectableOutputForOutlet, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
8139
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: ResolveConnectableOutputForOutlet });
8140
- };
8141
- ResolveConnectableOutputForOutlet = __decorate([
8142
- FExecutionRegister(ResolveConnectableOutputForOutletRequest)
8143
- ], ResolveConnectableOutputForOutlet);
8144
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: ResolveConnectableOutputForOutlet, decorators: [{
8145
- type: Injectable
8146
- }] });
8147
-
8148
- class FCreateConnectionEvent {
8149
- // -----------------------------
8150
- // Preferred API
8151
- // -----------------------------
8152
- /** Source connector id */
8153
- sourceId;
8154
- /** Target connector id (can be undefined if dropped to nowhere) */
8155
- targetId;
8156
- /** Pointer position where the user dropped pointer. */
8157
- dropPosition;
8158
- // -----------------------------
8159
- // Deprecated compatibility API (keep as FIELDS)
8160
- // -----------------------------
8161
- /** @deprecated Use `sourceId` */
8162
- fOutputId;
8163
- /** @deprecated Use `targetId` */
8164
- fInputId;
8165
- /** @deprecated Use `dropPosition` */
8166
- fDropPosition;
8167
- constructor(sourceId, targetId, dropPosition) {
8168
- // preferred
8169
- this.sourceId = sourceId;
8170
- this.targetId = targetId;
8171
- this.dropPosition = dropPosition;
8172
- // legacy aliases
8173
- this.fOutputId = sourceId;
8174
- this.fInputId = targetId;
8175
- this.fDropPosition = dropPosition;
8478
+ ngOnDestroy() {
8479
+ this._mediator.execute(new RemoveConnectionFromStoreRequest(this));
8176
8480
  }
8481
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: FConnectionComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
8482
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.9", type: FConnectionComponent, isStandalone: false, selector: "f-connection", inputs: { fId: { classPropertyName: "fId", publicName: "fConnectionId", isSignal: true, isRequired: false, transformFunction: null }, fSourceId: { classPropertyName: "fSourceId", publicName: "fSourceId", isSignal: true, isRequired: false, transformFunction: null }, fTargetId: { classPropertyName: "fTargetId", publicName: "fTargetId", isSignal: true, isRequired: false, transformFunction: null }, fOutputId: { classPropertyName: "fOutputId", publicName: "fOutputId", isSignal: true, isRequired: false, transformFunction: null }, fInputId: { classPropertyName: "fInputId", publicName: "fInputId", isSignal: true, isRequired: false, transformFunction: null }, fRadius: { classPropertyName: "fRadius", publicName: "fRadius", isSignal: false, isRequired: false, transformFunction: numberAttribute }, fOffset: { classPropertyName: "fOffset", publicName: "fOffset", isSignal: false, isRequired: false, transformFunction: numberAttribute }, fBehavior: { classPropertyName: "fBehavior", publicName: "fBehavior", isSignal: false, isRequired: false, transformFunction: (value) => castToEnum(value, 'fBehavior', EFConnectionBehavior) }, fType: { classPropertyName: "fType", publicName: "fType", isSignal: false, isRequired: false, transformFunction: null }, fSelectionDisabled: { classPropertyName: "fSelectionDisabled", publicName: "fSelectionDisabled", isSignal: true, isRequired: false, transformFunction: null }, fReassignableStart: { classPropertyName: "fReassignableStart", publicName: "fReassignableStart", isSignal: true, isRequired: false, transformFunction: null }, fDraggingDisabled: { classPropertyName: "fDraggingDisabled", publicName: "fReassignDisabled", isSignal: true, isRequired: false, transformFunction: null }, fSourceSide: { classPropertyName: "fSourceSide", publicName: "fSourceSide", isSignal: true, isRequired: false, transformFunction: null }, fTargetSide: { classPropertyName: "fTargetSide", publicName: "fTargetSide", isSignal: true, isRequired: false, transformFunction: null }, fInputSide: { classPropertyName: "fInputSide", publicName: "fInputSide", isSignal: true, isRequired: false, transformFunction: null }, fOutputSide: { classPropertyName: "fOutputSide", publicName: "fOutputSide", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.id": "fId()", "attr.data-f-connection-type": "fType", "class.f-connection-selection-disabled": "fSelectionDisabled()", "class.f-connection-reassign-disabled": "fDraggingDisabled()" }, classAttribute: "f-component f-connection" }, providers: [{ provide: F_CONNECTION_COMPONENTS_PARENT, useExisting: FConnectionComponent }], exportAs: ["fComponent"], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<svg xmlns=\"http://www.w3.org/2000/svg\">\n <defs #defs></defs>\n <ng-content select=\"svg[fMarker]\" />\n <g class=\"f-connection-group\">\n @if (fGradient(); as gradient) {\n <linearGradient\n fConnectionGradientRenderer\n [fConnectionGradientRendererFor]=\"gradient\"\n ></linearGradient>\n }\n <path fConnectionSelection [attr.d]=\"path\"></path>\n <g>\n <path f-connection-path [useGradient]=\"!!fGradient()\" [attr.d]=\"path\"></path>\n @if (fReassignableStart()) {\n <circle f-connection-drag-handle-start r=\"8\"></circle>\n }\n <circle f-connection-drag-handle-end r=\"8\"></circle>\n </g>\n </g>\n</svg>\n<ng-content select=\"f-connection-marker-circle, f-connection-marker-arrow\" />\n<ng-content select=\"f-connection-gradient\" />\n<ng-content select=\"f-connection-waypoints\" />\n\n@if (fContents().length) {\n <ng-content select=\"[fConnectionContent]\" />\n}\n", styles: [":host{pointer-events:none}:host svg{display:block;vertical-align:middle;overflow:visible!important;position:absolute}:host svg .f-connection-group{pointer-events:all}:host .f-connection-content{pointer-events:all}\n"], dependencies: [{ kind: "component", type: FConnectionGradientRenderer, selector: "linearGradient[fConnectionGradientRenderer]", inputs: ["fConnectionGradientRendererFor"] }, { kind: "component", type: FConnectionDragHandleStart, selector: "circle[f-connection-drag-handle-start]" }, { kind: "component", type: FConnectionDragHandleEnd, selector: "circle[f-connection-drag-handle-end]" }, { kind: "component", type: FConnectionPath, selector: "path[f-connection-path]", inputs: ["useGradient"] }, { kind: "component", type: FConnectionSelection, selector: "path[fConnectionSelection]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
8177
8483
  }
8484
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: FConnectionComponent, decorators: [{
8485
+ type: Component,
8486
+ args: [{ standalone: false, selector: 'f-connection', exportAs: 'fComponent', changeDetection: ChangeDetectionStrategy.OnPush, host: {
8487
+ '[attr.id]': 'fId()',
8488
+ '[attr.data-f-connection-type]': 'fType',
8489
+ class: 'f-component f-connection',
8490
+ '[class.f-connection-selection-disabled]': 'fSelectionDisabled()',
8491
+ '[class.f-connection-reassign-disabled]': 'fDraggingDisabled()',
8492
+ }, providers: [{ provide: F_CONNECTION_COMPONENTS_PARENT, useExisting: FConnectionComponent }], template: "<svg xmlns=\"http://www.w3.org/2000/svg\">\n <defs #defs></defs>\n <ng-content select=\"svg[fMarker]\" />\n <g class=\"f-connection-group\">\n @if (fGradient(); as gradient) {\n <linearGradient\n fConnectionGradientRenderer\n [fConnectionGradientRendererFor]=\"gradient\"\n ></linearGradient>\n }\n <path fConnectionSelection [attr.d]=\"path\"></path>\n <g>\n <path f-connection-path [useGradient]=\"!!fGradient()\" [attr.d]=\"path\"></path>\n @if (fReassignableStart()) {\n <circle f-connection-drag-handle-start r=\"8\"></circle>\n }\n <circle f-connection-drag-handle-end r=\"8\"></circle>\n </g>\n </g>\n</svg>\n<ng-content select=\"f-connection-marker-circle, f-connection-marker-arrow\" />\n<ng-content select=\"f-connection-gradient\" />\n<ng-content select=\"f-connection-waypoints\" />\n\n@if (fContents().length) {\n <ng-content select=\"[fConnectionContent]\" />\n}\n", styles: [":host{pointer-events:none}:host svg{display:block;vertical-align:middle;overflow:visible!important;position:absolute}:host svg .f-connection-group{pointer-events:all}:host .f-connection-content{pointer-events:all}\n"] }]
8493
+ }], propDecorators: { fId: [{ type: i0.Input, args: [{ isSignal: true, alias: "fConnectionId", required: false }] }], fSourceId: [{ type: i0.Input, args: [{ isSignal: true, alias: "fSourceId", required: false }] }], fTargetId: [{ type: i0.Input, args: [{ isSignal: true, alias: "fTargetId", required: false }] }], fOutputId: [{ type: i0.Input, args: [{ isSignal: true, alias: "fOutputId", required: false }] }], fInputId: [{ type: i0.Input, args: [{ isSignal: true, alias: "fInputId", required: false }] }], fRadius: [{
8494
+ type: Input,
8495
+ args: [{ transform: numberAttribute }]
8496
+ }], fOffset: [{
8497
+ type: Input,
8498
+ args: [{ transform: numberAttribute }]
8499
+ }], fBehavior: [{
8500
+ type: Input,
8501
+ args: [{ transform: (value) => castToEnum(value, 'fBehavior', EFConnectionBehavior) }]
8502
+ }], fType: [{
8503
+ type: Input
8504
+ }], fSelectionDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "fSelectionDisabled", required: false }] }], fReassignableStart: [{ type: i0.Input, args: [{ isSignal: true, alias: "fReassignableStart", required: false }] }], fDraggingDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "fReassignDisabled", required: false }] }], fSourceSide: [{ type: i0.Input, args: [{ isSignal: true, alias: "fSourceSide", required: false }] }], fTargetSide: [{ type: i0.Input, args: [{ isSignal: true, alias: "fTargetSide", required: false }] }], fInputSide: [{ type: i0.Input, args: [{ isSignal: true, alias: "fInputSide", required: false }] }], fOutputSide: [{ type: i0.Input, args: [{ isSignal: true, alias: "fOutputSide", required: false }] }] } });
8178
8505
 
8179
- /**
8180
- * One in-progress connection creation, independent of the gesture that drives it.
8181
- *
8182
- * The drag-to-connect handler and the click-to-connect flow both delegate here, so the
8183
- * preview line, snap highlighting, connectable marking, target resolution, and the
8184
- * `fCreateConnection` emission behave identically in every mode. The session owns its
8185
- * state (it survives the per-pointerdown drag-context reset), and `begin()` refuses to
8186
- * start when no `<f-connection-for-create>` is present — the same opt-in gate the drag
8187
- * path uses.
8188
- */
8189
- class FCreateConnectionSession {
8190
- _mediator = inject(FMediator);
8191
- _connectionBehaviour = inject(ConnectionBehaviourBuilder);
8192
- _store = inject(FComponentsStore);
8193
- _targets = [];
8194
- _sourceRef;
8195
- get _connection() {
8196
- return this._store.connections.getForCreate();
8197
- }
8198
- get _snapConnection() {
8199
- return this._store.connections.getForSnap();
8506
+ let uniqueId$5 = 0;
8507
+ class FConnectionForCreateComponent extends FConnectionBase {
8508
+ fId = signal(`f-connection-for-create-${uniqueId$5++}`, ...(ngDevMode ? [{ debugName: "fId" }] : []));
8509
+ fOutputId = signal('', ...(ngDevMode ? [{ debugName: "fOutputId" }] : []));
8510
+ fInputId = signal('', ...(ngDevMode ? [{ debugName: "fInputId" }] : []));
8511
+ fRadius = 8;
8512
+ fOffset = 12;
8513
+ fBehavior = EFConnectionBehavior.FIXED;
8514
+ fType = EFConnectionType.STRAIGHT;
8515
+ fInputSide = input(EFConnectionConnectableSide.DEFAULT, ...(ngDevMode ? [{ debugName: "fInputSide", transform: (x) => {
8516
+ return castToEnum(x, 'fInputSide', EFConnectionConnectableSide);
8517
+ } }] : [{
8518
+ transform: (x) => {
8519
+ return castToEnum(x, 'fInputSide', EFConnectionConnectableSide);
8520
+ },
8521
+ }]));
8522
+ fOutputSide = input(EFConnectionConnectableSide.DEFAULT, ...(ngDevMode ? [{ debugName: "fOutputSide", transform: (x) => {
8523
+ return castToEnum(x, 'fOutputSide', EFConnectionConnectableSide);
8524
+ } }] : [{
8525
+ transform: (x) => {
8526
+ return castToEnum(x, 'fOutputSide', EFConnectionConnectableSide);
8527
+ },
8528
+ }]));
8529
+ get boundingElement() {
8530
+ return this.fPath().hostElement;
8531
+ }
8532
+ _mediator = inject(FMediator);
8533
+ ngOnInit() {
8534
+ this._mediator.execute(new AddConnectionForCreateToStoreRequest(this));
8535
+ }
8536
+ ngAfterViewInit() {
8537
+ this.hide();
8538
+ }
8539
+ ngOnChanges() {
8540
+ this._mediator.execute(new EmitConnectionsChangesRequest());
8541
+ }
8542
+ ngOnDestroy() {
8543
+ this._mediator.execute(new RemoveConnectionForCreateFromStoreRequest());
8544
+ }
8545
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: FConnectionForCreateComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
8546
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.9", type: FConnectionForCreateComponent, isStandalone: false, selector: "f-connection-for-create", inputs: { fRadius: { classPropertyName: "fRadius", publicName: "fRadius", isSignal: false, isRequired: false, transformFunction: numberAttribute }, fOffset: { classPropertyName: "fOffset", publicName: "fOffset", isSignal: false, isRequired: false, transformFunction: numberAttribute }, fBehavior: { classPropertyName: "fBehavior", publicName: "fBehavior", isSignal: false, isRequired: false, transformFunction: (value) => castToEnum(value, 'fBehavior', EFConnectionBehavior) }, fType: { classPropertyName: "fType", publicName: "fType", isSignal: false, isRequired: false, transformFunction: null }, fInputSide: { classPropertyName: "fInputSide", publicName: "fInputSide", isSignal: true, isRequired: false, transformFunction: null }, fOutputSide: { classPropertyName: "fOutputSide", publicName: "fOutputSide", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "aria-hidden": "true" }, classAttribute: "f-component f-connection f-connection-for-create" }, providers: [
8547
+ { provide: F_CONNECTION_COMPONENTS_PARENT, useExisting: FConnectionForCreateComponent },
8548
+ ], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<svg xmlns=\"http://www.w3.org/2000/svg\">\n <defs #defs></defs>\n <ng-content select=\"svg[fMarker]\" />\n <g class=\"f-connection-group\">\n @if (fGradient(); as gradient) {\n <linearGradient\n fConnectionGradientRenderer\n [fConnectionGradientRendererFor]=\"gradient\"\n ></linearGradient>\n }\n <path fConnectionSelection [attr.d]=\"path\"></path>\n <g>\n <path f-connection-path [useGradient]=\"!!fGradient()\" [attr.d]=\"path\"></path>\n <circle f-connection-drag-handle-end r=\"8\"></circle>\n </g>\n </g>\n</svg>\n<ng-content select=\"f-connection-marker-circle, f-connection-marker-arrow\" />\n<ng-content select=\"f-connection-gradient\" />\n\n@if (fContents().length) {\n <ng-content select=\"[fConnectionContent]\" />\n}\n", styles: [":host{pointer-events:none;position:absolute}:host svg{overflow:visible}:host svg .f-connection-group{pointer-events:all}:host .f-connection-content{pointer-events:all}\n"], dependencies: [{ kind: "component", type: FConnectionGradientRenderer, selector: "linearGradient[fConnectionGradientRenderer]", inputs: ["fConnectionGradientRendererFor"] }, { kind: "component", type: FConnectionDragHandleEnd, selector: "circle[f-connection-drag-handle-end]" }, { kind: "component", type: FConnectionPath, selector: "path[f-connection-path]", inputs: ["useGradient"] }, { kind: "component", type: FConnectionSelection, selector: "path[fConnectionSelection]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
8549
+ }
8550
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: FConnectionForCreateComponent, decorators: [{
8551
+ type: Component,
8552
+ args: [{ standalone: false, selector: 'f-connection-for-create', changeDetection: ChangeDetectionStrategy.OnPush, host: {
8553
+ class: 'f-component f-connection f-connection-for-create',
8554
+ 'aria-hidden': 'true',
8555
+ }, providers: [
8556
+ { provide: F_CONNECTION_COMPONENTS_PARENT, useExisting: FConnectionForCreateComponent },
8557
+ ], template: "<svg xmlns=\"http://www.w3.org/2000/svg\">\n <defs #defs></defs>\n <ng-content select=\"svg[fMarker]\" />\n <g class=\"f-connection-group\">\n @if (fGradient(); as gradient) {\n <linearGradient\n fConnectionGradientRenderer\n [fConnectionGradientRendererFor]=\"gradient\"\n ></linearGradient>\n }\n <path fConnectionSelection [attr.d]=\"path\"></path>\n <g>\n <path f-connection-path [useGradient]=\"!!fGradient()\" [attr.d]=\"path\"></path>\n <circle f-connection-drag-handle-end r=\"8\"></circle>\n </g>\n </g>\n</svg>\n<ng-content select=\"f-connection-marker-circle, f-connection-marker-arrow\" />\n<ng-content select=\"f-connection-gradient\" />\n\n@if (fContents().length) {\n <ng-content select=\"[fConnectionContent]\" />\n}\n", styles: [":host{pointer-events:none;position:absolute}:host svg{overflow:visible}:host svg .f-connection-group{pointer-events:all}:host .f-connection-content{pointer-events:all}\n"] }]
8558
+ }], propDecorators: { fRadius: [{
8559
+ type: Input,
8560
+ args: [{ transform: numberAttribute }]
8561
+ }], fOffset: [{
8562
+ type: Input,
8563
+ args: [{ transform: numberAttribute }]
8564
+ }], fBehavior: [{
8565
+ type: Input,
8566
+ args: [{ transform: (value) => castToEnum(value, 'fBehavior', EFConnectionBehavior) }]
8567
+ }], fType: [{
8568
+ type: Input
8569
+ }], fInputSide: [{ type: i0.Input, args: [{ isSignal: true, alias: "fInputSide", required: false }] }], fOutputSide: [{ type: i0.Input, args: [{ isSignal: true, alias: "fOutputSide", required: false }] }] } });
8570
+
8571
+ let uniqueId$4 = 0;
8572
+ class FSnapConnectionComponent extends FConnectionBase {
8573
+ fId = signal(`f-snap-connection-${uniqueId$4++}`, ...(ngDevMode ? [{ debugName: "fId" }] : []));
8574
+ fSnapThreshold = 20;
8575
+ /**
8576
+ * Fires when the snapped target changes during a connection-creation gesture:
8577
+ * with the connector id while one is within `fSnapThreshold`, and with an
8578
+ * `undefined` target when the snap is released or the gesture ends.
8579
+ */
8580
+ fSnapTargetChange = output();
8581
+ fOutputId = signal('', ...(ngDevMode ? [{ debugName: "fOutputId" }] : []));
8582
+ fInputId = signal('', ...(ngDevMode ? [{ debugName: "fInputId" }] : []));
8583
+ fRadius = 8;
8584
+ fOffset = 12;
8585
+ fBehavior = EFConnectionBehavior.FIXED;
8586
+ fType = EFConnectionType.STRAIGHT;
8587
+ fInputSide = input(EFConnectionConnectableSide.DEFAULT, ...(ngDevMode ? [{ debugName: "fInputSide", transform: (x) => {
8588
+ return castToEnum(x, 'fInputSide', EFConnectionConnectableSide);
8589
+ } }] : [{
8590
+ transform: (x) => {
8591
+ return castToEnum(x, 'fInputSide', EFConnectionConnectableSide);
8592
+ },
8593
+ }]));
8594
+ fOutputSide = input(EFConnectionConnectableSide.DEFAULT, ...(ngDevMode ? [{ debugName: "fOutputSide", transform: (x) => {
8595
+ return castToEnum(x, 'fOutputSide', EFConnectionConnectableSide);
8596
+ } }] : [{
8597
+ transform: (x) => {
8598
+ return castToEnum(x, 'fOutputSide', EFConnectionConnectableSide);
8599
+ },
8600
+ }]));
8601
+ get boundingElement() {
8602
+ return this.fPath().hostElement;
8603
+ }
8604
+ _mediator = inject(FMediator);
8605
+ ngOnInit() {
8606
+ this._mediator.execute(new AddSnapConnectionToStoreRequest(this));
8607
+ }
8608
+ ngAfterViewInit() {
8609
+ this.hide();
8610
+ }
8611
+ ngOnChanges() {
8612
+ this._mediator.execute(new EmitConnectionsChangesRequest());
8613
+ }
8614
+ ngOnDestroy() {
8615
+ this._mediator.execute(new RemoveSnapConnectionFromStoreRequest());
8616
+ }
8617
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: FSnapConnectionComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
8618
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.9", type: FSnapConnectionComponent, isStandalone: false, selector: "f-snap-connection", inputs: { fSnapThreshold: { classPropertyName: "fSnapThreshold", publicName: "fSnapThreshold", isSignal: false, isRequired: false, transformFunction: numberAttribute }, fRadius: { classPropertyName: "fRadius", publicName: "fRadius", isSignal: false, isRequired: false, transformFunction: numberAttribute }, fOffset: { classPropertyName: "fOffset", publicName: "fOffset", isSignal: false, isRequired: false, transformFunction: numberAttribute }, fBehavior: { classPropertyName: "fBehavior", publicName: "fBehavior", isSignal: false, isRequired: false, transformFunction: (value) => castToEnum(value, 'fBehavior', EFConnectionBehavior) }, fType: { classPropertyName: "fType", publicName: "fType", isSignal: false, isRequired: false, transformFunction: null }, fInputSide: { classPropertyName: "fInputSide", publicName: "fInputSide", isSignal: true, isRequired: false, transformFunction: null }, fOutputSide: { classPropertyName: "fOutputSide", publicName: "fOutputSide", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { fSnapTargetChange: "fSnapTargetChange" }, host: { attributes: { "aria-hidden": "true" }, classAttribute: "f-component f-connection f-snap-connection" }, providers: [{ provide: F_CONNECTION_COMPONENTS_PARENT, useExisting: FSnapConnectionComponent }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<svg xmlns=\"http://www.w3.org/2000/svg\">\n <defs #defs></defs>\n <ng-content select=\"svg[fMarker]\" />\n <g class=\"f-connection-group\">\n @if (fGradient(); as gradient) {\n <linearGradient\n fConnectionGradientRenderer\n [fConnectionGradientRendererFor]=\"gradient\"\n ></linearGradient>\n }\n <path fConnectionSelection [attr.d]=\"path\"></path>\n <g>\n <path f-connection-path [useGradient]=\"!!fGradient()\" [attr.d]=\"path\"></path>\n <circle f-connection-drag-handle-end r=\"8\"></circle>\n </g>\n </g>\n</svg>\n<ng-content select=\"f-connection-marker-circle, f-connection-marker-arrow\" />\n<ng-content select=\"f-connection-gradient\" />\n\n@if (fContents().length) {\n <ng-content select=\"[fConnectionContent]\" />\n}\n", styles: [":host{pointer-events:none;position:absolute}:host svg{overflow:visible}:host svg .f-connection-group{pointer-events:all}:host .f-connection-content{pointer-events:all}\n"], dependencies: [{ kind: "component", type: FConnectionGradientRenderer, selector: "linearGradient[fConnectionGradientRenderer]", inputs: ["fConnectionGradientRendererFor"] }, { kind: "component", type: FConnectionDragHandleEnd, selector: "circle[f-connection-drag-handle-end]" }, { kind: "component", type: FConnectionPath, selector: "path[f-connection-path]", inputs: ["useGradient"] }, { kind: "component", type: FConnectionSelection, selector: "path[fConnectionSelection]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
8619
+ }
8620
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: FSnapConnectionComponent, decorators: [{
8621
+ type: Component,
8622
+ args: [{ standalone: false, selector: 'f-snap-connection', changeDetection: ChangeDetectionStrategy.OnPush, host: {
8623
+ class: 'f-component f-connection f-snap-connection',
8624
+ 'aria-hidden': 'true',
8625
+ }, providers: [{ provide: F_CONNECTION_COMPONENTS_PARENT, useExisting: FSnapConnectionComponent }], template: "<svg xmlns=\"http://www.w3.org/2000/svg\">\n <defs #defs></defs>\n <ng-content select=\"svg[fMarker]\" />\n <g class=\"f-connection-group\">\n @if (fGradient(); as gradient) {\n <linearGradient\n fConnectionGradientRenderer\n [fConnectionGradientRendererFor]=\"gradient\"\n ></linearGradient>\n }\n <path fConnectionSelection [attr.d]=\"path\"></path>\n <g>\n <path f-connection-path [useGradient]=\"!!fGradient()\" [attr.d]=\"path\"></path>\n <circle f-connection-drag-handle-end r=\"8\"></circle>\n </g>\n </g>\n</svg>\n<ng-content select=\"f-connection-marker-circle, f-connection-marker-arrow\" />\n<ng-content select=\"f-connection-gradient\" />\n\n@if (fContents().length) {\n <ng-content select=\"[fConnectionContent]\" />\n}\n", styles: [":host{pointer-events:none;position:absolute}:host svg{overflow:visible}:host svg .f-connection-group{pointer-events:all}:host .f-connection-content{pointer-events:all}\n"] }]
8626
+ }], propDecorators: { fSnapThreshold: [{
8627
+ type: Input,
8628
+ args: [{ transform: numberAttribute }]
8629
+ }], fSnapTargetChange: [{ type: i0.Output, args: ["fSnapTargetChange"] }], fRadius: [{
8630
+ type: Input,
8631
+ args: [{ transform: numberAttribute }]
8632
+ }], fOffset: [{
8633
+ type: Input,
8634
+ args: [{ transform: numberAttribute }]
8635
+ }], fBehavior: [{
8636
+ type: Input,
8637
+ args: [{ transform: (value) => castToEnum(value, 'fBehavior', EFConnectionBehavior) }]
8638
+ }], fType: [{
8639
+ type: Input
8640
+ }], fInputSide: [{ type: i0.Input, args: [{ isSignal: true, alias: "fInputSide", required: false }] }], fOutputSide: [{ type: i0.Input, args: [{ isSignal: true, alias: "fOutputSide", required: false }] }] } });
8641
+
8642
+ /**
8643
+ * Emitted by `<f-snap-connection>` when the snapped target changes during a
8644
+ * connection-creation gesture. `targetId` is the connector currently within
8645
+ * `fSnapThreshold`, or `undefined` when the snap is released or the gesture
8646
+ * ends — so both endpoints can be styled while the snap preview is shown.
8647
+ */
8648
+ class FSnapTargetChangeEvent {
8649
+ sourceId;
8650
+ targetId;
8651
+ constructor(sourceId, targetId) {
8652
+ this.sourceId = sourceId;
8653
+ this.targetId = targetId;
8654
+ }
8655
+ }
8656
+
8657
+ const F_CONNECTION_PROVIDERS = [
8658
+ FConnectionDragHandleStart,
8659
+ FConnectionDragHandleEnd,
8660
+ FConnectionPath,
8661
+ FConnectionSelection,
8662
+ FConnectionMarker,
8663
+ FConnectionComponent,
8664
+ FConnectionForCreateComponent,
8665
+ FSnapConnectionComponent,
8666
+ ];
8667
+ const F_CONNECTION_IMPORTS_EXPORTS = [
8668
+ FConnectionContent,
8669
+ FConnectionMarkerCircle,
8670
+ FConnectionMarkerArrow,
8671
+ FConnectionGradient,
8672
+ FConnectionGradientRenderer,
8673
+ FConnectionWaypoints,
8674
+ ];
8675
+
8676
+ class ResolveConnectableOutputForOutletRequest {
8677
+ outlet;
8678
+ static fToken = Symbol('ResolveConnectableOutputForOutletRequest');
8679
+ constructor(outlet) {
8680
+ this.outlet = outlet;
8681
+ }
8682
+ }
8683
+
8684
+ let ResolveConnectableOutputForOutlet = class ResolveConnectableOutputForOutlet {
8685
+ _store = inject(FComponentsStore);
8686
+ handle({ outlet }) {
8687
+ const node = this._findOwnerNode(outlet);
8688
+ if (!node) {
8689
+ throw new Error('The fOutlet must belong to an fNode');
8690
+ }
8691
+ const output = this._findFirstConnectableOutputInNode(node);
8692
+ if (!output) {
8693
+ throw new Error('Outlet requires at least one connectable output in the same node.');
8694
+ }
8695
+ return output;
8696
+ }
8697
+ _findOwnerNode(outlet) {
8698
+ const host = outlet.hostElement;
8699
+ return this._store.nodes.getAll().find((n) => n.isContains(host));
8700
+ }
8701
+ _findFirstConnectableOutputInNode(node) {
8702
+ return getAllSourceConnectors(this._store).find((x) => node.isContains(x.hostElement) && x.canBeConnected);
8703
+ }
8704
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: ResolveConnectableOutputForOutlet, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
8705
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: ResolveConnectableOutputForOutlet });
8706
+ };
8707
+ ResolveConnectableOutputForOutlet = __decorate([
8708
+ FExecutionRegister(ResolveConnectableOutputForOutletRequest)
8709
+ ], ResolveConnectableOutputForOutlet);
8710
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: ResolveConnectableOutputForOutlet, decorators: [{
8711
+ type: Injectable
8712
+ }] });
8713
+
8714
+ class FCreateConnectionEvent {
8715
+ // -----------------------------
8716
+ // Preferred API
8717
+ // -----------------------------
8718
+ /** Source connector id */
8719
+ sourceId;
8720
+ /** Target connector id (can be undefined if dropped to nowhere) */
8721
+ targetId;
8722
+ /** Pointer position where the user dropped pointer. */
8723
+ dropPosition;
8724
+ // -----------------------------
8725
+ // Deprecated compatibility API (keep as FIELDS)
8726
+ // -----------------------------
8727
+ /** @deprecated Use `sourceId` */
8728
+ fOutputId;
8729
+ /** @deprecated Use `targetId` */
8730
+ fInputId;
8731
+ /** @deprecated Use `dropPosition` */
8732
+ fDropPosition;
8733
+ constructor(sourceId, targetId, dropPosition) {
8734
+ // preferred
8735
+ this.sourceId = sourceId;
8736
+ this.targetId = targetId;
8737
+ this.dropPosition = dropPosition;
8738
+ // legacy aliases
8739
+ this.fOutputId = sourceId;
8740
+ this.fInputId = targetId;
8741
+ this.fDropPosition = dropPosition;
8742
+ }
8743
+ }
8744
+
8745
+ /**
8746
+ * One in-progress connection creation, independent of the gesture that drives it.
8747
+ *
8748
+ * The drag-to-connect handler and the click-to-connect flow both delegate here, so the
8749
+ * preview line, snap highlighting, connectable marking, target resolution, and the
8750
+ * `fCreateConnection` emission behave identically in every mode. The session owns its
8751
+ * state (it survives the per-pointerdown drag-context reset), and `begin()` refuses to
8752
+ * start when no `<f-connection-for-create>` is present — the same opt-in gate the drag
8753
+ * path uses.
8754
+ */
8755
+ class FCreateConnectionSession {
8756
+ _mediator = inject(FMediator);
8757
+ _connectionBehaviour = inject(ConnectionBehaviourBuilder);
8758
+ _store = inject(FComponentsStore);
8759
+ _targets = [];
8760
+ _sourceRef;
8761
+ _snapTargetId;
8762
+ get _connection() {
8763
+ return this._store.connections.getForCreate();
8764
+ }
8765
+ get _snapConnection() {
8766
+ return this._store.connections.getForSnap();
8200
8767
  }
8201
8768
  get isActive() {
8202
8769
  return !!this._sourceRef;
@@ -8244,8 +8811,22 @@ class FCreateConnectionSession {
8244
8811
  return;
8245
8812
  }
8246
8813
  const snapTarget = closest && closest.distance < snap.fSnapThreshold ? closest : undefined;
8814
+ this._emitSnapTargetChange(sourceRef, snapTarget?.connector);
8247
8815
  this._drawSnapConnection(sourceRef, snapTarget);
8248
8816
  }
8817
+ /** One event per acquired/switched/released snap target, not one per pointer move. */
8818
+ _emitSnapTargetChange(sourceRef, target) {
8819
+ const snap = this._snapConnection;
8820
+ if (!snap) {
8821
+ return;
8822
+ }
8823
+ const targetId = target?.fId();
8824
+ if (targetId === this._snapTargetId) {
8825
+ return;
8826
+ }
8827
+ this._snapTargetId = targetId;
8828
+ snap.fSnapTargetChange.emit(new FSnapTargetChangeEvent(this._resolveEventSource(sourceRef.connector).fId(), targetId));
8829
+ }
8249
8830
  /**
8250
8831
  * Resolves the connectable target at a client-space point using the same priority as
8251
8832
  * the drag drop: rect hit, then snap-threshold closest, then `fConnectOnNode` node.
@@ -8326,6 +8907,11 @@ class FCreateConnectionSession {
8326
8907
  snap.redraw();
8327
8908
  }
8328
8909
  _end() {
8910
+ const sourceRef = this._sourceRef;
8911
+ if (sourceRef && this._snapTargetId !== undefined) {
8912
+ this._emitSnapTargetChange(sourceRef, undefined);
8913
+ }
8914
+ this._snapTargetId = undefined;
8329
8915
  const connection = this._connection;
8330
8916
  if (connection) {
8331
8917
  connection.redraw();
@@ -9151,8 +9737,14 @@ let ReassignConnectionPreparation = class ReassignConnectionPreparation {
9151
9737
  this._startDrag(connection, pointerInFlow);
9152
9738
  queueMicrotask(() => this._bringToFront(connection));
9153
9739
  }
9740
+ /**
9741
+ * Connections attached to the same connector have coinciding drag handles, so
9742
+ * a selected connection wins over registration order — grabbing the handle of
9743
+ * the connection the user just selected is what they aimed at (discussion #328).
9744
+ */
9154
9745
  _findConnectionAt(pointerInFlow) {
9155
- return this._connections.find((c) => isPointerInsideStartOrEndDragHandles(c, pointerInFlow));
9746
+ const matches = this._connections.filter((c) => isPointerInsideStartOrEndDragHandles(c, pointerInFlow));
9747
+ return matches.find((c) => c.isSelected()) ?? matches[0];
9156
9748
  }
9157
9749
  _capturePointerDown(request) {
9158
9750
  this._dragContext.onPointerDownScale = this._transform.scale;
@@ -12221,11 +12813,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImpor
12221
12813
  }]
12222
12814
  }] });
12223
12815
 
12224
- let uniqueId$6 = 0;
12816
+ let uniqueId$3 = 0;
12225
12817
  class FExternalItem extends FExternalItemBase {
12226
12818
  _apiService = inject(FExternalItemService);
12227
12819
  /** Stable id for matching drag sessions, lookups, etc. */
12228
- externalItemId = input(`f-external-item-${uniqueId$6++}`, ...(ngDevMode ? [{ debugName: "externalItemId", alias: 'fExternalItemId' }] : [{
12820
+ externalItemId = input(`f-external-item-${uniqueId$3++}`, ...(ngDevMode ? [{ debugName: "externalItemId", alias: 'fExternalItemId' }] : [{
12229
12821
  alias: 'fExternalItemId',
12230
12822
  }]));
12231
12823
  /** Payload attached to external item. */
@@ -16749,7 +17341,7 @@ class FindConnectableConnectorUsingPriorityAndPositionRequest {
16749
17341
  /**
16750
17342
  * Execution that finds a connectable connector at a given position with priority.
16751
17343
  * It checks for connectors at the position, the closest connector if snap connection is enabled,
16752
- * and the first connectable connector of the node at that position.
17344
+ * and the closest connectable connector of the node at that position.
16753
17345
  */
16754
17346
  let FindConnectableConnectorUsingPriorityAndPosition = class FindConnectableConnectorUsingPriorityAndPosition {
16755
17347
  _mediator = inject(FMediator);
@@ -16775,12 +17367,12 @@ let FindConnectableConnectorUsingPriorityAndPosition = class FindConnectableConn
16775
17367
  const result = [];
16776
17368
  result.push(...this._filterConnectorsThatLocatedAtPosition(request));
16777
17369
  // Closest connector is only added if snap connection is enabled and there is a closest connector found
16778
- // Closest connector has more priority than the first connectable input of the node at position
17370
+ // Closest connector has more priority than the node-level connector of the node at position
16779
17371
  const closestConnector = this._isSnapConnectionEnabledAndHasClosestConnector(request);
16780
17372
  if (closestConnector) {
16781
17373
  result.unshift(closestConnector.connector);
16782
17374
  }
16783
- const fInput = this._getFirstConnectableConnectorOfNodeAtPosition(request);
17375
+ const fInput = this._getClosestConnectableConnectorOfNodeAtPosition(request);
16784
17376
  if (fInput) {
16785
17377
  result.push(fInput);
16786
17378
  }
@@ -16806,12 +17398,13 @@ let FindConnectableConnectorUsingPriorityAndPosition = class FindConnectableConn
16806
17398
  _isValidClosestInput(closestConnector) {
16807
17399
  return !!closestConnector && closestConnector.distance < this._snapConnection.fSnapThreshold;
16808
17400
  }
16809
- //if node placed in position and fConnectOnNode is true, return the first connectable connector of the node
16810
- _getFirstConnectableConnectorOfNodeAtPosition(request) {
17401
+ //if node placed in position and fConnectOnNode is true, return the closest connectable connector of the node
17402
+ _getClosestConnectableConnectorOfNodeAtPosition(request) {
17403
+ const pointerInFlow = this._calculatePointerInFlow(request.pointerPosition);
16811
17404
  return this._getElementsFromPoint(request.pointerPosition)
16812
17405
  .map((x) => this._findConnectableNode(x))
16813
17406
  .filter((x) => !!x)
16814
- .map((x) => this._findFirstConnectableConnectorOfNode(request.connectableConnectors, x))
17407
+ .map((x) => this._findClosestConnectableConnectorOfNode(request.connectableConnectors, x, pointerInFlow))
16815
17408
  .find((x) => !!x);
16816
17409
  }
16817
17410
  _getElementsFromPoint(position) {
@@ -16820,8 +17413,14 @@ let FindConnectableConnectorUsingPriorityAndPosition = class FindConnectableConn
16820
17413
  _findConnectableNode(element) {
16821
17414
  return this._fNodes.find((x) => x.isContains(element) && x.fConnectOnNode());
16822
17415
  }
16823
- _findFirstConnectableConnectorOfNode(connectableInputs, fNode) {
16824
- return connectableInputs.find((x) => x.connector.fNodeId === fNode.fId())?.connector;
17416
+ /**
17417
+ * A node can expose several connectable connectors; picking the one nearest
17418
+ * to the drop point matches what the user aimed at, while registration order
17419
+ * would pick an arbitrary one (see issue #326).
17420
+ */
17421
+ _findClosestConnectableConnectorOfNode(connectableConnectors, fNode, pointerInFlow) {
17422
+ const nodeConnectors = connectableConnectors.filter((x) => x.connector.fNodeId === fNode.fId());
17423
+ return this._mediator.execute(new CalculateClosestConnectorRequest(pointerInFlow, nodeConnectors))?.connector;
16825
17424
  }
16826
17425
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: FindConnectableConnectorUsingPriorityAndPosition, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
16827
17426
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: FindConnectableConnectorUsingPriorityAndPosition });
@@ -19087,6 +19686,8 @@ class RunDevDiagnosticsRequest {
19087
19686
  static fToken = Symbol('RunDevDiagnosticsRequest');
19088
19687
  }
19089
19688
 
19689
+ const DEFAULT_MIN_CONNECTOR_SIZE = 1;
19690
+ const DEFAULT_MAX_NODE_POSITION_DRIFT = 2;
19090
19691
  /**
19091
19692
  * Dev-mode misconfiguration checks (`FFxxxx` codes), run after each settled nodes
19092
19693
  * change. Every check targets a real-world silent failure mined from support issues;
@@ -19094,6 +19695,7 @@ class RunDevDiagnosticsRequest {
19094
19695
  */
19095
19696
  let RunDevDiagnostics = class RunDevDiagnostics {
19096
19697
  _store = inject(FComponentsStore);
19698
+ _config = inject(F_FLOW_CONFIG, { optional: true });
19097
19699
  handle(_) {
19098
19700
  if (!isFDevMode()) {
19099
19701
  return;
@@ -19101,6 +19703,8 @@ let RunDevDiagnostics = class RunDevDiagnostics {
19101
19703
  this._checkDetachedItems();
19102
19704
  this._checkInteractionsWithoutDraggable();
19103
19705
  this._checkHiddenConnectors();
19706
+ this._checkZeroSizeConnectors();
19707
+ this._checkNodePositionDrift();
19104
19708
  this._checkNestedNodes();
19105
19709
  this._checkDanglingParentIds();
19106
19710
  }
@@ -19157,23 +19761,89 @@ let RunDevDiagnostics = class RunDevDiagnostics {
19157
19761
  }
19158
19762
  return features;
19159
19763
  }
19160
- /**
19161
- * FF1006 — a connector hidden with CSS (`display: none`) still registers, but its
19162
- * geometry is a 0×0 point: connections attach to the wrong place or nowhere.
19163
- */
19164
- _checkHiddenConnectors() {
19165
- const connectors = [
19764
+ /**
19765
+ * FF1006 — a connector hidden with CSS (`display: none`) still registers, but its
19766
+ * geometry is a 0×0 point: connections attach to the wrong place or nowhere.
19767
+ */
19768
+ _checkHiddenConnectors() {
19769
+ for (const connector of this._allConnectors()) {
19770
+ const host = connector.hostElement;
19771
+ if (host.isConnected && host.getClientRects().length === 0) {
19772
+ fWarnOnce('FF1006', connector.fId(), `Connector "${connector.fId()}" is hidden with CSS (display: none?), so its geometry is a 0×0 point and connections cannot attach to it correctly. Conditionally render it instead of hiding it.`);
19773
+ }
19774
+ }
19775
+ }
19776
+ /**
19777
+ * FF1010 — a rendered connector whose own box is zero/near-zero sized. The visual
19778
+ * dot is often drawn with `::before`/`::after`, but hit-testing and connection
19779
+ * geometry use the element's box, so drops land past the connector and fall back
19780
+ * to node-level connect (see issue #326). Threshold comes from
19781
+ * `provideFFlow({ diagnostics: { minConnectorSize } })`; `0` disables the check.
19782
+ */
19783
+ _checkZeroSizeConnectors() {
19784
+ const threshold = this._config?.diagnostics?.minConnectorSize ?? DEFAULT_MIN_CONNECTOR_SIZE;
19785
+ if (threshold <= 0) {
19786
+ return;
19787
+ }
19788
+ for (const connector of this._allConnectors()) {
19789
+ const host = connector.hostElement;
19790
+ if (!host.isConnected || host.getClientRects().length === 0) {
19791
+ continue;
19792
+ }
19793
+ const { width, height } = host.getBoundingClientRect();
19794
+ if (width < threshold || height < threshold) {
19795
+ fWarnOnce('FF1010', connector.fId(), `Connector "${connector.fId()}" is ${Math.round(width)}×${Math.round(height)}px. Hit-testing and connection geometry use the element's own box, so a dot drawn with ::before/::after is not enough — give the connector element itself a size (width/height).`);
19796
+ }
19797
+ }
19798
+ }
19799
+ /**
19800
+ * FF1011 — a node whose rendered box diverges from its model position. The canvas
19801
+ * places the host at `fNodePosition`, so a drift means app CSS on the node host
19802
+ * (margin, left/top, an extra transform) or out-of-band positioning moved the
19803
+ * visuals; model-driven features (minimap, fitToScreen, auto-layout) keep using
19804
+ * the model position and disagree with what the user sees (see issue #331).
19805
+ * Threshold comes from `provideFFlow({ diagnostics: { maxNodePositionDrift } })`;
19806
+ * `0` disables the check.
19807
+ */
19808
+ _checkNodePositionDrift() {
19809
+ const threshold = this._config?.diagnostics?.maxNodePositionDrift ?? DEFAULT_MAX_NODE_POSITION_DRIFT;
19810
+ if (threshold <= 0) {
19811
+ return;
19812
+ }
19813
+ const flowHost = this._store.flowHost;
19814
+ const transform = this._store.transform;
19815
+ if (!flowHost || !transform) {
19816
+ return;
19817
+ }
19818
+ const scale = transform.scale || 1;
19819
+ for (const node of this._store.nodes.getAll()) {
19820
+ const host = node.hostElement;
19821
+ if (!host.isConnected || host.getClientRects().length === 0) {
19822
+ continue;
19823
+ }
19824
+ const rect = host.getBoundingClientRect();
19825
+ const renderedCenter = calculatePointerInFlow({ x: rect.left + rect.width / 2, y: rect.top + rect.height / 2 }, flowHost, transform);
19826
+ // Centers survive rotation (the host spins around its own center), so compare
19827
+ // them instead of AABB origins; sizes come from unscaled layout geometry.
19828
+ const width = typeof host.offsetWidth === 'number' ? host.offsetWidth : rect.width / scale;
19829
+ const height = typeof host.offsetHeight === 'number' ? host.offsetHeight : rect.height / scale;
19830
+ const driftX = renderedCenter.x - (node._position.x + width / 2);
19831
+ const driftY = renderedCenter.y - (node._position.y + height / 2);
19832
+ // Compared in on-screen pixels: at deep zoom-out a sub-pixel gBCR reading
19833
+ // divided by the scale would otherwise cross the threshold on its own.
19834
+ const drift = Math.max(Math.abs(driftX), Math.abs(driftY)) * scale;
19835
+ if (drift > threshold) {
19836
+ fWarnOnce('FF1011', node.fId(), `${this._describe(node)} "${node.fId()}" is rendered ~${Math.round(drift)}px away from its fNodePosition (model x: ${Math.round(node._position.x)}, y: ${Math.round(node._position.y)}; rendered x: ${Math.round(renderedCenter.x - width / 2)}, y: ${Math.round(renderedCenter.y - height / 2)}). The minimap, fitToScreen and auto-layout read the model, so they place this node where fNodePosition says — not where CSS moved it. Fold the offset (margin/left/top/extra transform on the node host) into fNodePosition instead.`);
19837
+ }
19838
+ }
19839
+ }
19840
+ _allConnectors() {
19841
+ return [
19166
19842
  ...this._store.connectors.getAll(),
19167
19843
  ...this._store.outputs.getAll(),
19168
19844
  ...this._store.inputs.getAll(),
19169
19845
  ...this._store.outlets.getAll(),
19170
19846
  ];
19171
- for (const connector of connectors) {
19172
- const host = connector.hostElement;
19173
- if (host.isConnected && host.getClientRects().length === 0) {
19174
- fWarnOnce('FF1006', connector.fId(), `Connector "${connector.fId()}" is hidden with CSS (display: none?), so its geometry is a 0×0 point and connections cannot attach to it correctly. Conditionally render it instead of hiding it.`);
19175
- }
19176
- }
19177
19847
  }
19178
19848
  /**
19179
19849
  * FF1007 — an `[fNode]`/`[fGroup]` element nested inside another node element: the
@@ -20502,7 +21172,7 @@ const COMMON_PROVIDERS = [
20502
21172
  MoveFrontElementsBeforeTargetElement,
20503
21173
  ];
20504
21174
 
20505
- let uniqueId$5 = 0;
21175
+ let uniqueId$2 = 0;
20506
21176
  class FRectPatternComponent {
20507
21177
  _destroyRef = inject(DestroyRef);
20508
21178
  _elementReference = inject(ElementRef);
@@ -20511,7 +21181,7 @@ class FRectPatternComponent {
20511
21181
  get hostElement() {
20512
21182
  return this._elementReference.nativeElement;
20513
21183
  }
20514
- id = input(`f-pattern-${uniqueId$5++}`, ...(ngDevMode ? [{ debugName: "id" }] : []));
21184
+ id = input(`f-pattern-${uniqueId$2++}`, ...(ngDevMode ? [{ debugName: "id" }] : []));
20515
21185
  vColor = input('rgba(0,0,0,0.1)', ...(ngDevMode ? [{ debugName: "vColor" }] : []));
20516
21186
  hColor = input('rgba(0,0,0,0.1)', ...(ngDevMode ? [{ debugName: "hColor" }] : []));
20517
21187
  vSize = input(20, ...(ngDevMode ? [{ debugName: "vSize", transform: numberAttribute }] : [{ transform: numberAttribute }]));
@@ -20595,7 +21265,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImpor
20595
21265
  }]
20596
21266
  }], ctorParameters: () => [], propDecorators: { id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], vColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "vColor", required: false }] }], hColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "hColor", required: false }] }], vSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "vSize", required: false }] }], hSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "hSize", required: false }] }] } });
20597
21267
 
20598
- let uniqueId$4 = 0;
21268
+ let uniqueId$1 = 0;
20599
21269
  class FCirclePatternComponent {
20600
21270
  _destroyRef = inject(DestroyRef);
20601
21271
  _elementReference = inject(ElementRef);
@@ -20604,7 +21274,7 @@ class FCirclePatternComponent {
20604
21274
  get hostElement() {
20605
21275
  return this._elementReference.nativeElement;
20606
21276
  }
20607
- id = input(`f-pattern-${uniqueId$4++}`, ...(ngDevMode ? [{ debugName: "id" }] : []));
21277
+ id = input(`f-pattern-${uniqueId$1++}`, ...(ngDevMode ? [{ debugName: "id" }] : []));
20608
21278
  color = input('rgba(0,0,0,0.1)', ...(ngDevMode ? [{ debugName: "color" }] : []));
20609
21279
  radius = input(20, ...(ngDevMode ? [{ debugName: "radius", transform: numberAttribute }] : [{ transform: numberAttribute }]));
20610
21280
  _scaledRadius = 20;
@@ -21036,11 +21706,13 @@ class FCanvasComponent extends FCanvasBase {
21036
21706
  * @param padding - paddings from the bounds of the canvas
21037
21707
  * @param animated - If true, the fit will be animated; otherwise, it will be instantaneous.
21038
21708
  * @param emitCanvasChange - If false, does not emit `fCanvasChange` for this programmatic move.
21709
+ * @param maxScale - Upper bound for the resulting scale, so a small graph is not
21710
+ * magnified to fill the viewport. Unlimited when omitted.
21039
21711
  */
21040
- fitToScreen(padding = PointExtensions.initialize(), animated = true, emitCanvasChange = true) {
21712
+ fitToScreen(padding = PointExtensions.initialize(), animated = true, emitCanvasChange = true, maxScale) {
21041
21713
  this._warnWhenCalledBeforeNodesRender('fitToScreen()');
21042
21714
  this._afterRedraw(() => {
21043
- this._mediator.execute(new FitToFlowRequest(padding, animated, emitCanvasChange));
21715
+ this._mediator.execute(new FitToFlowRequest(padding, animated, emitCanvasChange, maxScale));
21044
21716
  });
21045
21717
  }
21046
21718
  /**
@@ -21105,251 +21777,6 @@ const F_CANVAS_PROVIDERS = [
21105
21777
  FCanvasComponent,
21106
21778
  ];
21107
21779
 
21108
- let uniqueId$3 = 0;
21109
- class FConnectionComponent extends FConnectionBase {
21110
- fId = input(`f-connection-${uniqueId$3++}`, ...(ngDevMode ? [{ debugName: "fId", alias: 'fConnectionId' }] : [{ alias: 'fConnectionId' }]));
21111
- fSourceId = input('', ...(ngDevMode ? [{ debugName: "fSourceId", transform: (value) => stringAttribute(value) || '' }] : [{
21112
- transform: (value) => stringAttribute(value) || '',
21113
- }]));
21114
- fTargetId = input('', ...(ngDevMode ? [{ debugName: "fTargetId", transform: (value) => stringAttribute(value) || '' }] : [{
21115
- transform: (value) => stringAttribute(value) || '',
21116
- }]));
21117
- /** @deprecated Use `fSourceId`. */
21118
- fOutputId = input('', ...(ngDevMode ? [{ debugName: "fOutputId", transform: (value) => stringAttribute(value) || '' }] : [{
21119
- transform: (value) => stringAttribute(value) || '',
21120
- }]));
21121
- /** @deprecated Use `fTargetId`. */
21122
- fInputId = input('', ...(ngDevMode ? [{ debugName: "fInputId", transform: (value) => stringAttribute(value) || '' }] : [{
21123
- transform: (value) => stringAttribute(value) || '',
21124
- }]));
21125
- fRadius = 8;
21126
- fOffset = 12;
21127
- fBehavior = EFConnectionBehavior.FIXED;
21128
- fType = EFConnectionType.STRAIGHT;
21129
- fSelectionDisabled = input(false, ...(ngDevMode ? [{ debugName: "fSelectionDisabled", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
21130
- fReassignableStart = input(false, ...(ngDevMode ? [{ debugName: "fReassignableStart", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
21131
- fDraggingDisabled = input(false, ...(ngDevMode ? [{ debugName: "fDraggingDisabled", alias: 'fReassignDisabled',
21132
- transform: booleanAttribute }] : [{
21133
- alias: 'fReassignDisabled',
21134
- transform: booleanAttribute,
21135
- }]));
21136
- fSourceSide = input(EFConnectionConnectableSide.DEFAULT, ...(ngDevMode ? [{ debugName: "fSourceSide", transform: (x) => {
21137
- return castToEnum(x, 'fSourceSide', EFConnectionConnectableSide);
21138
- } }] : [{
21139
- transform: (x) => {
21140
- return castToEnum(x, 'fSourceSide', EFConnectionConnectableSide);
21141
- },
21142
- }]));
21143
- fTargetSide = input(EFConnectionConnectableSide.DEFAULT, ...(ngDevMode ? [{ debugName: "fTargetSide", transform: (x) => {
21144
- return castToEnum(x, 'fTargetSide', EFConnectionConnectableSide);
21145
- } }] : [{
21146
- transform: (x) => {
21147
- return castToEnum(x, 'fTargetSide', EFConnectionConnectableSide);
21148
- },
21149
- }]));
21150
- /** @deprecated Use `fTargetSide`. */
21151
- fInputSide = input(EFConnectionConnectableSide.DEFAULT, ...(ngDevMode ? [{ debugName: "fInputSide", transform: (x) => {
21152
- return castToEnum(x, 'fInputSide', EFConnectionConnectableSide);
21153
- } }] : [{
21154
- transform: (x) => {
21155
- return castToEnum(x, 'fInputSide', EFConnectionConnectableSide);
21156
- },
21157
- }]));
21158
- /** @deprecated Use `fSourceSide`. */
21159
- fOutputSide = input(EFConnectionConnectableSide.DEFAULT, ...(ngDevMode ? [{ debugName: "fOutputSide", transform: (x) => {
21160
- return castToEnum(x, 'fOutputSide', EFConnectionConnectableSide);
21161
- } }] : [{
21162
- transform: (x) => {
21163
- return castToEnum(x, 'fOutputSide', EFConnectionConnectableSide);
21164
- },
21165
- }]));
21166
- get boundingElement() {
21167
- return this.fPath().hostElement;
21168
- }
21169
- _mediator = inject(FMediator);
21170
- ngOnInit() {
21171
- this._mediator.execute(new AddConnectionToStoreRequest(this));
21172
- }
21173
- ngOnChanges() {
21174
- this._mediator.execute(new EmitConnectionsChangesRequest());
21175
- }
21176
- ngOnDestroy() {
21177
- this._mediator.execute(new RemoveConnectionFromStoreRequest(this));
21178
- }
21179
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: FConnectionComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
21180
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.9", type: FConnectionComponent, isStandalone: false, selector: "f-connection", inputs: { fId: { classPropertyName: "fId", publicName: "fConnectionId", isSignal: true, isRequired: false, transformFunction: null }, fSourceId: { classPropertyName: "fSourceId", publicName: "fSourceId", isSignal: true, isRequired: false, transformFunction: null }, fTargetId: { classPropertyName: "fTargetId", publicName: "fTargetId", isSignal: true, isRequired: false, transformFunction: null }, fOutputId: { classPropertyName: "fOutputId", publicName: "fOutputId", isSignal: true, isRequired: false, transformFunction: null }, fInputId: { classPropertyName: "fInputId", publicName: "fInputId", isSignal: true, isRequired: false, transformFunction: null }, fRadius: { classPropertyName: "fRadius", publicName: "fRadius", isSignal: false, isRequired: false, transformFunction: numberAttribute }, fOffset: { classPropertyName: "fOffset", publicName: "fOffset", isSignal: false, isRequired: false, transformFunction: numberAttribute }, fBehavior: { classPropertyName: "fBehavior", publicName: "fBehavior", isSignal: false, isRequired: false, transformFunction: (value) => castToEnum(value, 'fBehavior', EFConnectionBehavior) }, fType: { classPropertyName: "fType", publicName: "fType", isSignal: false, isRequired: false, transformFunction: null }, fSelectionDisabled: { classPropertyName: "fSelectionDisabled", publicName: "fSelectionDisabled", isSignal: true, isRequired: false, transformFunction: null }, fReassignableStart: { classPropertyName: "fReassignableStart", publicName: "fReassignableStart", isSignal: true, isRequired: false, transformFunction: null }, fDraggingDisabled: { classPropertyName: "fDraggingDisabled", publicName: "fReassignDisabled", isSignal: true, isRequired: false, transformFunction: null }, fSourceSide: { classPropertyName: "fSourceSide", publicName: "fSourceSide", isSignal: true, isRequired: false, transformFunction: null }, fTargetSide: { classPropertyName: "fTargetSide", publicName: "fTargetSide", isSignal: true, isRequired: false, transformFunction: null }, fInputSide: { classPropertyName: "fInputSide", publicName: "fInputSide", isSignal: true, isRequired: false, transformFunction: null }, fOutputSide: { classPropertyName: "fOutputSide", publicName: "fOutputSide", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.id": "fId()", "attr.data-f-connection-type": "fType", "class.f-connection-selection-disabled": "fSelectionDisabled()", "class.f-connection-reassign-disabled": "fDraggingDisabled()" }, classAttribute: "f-component f-connection" }, providers: [{ provide: F_CONNECTION_COMPONENTS_PARENT, useExisting: FConnectionComponent }], exportAs: ["fComponent"], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<svg xmlns=\"http://www.w3.org/2000/svg\">\n <defs #defs></defs>\n <ng-content select=\"svg[fMarker]\" />\n <g class=\"f-connection-group\">\n @if (fGradient(); as gradient) {\n <linearGradient\n fConnectionGradientRenderer\n [fConnectionGradientRendererFor]=\"gradient\"\n ></linearGradient>\n }\n <path fConnectionSelection [attr.d]=\"path\"></path>\n <g>\n <path f-connection-path [useGradient]=\"!!fGradient()\" [attr.d]=\"path\"></path>\n @if (fReassignableStart()) {\n <circle f-connection-drag-handle-start r=\"8\"></circle>\n }\n <circle f-connection-drag-handle-end r=\"8\"></circle>\n </g>\n </g>\n</svg>\n<ng-content select=\"f-connection-marker-circle, f-connection-marker-arrow\" />\n<ng-content select=\"f-connection-gradient\" />\n<ng-content select=\"f-connection-waypoints\" />\n\n@if (fContents().length) {\n <ng-content select=\"[fConnectionContent]\" />\n}\n", styles: [":host{pointer-events:none}:host svg{display:block;vertical-align:middle;overflow:visible!important;position:absolute}:host svg .f-connection-group{pointer-events:all}:host .f-connection-content{pointer-events:all}\n"], dependencies: [{ kind: "component", type: FConnectionGradientRenderer, selector: "linearGradient[fConnectionGradientRenderer]", inputs: ["fConnectionGradientRendererFor"] }, { kind: "component", type: FConnectionDragHandleStart, selector: "circle[f-connection-drag-handle-start]" }, { kind: "component", type: FConnectionDragHandleEnd, selector: "circle[f-connection-drag-handle-end]" }, { kind: "component", type: FConnectionPath, selector: "path[f-connection-path]", inputs: ["useGradient"] }, { kind: "component", type: FConnectionSelection, selector: "path[fConnectionSelection]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
21181
- }
21182
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: FConnectionComponent, decorators: [{
21183
- type: Component,
21184
- args: [{ standalone: false, selector: 'f-connection', exportAs: 'fComponent', changeDetection: ChangeDetectionStrategy.OnPush, host: {
21185
- '[attr.id]': 'fId()',
21186
- '[attr.data-f-connection-type]': 'fType',
21187
- class: 'f-component f-connection',
21188
- '[class.f-connection-selection-disabled]': 'fSelectionDisabled()',
21189
- '[class.f-connection-reassign-disabled]': 'fDraggingDisabled()',
21190
- }, providers: [{ provide: F_CONNECTION_COMPONENTS_PARENT, useExisting: FConnectionComponent }], template: "<svg xmlns=\"http://www.w3.org/2000/svg\">\n <defs #defs></defs>\n <ng-content select=\"svg[fMarker]\" />\n <g class=\"f-connection-group\">\n @if (fGradient(); as gradient) {\n <linearGradient\n fConnectionGradientRenderer\n [fConnectionGradientRendererFor]=\"gradient\"\n ></linearGradient>\n }\n <path fConnectionSelection [attr.d]=\"path\"></path>\n <g>\n <path f-connection-path [useGradient]=\"!!fGradient()\" [attr.d]=\"path\"></path>\n @if (fReassignableStart()) {\n <circle f-connection-drag-handle-start r=\"8\"></circle>\n }\n <circle f-connection-drag-handle-end r=\"8\"></circle>\n </g>\n </g>\n</svg>\n<ng-content select=\"f-connection-marker-circle, f-connection-marker-arrow\" />\n<ng-content select=\"f-connection-gradient\" />\n<ng-content select=\"f-connection-waypoints\" />\n\n@if (fContents().length) {\n <ng-content select=\"[fConnectionContent]\" />\n}\n", styles: [":host{pointer-events:none}:host svg{display:block;vertical-align:middle;overflow:visible!important;position:absolute}:host svg .f-connection-group{pointer-events:all}:host .f-connection-content{pointer-events:all}\n"] }]
21191
- }], propDecorators: { fId: [{ type: i0.Input, args: [{ isSignal: true, alias: "fConnectionId", required: false }] }], fSourceId: [{ type: i0.Input, args: [{ isSignal: true, alias: "fSourceId", required: false }] }], fTargetId: [{ type: i0.Input, args: [{ isSignal: true, alias: "fTargetId", required: false }] }], fOutputId: [{ type: i0.Input, args: [{ isSignal: true, alias: "fOutputId", required: false }] }], fInputId: [{ type: i0.Input, args: [{ isSignal: true, alias: "fInputId", required: false }] }], fRadius: [{
21192
- type: Input,
21193
- args: [{ transform: numberAttribute }]
21194
- }], fOffset: [{
21195
- type: Input,
21196
- args: [{ transform: numberAttribute }]
21197
- }], fBehavior: [{
21198
- type: Input,
21199
- args: [{ transform: (value) => castToEnum(value, 'fBehavior', EFConnectionBehavior) }]
21200
- }], fType: [{
21201
- type: Input
21202
- }], fSelectionDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "fSelectionDisabled", required: false }] }], fReassignableStart: [{ type: i0.Input, args: [{ isSignal: true, alias: "fReassignableStart", required: false }] }], fDraggingDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "fReassignDisabled", required: false }] }], fSourceSide: [{ type: i0.Input, args: [{ isSignal: true, alias: "fSourceSide", required: false }] }], fTargetSide: [{ type: i0.Input, args: [{ isSignal: true, alias: "fTargetSide", required: false }] }], fInputSide: [{ type: i0.Input, args: [{ isSignal: true, alias: "fInputSide", required: false }] }], fOutputSide: [{ type: i0.Input, args: [{ isSignal: true, alias: "fOutputSide", required: false }] }] } });
21203
-
21204
- let uniqueId$2 = 0;
21205
- class FConnectionForCreateComponent extends FConnectionBase {
21206
- fId = signal(`f-connection-for-create-${uniqueId$2++}`, ...(ngDevMode ? [{ debugName: "fId" }] : []));
21207
- fOutputId = signal('', ...(ngDevMode ? [{ debugName: "fOutputId" }] : []));
21208
- fInputId = signal('', ...(ngDevMode ? [{ debugName: "fInputId" }] : []));
21209
- fRadius = 8;
21210
- fOffset = 12;
21211
- fBehavior = EFConnectionBehavior.FIXED;
21212
- fType = EFConnectionType.STRAIGHT;
21213
- fInputSide = input(EFConnectionConnectableSide.DEFAULT, ...(ngDevMode ? [{ debugName: "fInputSide", transform: (x) => {
21214
- return castToEnum(x, 'fInputSide', EFConnectionConnectableSide);
21215
- } }] : [{
21216
- transform: (x) => {
21217
- return castToEnum(x, 'fInputSide', EFConnectionConnectableSide);
21218
- },
21219
- }]));
21220
- fOutputSide = input(EFConnectionConnectableSide.DEFAULT, ...(ngDevMode ? [{ debugName: "fOutputSide", transform: (x) => {
21221
- return castToEnum(x, 'fOutputSide', EFConnectionConnectableSide);
21222
- } }] : [{
21223
- transform: (x) => {
21224
- return castToEnum(x, 'fOutputSide', EFConnectionConnectableSide);
21225
- },
21226
- }]));
21227
- get boundingElement() {
21228
- return this.fPath().hostElement;
21229
- }
21230
- _mediator = inject(FMediator);
21231
- ngOnInit() {
21232
- this._mediator.execute(new AddConnectionForCreateToStoreRequest(this));
21233
- }
21234
- ngAfterViewInit() {
21235
- this.hide();
21236
- }
21237
- ngOnChanges() {
21238
- this._mediator.execute(new EmitConnectionsChangesRequest());
21239
- }
21240
- ngOnDestroy() {
21241
- this._mediator.execute(new RemoveConnectionForCreateFromStoreRequest());
21242
- }
21243
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: FConnectionForCreateComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
21244
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.9", type: FConnectionForCreateComponent, isStandalone: false, selector: "f-connection-for-create", inputs: { fRadius: { classPropertyName: "fRadius", publicName: "fRadius", isSignal: false, isRequired: false, transformFunction: numberAttribute }, fOffset: { classPropertyName: "fOffset", publicName: "fOffset", isSignal: false, isRequired: false, transformFunction: numberAttribute }, fBehavior: { classPropertyName: "fBehavior", publicName: "fBehavior", isSignal: false, isRequired: false, transformFunction: (value) => castToEnum(value, 'fBehavior', EFConnectionBehavior) }, fType: { classPropertyName: "fType", publicName: "fType", isSignal: false, isRequired: false, transformFunction: null }, fInputSide: { classPropertyName: "fInputSide", publicName: "fInputSide", isSignal: true, isRequired: false, transformFunction: null }, fOutputSide: { classPropertyName: "fOutputSide", publicName: "fOutputSide", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "aria-hidden": "true" }, classAttribute: "f-component f-connection f-connection-for-create" }, providers: [
21245
- { provide: F_CONNECTION_COMPONENTS_PARENT, useExisting: FConnectionForCreateComponent },
21246
- ], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<svg xmlns=\"http://www.w3.org/2000/svg\">\n <defs #defs></defs>\n <ng-content select=\"svg[fMarker]\" />\n <g class=\"f-connection-group\">\n @if (fGradient(); as gradient) {\n <linearGradient\n fConnectionGradientRenderer\n [fConnectionGradientRendererFor]=\"gradient\"\n ></linearGradient>\n }\n <path fConnectionSelection [attr.d]=\"path\"></path>\n <g>\n <path f-connection-path [useGradient]=\"!!fGradient()\" [attr.d]=\"path\"></path>\n <circle f-connection-drag-handle-end r=\"8\"></circle>\n </g>\n </g>\n</svg>\n<ng-content select=\"f-connection-marker-circle, f-connection-marker-arrow\" />\n<ng-content select=\"f-connection-gradient\" />\n\n@if (fContents().length) {\n <ng-content select=\"[fConnectionContent]\" />\n}\n", styles: [":host{pointer-events:none;position:absolute}:host svg{overflow:visible}:host svg .f-connection-group{pointer-events:all}:host .f-connection-content{pointer-events:all}\n"], dependencies: [{ kind: "component", type: FConnectionGradientRenderer, selector: "linearGradient[fConnectionGradientRenderer]", inputs: ["fConnectionGradientRendererFor"] }, { kind: "component", type: FConnectionDragHandleEnd, selector: "circle[f-connection-drag-handle-end]" }, { kind: "component", type: FConnectionPath, selector: "path[f-connection-path]", inputs: ["useGradient"] }, { kind: "component", type: FConnectionSelection, selector: "path[fConnectionSelection]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
21247
- }
21248
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: FConnectionForCreateComponent, decorators: [{
21249
- type: Component,
21250
- args: [{ standalone: false, selector: 'f-connection-for-create', changeDetection: ChangeDetectionStrategy.OnPush, host: {
21251
- class: 'f-component f-connection f-connection-for-create',
21252
- 'aria-hidden': 'true',
21253
- }, providers: [
21254
- { provide: F_CONNECTION_COMPONENTS_PARENT, useExisting: FConnectionForCreateComponent },
21255
- ], template: "<svg xmlns=\"http://www.w3.org/2000/svg\">\n <defs #defs></defs>\n <ng-content select=\"svg[fMarker]\" />\n <g class=\"f-connection-group\">\n @if (fGradient(); as gradient) {\n <linearGradient\n fConnectionGradientRenderer\n [fConnectionGradientRendererFor]=\"gradient\"\n ></linearGradient>\n }\n <path fConnectionSelection [attr.d]=\"path\"></path>\n <g>\n <path f-connection-path [useGradient]=\"!!fGradient()\" [attr.d]=\"path\"></path>\n <circle f-connection-drag-handle-end r=\"8\"></circle>\n </g>\n </g>\n</svg>\n<ng-content select=\"f-connection-marker-circle, f-connection-marker-arrow\" />\n<ng-content select=\"f-connection-gradient\" />\n\n@if (fContents().length) {\n <ng-content select=\"[fConnectionContent]\" />\n}\n", styles: [":host{pointer-events:none;position:absolute}:host svg{overflow:visible}:host svg .f-connection-group{pointer-events:all}:host .f-connection-content{pointer-events:all}\n"] }]
21256
- }], propDecorators: { fRadius: [{
21257
- type: Input,
21258
- args: [{ transform: numberAttribute }]
21259
- }], fOffset: [{
21260
- type: Input,
21261
- args: [{ transform: numberAttribute }]
21262
- }], fBehavior: [{
21263
- type: Input,
21264
- args: [{ transform: (value) => castToEnum(value, 'fBehavior', EFConnectionBehavior) }]
21265
- }], fType: [{
21266
- type: Input
21267
- }], fInputSide: [{ type: i0.Input, args: [{ isSignal: true, alias: "fInputSide", required: false }] }], fOutputSide: [{ type: i0.Input, args: [{ isSignal: true, alias: "fOutputSide", required: false }] }] } });
21268
-
21269
- let uniqueId$1 = 0;
21270
- class FSnapConnectionComponent extends FConnectionBase {
21271
- fId = signal(`f-snap-connection-${uniqueId$1++}`, ...(ngDevMode ? [{ debugName: "fId" }] : []));
21272
- fSnapThreshold = 20;
21273
- fOutputId = signal('', ...(ngDevMode ? [{ debugName: "fOutputId" }] : []));
21274
- fInputId = signal('', ...(ngDevMode ? [{ debugName: "fInputId" }] : []));
21275
- fRadius = 8;
21276
- fOffset = 12;
21277
- fBehavior = EFConnectionBehavior.FIXED;
21278
- fType = EFConnectionType.STRAIGHT;
21279
- fInputSide = input(EFConnectionConnectableSide.DEFAULT, ...(ngDevMode ? [{ debugName: "fInputSide", transform: (x) => {
21280
- return castToEnum(x, 'fInputSide', EFConnectionConnectableSide);
21281
- } }] : [{
21282
- transform: (x) => {
21283
- return castToEnum(x, 'fInputSide', EFConnectionConnectableSide);
21284
- },
21285
- }]));
21286
- fOutputSide = input(EFConnectionConnectableSide.DEFAULT, ...(ngDevMode ? [{ debugName: "fOutputSide", transform: (x) => {
21287
- return castToEnum(x, 'fOutputSide', EFConnectionConnectableSide);
21288
- } }] : [{
21289
- transform: (x) => {
21290
- return castToEnum(x, 'fOutputSide', EFConnectionConnectableSide);
21291
- },
21292
- }]));
21293
- get boundingElement() {
21294
- return this.fPath().hostElement;
21295
- }
21296
- _mediator = inject(FMediator);
21297
- ngOnInit() {
21298
- this._mediator.execute(new AddSnapConnectionToStoreRequest(this));
21299
- }
21300
- ngAfterViewInit() {
21301
- this.hide();
21302
- }
21303
- ngOnChanges() {
21304
- this._mediator.execute(new EmitConnectionsChangesRequest());
21305
- }
21306
- ngOnDestroy() {
21307
- this._mediator.execute(new RemoveSnapConnectionFromStoreRequest());
21308
- }
21309
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: FSnapConnectionComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
21310
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.9", type: FSnapConnectionComponent, isStandalone: false, selector: "f-snap-connection", inputs: { fSnapThreshold: { classPropertyName: "fSnapThreshold", publicName: "fSnapThreshold", isSignal: false, isRequired: false, transformFunction: numberAttribute }, fRadius: { classPropertyName: "fRadius", publicName: "fRadius", isSignal: false, isRequired: false, transformFunction: numberAttribute }, fOffset: { classPropertyName: "fOffset", publicName: "fOffset", isSignal: false, isRequired: false, transformFunction: numberAttribute }, fBehavior: { classPropertyName: "fBehavior", publicName: "fBehavior", isSignal: false, isRequired: false, transformFunction: (value) => castToEnum(value, 'fBehavior', EFConnectionBehavior) }, fType: { classPropertyName: "fType", publicName: "fType", isSignal: false, isRequired: false, transformFunction: null }, fInputSide: { classPropertyName: "fInputSide", publicName: "fInputSide", isSignal: true, isRequired: false, transformFunction: null }, fOutputSide: { classPropertyName: "fOutputSide", publicName: "fOutputSide", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "aria-hidden": "true" }, classAttribute: "f-component f-connection f-snap-connection" }, providers: [{ provide: F_CONNECTION_COMPONENTS_PARENT, useExisting: FSnapConnectionComponent }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<svg xmlns=\"http://www.w3.org/2000/svg\">\n <defs #defs></defs>\n <ng-content select=\"svg[fMarker]\" />\n <g class=\"f-connection-group\">\n @if (fGradient(); as gradient) {\n <linearGradient\n fConnectionGradientRenderer\n [fConnectionGradientRendererFor]=\"gradient\"\n ></linearGradient>\n }\n <path fConnectionSelection [attr.d]=\"path\"></path>\n <g>\n <path f-connection-path [useGradient]=\"!!fGradient()\" [attr.d]=\"path\"></path>\n <circle f-connection-drag-handle-end r=\"8\"></circle>\n </g>\n </g>\n</svg>\n<ng-content select=\"f-connection-marker-circle, f-connection-marker-arrow\" />\n<ng-content select=\"f-connection-gradient\" />\n\n@if (fContents().length) {\n <ng-content select=\"[fConnectionContent]\" />\n}\n", styles: [":host{pointer-events:none;position:absolute}:host svg{overflow:visible}:host svg .f-connection-group{pointer-events:all}:host .f-connection-content{pointer-events:all}\n"], dependencies: [{ kind: "component", type: FConnectionGradientRenderer, selector: "linearGradient[fConnectionGradientRenderer]", inputs: ["fConnectionGradientRendererFor"] }, { kind: "component", type: FConnectionDragHandleEnd, selector: "circle[f-connection-drag-handle-end]" }, { kind: "component", type: FConnectionPath, selector: "path[f-connection-path]", inputs: ["useGradient"] }, { kind: "component", type: FConnectionSelection, selector: "path[fConnectionSelection]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
21311
- }
21312
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: FSnapConnectionComponent, decorators: [{
21313
- type: Component,
21314
- args: [{ standalone: false, selector: 'f-snap-connection', changeDetection: ChangeDetectionStrategy.OnPush, host: {
21315
- class: 'f-component f-connection f-snap-connection',
21316
- 'aria-hidden': 'true',
21317
- }, providers: [{ provide: F_CONNECTION_COMPONENTS_PARENT, useExisting: FSnapConnectionComponent }], template: "<svg xmlns=\"http://www.w3.org/2000/svg\">\n <defs #defs></defs>\n <ng-content select=\"svg[fMarker]\" />\n <g class=\"f-connection-group\">\n @if (fGradient(); as gradient) {\n <linearGradient\n fConnectionGradientRenderer\n [fConnectionGradientRendererFor]=\"gradient\"\n ></linearGradient>\n }\n <path fConnectionSelection [attr.d]=\"path\"></path>\n <g>\n <path f-connection-path [useGradient]=\"!!fGradient()\" [attr.d]=\"path\"></path>\n <circle f-connection-drag-handle-end r=\"8\"></circle>\n </g>\n </g>\n</svg>\n<ng-content select=\"f-connection-marker-circle, f-connection-marker-arrow\" />\n<ng-content select=\"f-connection-gradient\" />\n\n@if (fContents().length) {\n <ng-content select=\"[fConnectionContent]\" />\n}\n", styles: [":host{pointer-events:none;position:absolute}:host svg{overflow:visible}:host svg .f-connection-group{pointer-events:all}:host .f-connection-content{pointer-events:all}\n"] }]
21318
- }], propDecorators: { fSnapThreshold: [{
21319
- type: Input,
21320
- args: [{ transform: numberAttribute }]
21321
- }], fRadius: [{
21322
- type: Input,
21323
- args: [{ transform: numberAttribute }]
21324
- }], fOffset: [{
21325
- type: Input,
21326
- args: [{ transform: numberAttribute }]
21327
- }], fBehavior: [{
21328
- type: Input,
21329
- args: [{ transform: (value) => castToEnum(value, 'fBehavior', EFConnectionBehavior) }]
21330
- }], fType: [{
21331
- type: Input
21332
- }], fInputSide: [{ type: i0.Input, args: [{ isSignal: true, alias: "fInputSide", required: false }] }], fOutputSide: [{ type: i0.Input, args: [{ isSignal: true, alias: "fOutputSide", required: false }] }] } });
21333
-
21334
- const F_CONNECTION_PROVIDERS = [
21335
- FConnectionDragHandleStart,
21336
- FConnectionDragHandleEnd,
21337
- FConnectionPath,
21338
- FConnectionSelection,
21339
- FConnectionMarker,
21340
- FConnectionComponent,
21341
- FConnectionForCreateComponent,
21342
- FSnapConnectionComponent,
21343
- ];
21344
- const F_CONNECTION_IMPORTS_EXPORTS = [
21345
- FConnectionContent,
21346
- FConnectionMarkerCircle,
21347
- FConnectionMarkerArrow,
21348
- FConnectionGradient,
21349
- FConnectionGradientRenderer,
21350
- FConnectionWaypoints,
21351
- ];
21352
-
21353
21780
  const CLEAR_DELAY = 4000;
21354
21781
  /**
21355
21782
  * Speaks editor feedback to assistive technology through a live region (WCAG 4.1.3 —
@@ -24423,5 +24850,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImpor
24423
24850
  * Generated bundle index. Do not edit.
24424
24851
  */
24425
24852
 
24426
- export { AddCanvasToStore, AddCanvasToStoreRequest, AddConnectionForCreateToStore, AddConnectionForCreateToStoreRequest, AddConnectionMarkerToStore, AddConnectionMarkerToStoreRequest, AddConnectionToStore, AddConnectionToStoreRequest, AddConnectorToStore, AddConnectorToStoreRequest, AddDndToStore, AddDndToStoreRequest, AddFlowToStore, AddFlowToStoreRequest, AddNodeToStore, AddNodeToStoreRequest, AddPatternToBackground, AddPatternToBackgroundRequest, AddSnapConnectionToStore, AddSnapConnectionToStoreRequest, ApplyChildResizeConstraints, ApplyChildResizeConstraintsRequest, ApplyConnectionRender, ApplyConnectionRenderRequest, ApplyConnectionWorkerResult, ApplyConnectionWorkerResultRequest, ApplyParentResizeConstraints, ApplyParentResizeConstraintsRequest, AttachDragNodeHandlerFromSelection, AttachDragNodeHandlerFromSelectionRequest, AttachResizeConnectionDragHandlersToNode, AttachResizeConnectionDragHandlersToNodeRequest, AttachSoftParentConnectionDragHandlersToNode, AttachSoftParentConnectionDragHandlersToNodeRequest, AttachSourceConnectionDragHandlersToNode, AttachSourceConnectionDragHandlersToNodeRequest, AttachTargetConnectionDragHandlersToNode, AttachTargetConnectionDragHandlersToNodeRequest, BuildConnectionLine, BuildConnectionLineRequest, BuildConnectionWorkerBatch, BuildConnectionWorkerBatchRequest, BuildConnectionWorkerPayloadItem, BuildConnectionWorkerPayloadItemRequest, BuildDragNodeConstraints, BuildDragNodeConstraintsRequest, CALCULATABLE_SIDES, COMMON_PROVIDERS, CONNECTABLE_SIDE_EPSILON, CREATE_MOVE_NODE_DRAG_MODEL_FROM_SELECTION_PROVIDERS, CalculateAdaptiveCurveData, CalculateBezierCurveData, CalculateChangedRectFromDifference, CalculateChangedRectFromDifferenceRequest, CalculateClosestConnector, CalculateClosestConnectorRequest, CalculateConnectableSideByConnectedPositions, CalculateConnectableSideByConnectedPositionsRequest, CalculateConnectableSideByInternalPosition, CalculateConnectableSideByInternalPositionRequest, CalculateConnectionsState, CalculateConnectionsStateRequest, CalculateConnectorsConnectableSides, CalculateConnectorsConnectableSidesRequest, CalculateDirectChildrenUnionRect, CalculateDirectChildrenUnionRectRequest, CalculateFlowPointFromMinimapPoint, CalculateFlowPointFromMinimapPointRequest, CalculateFlowState, CalculateFlowStateRequest, CalculateInputConnections, CalculateInputConnectionsRequest, CalculateNodesBoundingBox, CalculateNodesBoundingBoxNormalizedPosition, CalculateNodesBoundingBoxNormalizedPositionRequest, CalculateNodesBoundingBoxRequest, CalculateNodesState, CalculateNodesStateRequest, CalculateOutputConnections, CalculateOutputConnectionsRequest, CalculateResizeLimits, CalculateResizeLimitsRequest, CalculateSegmentLineData, CalculateSelectableItems, CalculateSelectableItemsRequest, CalculateSourceConnectorsToConnect, CalculateSourceConnectorsToConnectRequest, CalculateStraightLineData, CalculateTargetConnectorsToConnect, CalculateTargetConnectorsToConnectRequest, CenterBasedDeltaCalculator, CenterGroupOrNode, CenterGroupOrNodeRequest, CenterOfMassSelectionStrategy, ChainPushCollisionResolver, ClearSelection, ClearSelectionRequest, CompleteConnectionRedraw, CompleteConnectionRedrawRequest, ConnectableSidesScheduler, ConnectedSubgraphScopeFilter, ConnectionBehaviourBuilder, ConnectionBehaviourBuilderRequest, ConnectionContentLayoutEngine, ConnectionLineBuilder, ConnectionLineBuilderRequest, ConnectionRedrawState, ConnectionWorkerState, CreateConnectionCreateDragHandler, CreateConnectionCreateDragHandlerRequest, CreateConnectionFinalize, CreateConnectionFinalizeRequest, CreateConnectionFromConnectorPreparation, CreateConnectionFromConnectorPreparationRequest, CreateConnectionFromOutletPreparation, CreateConnectionFromOutletPreparationRequest, CreateConnectionFromOutputPreparation, CreateConnectionFromOutputPreparationRequest, CreateConnectionHandler, CreateConnectionMarkers, CreateConnectionMarkersRequest, CreateConnectionPreparation, CreateConnectionPreparationRequest, CreateDragNodeHandler, CreateDragNodeHandlerRequest, CreateDragNodeHierarchy, CreateDragNodeHierarchyRequest, DRAG_AND_DROP_COMMON_PROVIDERS, DRAG_AUTO_PAN_PROVIDERS, DRAG_CANVAS_PROVIDERS, DRAG_CONNECTIONS_PROVIDERS, DRAG_DROP_TO_GROUP_PROVIDERS, DRAG_EXTERNAL_ITEM_HANDLER_KIND, DRAG_EXTERNAL_ITEM_HANDLER_TYPE, DRAG_EXTERNAL_ITEM_PROVIDERS, DRAG_MINIMAP_HANDLER_KIND, DRAG_MINIMAP_HANDLER_TYPE, DRAG_MINIMAP_PROVIDERS, DRAG_NODE_HANDLER_KIND, DRAG_NODE_HANDLER_TYPE, DRAG_SELECTION_AREA_PROVIDERS, DRAG_SELECT_BY_POINTER_PROVIDERS, DeltaClamp, Deprecated, DetectConnectionsUnderDragNode, DetectConnectionsUnderDragNodeRequest, DisableConnectionWorker, DisableConnectionWorkerRequest, DownstreamConnectionsSelectionStrategy, DragAndDropBase, DragCanvasFinalize, DragCanvasFinalizeRequest, DragCanvasHandler, DragCanvasPreparation, DragCanvasPreparationRequest, DragConnectionWaypointFinalize, DragConnectionWaypointFinalizeRequest, DragConnectionWaypointHandler, DragConnectionWaypointPreparation, DragConnectionWaypointPreparationRequest, DragExternalItemCreatePlaceholder, DragExternalItemCreatePlaceholderRequest, DragExternalItemCreatePreview, DragExternalItemCreatePreviewRequest, DragExternalItemFinalize, DragExternalItemFinalizeRequest, DragExternalItemHandler, DragExternalItemPreparation, DragExternalItemPreparationRequest, DragHandlerBase, DragHandlerInjector, DragMinimapFinalize, DragMinimapFinalizeRequest, DragMinimapHandler, DragMinimapPreparation, DragMinimapPreparationRequest, DragNodeConnectionBothSidesHandler, DragNodeConnectionHandlerBase, DragNodeConnectionSourceHandler, DragNodeConnectionTargetHandler, DragNodeDeltaConstraints, DragNodeFinalize, DragNodeFinalizeRequest, DragNodeHandler, DragNodeHierarchy, DragNodeItemHandler, DragNodePreparation, DragNodePreparationRequest, DropToGroupFinalize, DropToGroupFinalizeRequest, DropToGroupHandler, DropToGroupPreparation, DropToGroupPreparationRequest, ECanvasRedrawContext, EFCanvasLayer, EFConnectableSide, EFConnectionBehavior, EFConnectionConnectableSide, EFConnectionType, EFFlowFeatureKind, EFLayoutDirection, EFLayoutMode, EFMarkerType, EFReflowAxis, EFReflowCollision, EFReflowDeltaSource, EFReflowMode, EFReflowScope, EFResizeHandleType, EFZoomDirection, EMPTY_REFLOW_PLAN, EdgeBasedDeltaCalculator, EmitConnectionsChanges, EmitConnectionsChangesRequest, EmitEndDragSequenceEvent, EmitEndDragSequenceEventRequest, EmitSelectionChangeEvent, EmitSelectionChangeEventRequest, EmitStartDragSequenceEvent, EmitStartDragSequenceEventRequest, EnsureConnectionWorker, EnsureConnectionWorkerRequest, EventExtensions, ExternalRectConstraint, FA11yAnnouncer, FA11yController, FAutoPan, FAutoPanBase, FBackgroundBase, FBackgroundComponent, FCache, FCacheConnector, FCacheConnectorKeyFactory, FCacheNode, FCanvasBase, FCanvasChangeEvent, FCanvasComponent, FChannel, FChannelHub, FCirclePatternComponent, FClickConnectFlow, FComponentsStore, FConnectionBase, FConnectionComponent, FConnectionComponentsParent, FConnectionContent, FConnectionContentBase, FConnectionDragHandleBase, FConnectionDragHandleEnd, FConnectionDragHandleStart, FConnectionForCreateComponent, FConnectionGradient, FConnectionGradientBase, FConnectionGradientRenderer, FConnectionGradientRendererBase, FConnectionMarker, FConnectionMarkerArrow, FConnectionMarkerBase, FConnectionMarkerCircle, FConnectionMarkerRegistry, FConnectionPath, FConnectionPathBase, FConnectionRegistry, FConnectionSelection, FConnectionSelectionBase, FConnectionWaypoints, FConnectionWaypointsBase, FConnectionWaypointsChangedEvent, FConnectorBase, FConnectorDirective, FConnectorRegistry, FControlSchemeController, FCreateConnectionEvent, FCreateConnectionSession, FCreateNodeEvent, FDeleteSelectedEvent, FDragBlockerDirective, FDragExternalItemStartEventData, FDragHandleDirective, FDragHandlerResult, FDragNodeStartEventData, FDragStartedEvent, FDraggableBase, FDraggableDataContext, FDraggableDirective, FDropToGroupEvent, FExternalItem, FExternalItemBase, FExternalItemPlaceholder, FExternalItemPreview, FExternalItemService, FFlowBase, FFlowComponent, FFlowModule, FFlowState, FFlowStateController, FGroupDirective, FIdRegistryBase, FLayoutController, FLayoutEngine, FLineAlignmentComponent, FMagneticLines, FMagneticLinesBase, FMagneticRects, FMagneticRectsBase, FMinimapBase, FMinimapCanvasDirective, FMinimapComponent, FMinimapFlowDirective, FMinimapState, FMinimapViewDirective, FMoveNodesEvent, FNodeBase, FNodeConnectionsIntersectionEvent, FNodeDirective, FNodeInputBase, FNodeInputDirective, FNodeIntersectedWithConnections, FNodeOutletBase, FNodeOutletDirective, FNodeOutputBase, FNodeOutputDirective, FNodeRegistry, FReassignConnectionEvent, FRectPatternComponent, FReflowBaselineTracker, FReflowController, FReflowCycleGuard, FReflowIgnore, FReflowIgnoreRegistry, FReflowOrchestrator, FReflowPlanner, FResizeChannel, FResizeHandleDirective, FResizeNodeStartEventData, FRotateHandleDirective, FRotateNodeStartEventData, FSelectionArea, FSelectionAreaBase, FSelectionChangeEvent, FSingleRegistryBase, FSnapConnectionComponent, FSourceConnectorBase, FVirtualFor, FZoomBase, FZoomDirective, F_A11Y_CONFIG, F_AUTO_PAN_PROVIDERS, F_BACKGROUND, F_BACKGROUND_FEATURES, F_BACKGROUND_PATTERN, F_BACKGROUND_PROVIDERS, F_CACHE_FEATURES, F_CACHE_OPTIONS, F_CANVAS, F_CANVAS_CONFIG, F_CANVAS_FEATURES, F_CANVAS_PROVIDERS, F_CONNECTION_BUILDERS, F_CONNECTION_COMPONENTS_PARENT, F_CONNECTION_CONTENT, F_CONNECTION_DRAG_HANDLE_END, F_CONNECTION_DRAG_HANDLE_START, F_CONNECTION_FEATURES, F_CONNECTION_FLOW, F_CONNECTION_GRADIENT, F_CONNECTION_IMPORTS_EXPORTS, F_CONNECTION_MARKER, F_CONNECTION_PATH, F_CONNECTION_PROVIDERS, F_CONNECTION_SELECTION, F_CONNECTION_WAYPOINTS, F_CONNECTOR, F_CONNECTORS_FEATURES, F_CONNECTORS_PROVIDERS, F_CONTROL_SCHEME_CONFIG, F_CSS_CLASS, F_DEFAULT_A11Y_CONFIG, F_DEFAULT_A11Y_KEYS, F_DEFAULT_A11Y_MESSAGES, F_DEFAULT_CONTROL_SCHEME, F_DEFAULT_LAYER_ORDER, F_DRAGGABLE_FEATURES, F_DRAGGABLE_PROVIDERS, F_DRAG_SELECT_CONTROL_SCHEME, F_EXTERNAL_ITEM, F_EXTERNAL_ITEM_PROVIDERS, F_FLOW, F_FLOW_CONFIG, F_FLOW_FEATURES, F_FLOW_PROVIDERS, F_FLOW_STATE_CONFIG, F_LAYOUT, F_LAYOUT_OPTIONS, F_LINE_ALIGNMENT_PROVIDERS, F_MAGNETIC_LINES, F_MAGNETIC_LINES_PROVIDERS, F_MAGNETIC_RECTS, F_MAGNETIC_RECTS_PROVIDERS, F_MINIMAP_BASE, F_MINIMAP_FEATURES, F_MINIMAP_PROVIDERS, F_NODE, F_NODE_FEATURES, F_NODE_INPUT, F_NODE_OUTLET, F_NODE_OUTPUT, F_NODE_PROVIDERS, F_REFLOW_CONFIG, F_REFLOW_PROVIDERS, F_SCROLL_PAN_CONTROL_SCHEME, F_SELECTED_CLASS, F_SELECTION_AREA_PROVIDERS, F_SELECTION_FEATURES, F_STORAGE_PROVIDERS, F_VIRTUAL_FOR_PROVIDERS, F_ZOOM, F_ZOOM_FEATURES, F_ZOOM_PROVIDERS, FindConnectableConnectorUsingPriorityAndPosition, FindConnectableConnectorUsingPriorityAndPositionRequest, FitToChildNodesAndGroups, FitToChildNodesAndGroupsRequest, FitToFlow, FitToFlowRequest, GET_FLOW_STATE_PROVIDERS, GetCachedFCacheRect, GetCachedFCacheRectRequest, GetChildNodeIds, GetChildNodeIdsRequest, GetConnectorRectReference, GetConnectorRectReferenceRequest, GetCurrentSelection, GetCurrentSelectionRequest, GetDeepChildrenNodesAndGroups, GetDeepChildrenNodesAndGroupsRequest, GetFlow, GetFlowRequest, GetNodePadding, GetNodePaddingRequest, GetNormalizedConnectorRect, GetNormalizedConnectorRectRequest, GetNormalizedElementRect, GetNormalizedElementRectRequest, GetNormalizedParentNodeRect, GetNormalizedParentNodeRectRequest, GetNormalizedPoint, GetNormalizedPointRequest, GetParentNodes, GetParentNodesRequest, GlobalScopeFilter, GridSnapper, GroupScopeFilter, HandleConnectionWorkerMessage, HandleConnectionWorkerMessageRequest, IMouseEvent, INSTANCES, IPointerEvent, IPointerUpEvent, ITouchDownEvent, ITouchMoveEvent, InitializeDragSequence, InitializeDragSequenceRequest, InputCanvasPosition, InputCanvasPositionRequest, InputCanvasScale, InputCanvasScaleRequest, InvalidateFCacheNode, InvalidateFCacheNodeRequest, IsArrayHasParentNode, IsArrayHasParentNodeRequest, IsConnectionRedrawCurrent, IsConnectionRedrawCurrentRequest, IsConnectionWorkerEnabled, IsConnectionWorkerEnabledRequest, IsDragStarted, IsDragStartedRequest, ListenConnectionsChanges, ListenConnectionsChangesRequest, ListenNodesChanges, ListenNodesChangesRequest, ListenTransformChanges, ListenTransformChangesRequest, LogExecutionTime, MOUSE_EVENT_IGNORE_TIME, MagneticLineElement, MagneticLineRenderer, MagneticLinesHandler, MagneticLinesPreparation, MagneticLinesPreparationRequest, MagneticRectElement, MagneticRectsHandler, MagneticRectsPreparation, MagneticRectsPreparationRequest, MagneticRectsRenderer, MarkConnectableConnectors, MarkConnectableConnectorsRequest, MarkConnectionConnectorsAsConnected, MarkConnectionConnectorsAsConnectedRequest, MinimapCalculateViewRect, MinimapCalculateViewRectRequest, MinimapCalculateViewport, MinimapCalculateViewportRequest, MinimapDrawNodes, MinimapDrawNodesRequest, MinimapNodeRects, MoveFrontElementsBeforeTargetElement, MoveFrontElementsBeforeTargetElementRequest, NODE_PROVIDERS, NODE_RESIZE_PROVIDERS, NODE_ROTATE_PROVIDERS, NotifyFullRendered, NotifyFullRenderedRequest, NotifyNodesRendered, NotifyNodesRenderedRequest, NotifyTransformChanged, NotifyTransformChangedRequest, OnPointerMove, OnPointerMoveRequest, PINCH_TO_ZOOM_PROVIDERS, PinchToZoomFinalize, PinchToZoomFinalizeRequest, PinchToZoomHandler, PinchToZoomPreparation, PinchToZoomPreparationRequest, Polyline, PolylineContentAlign, PolylineContentPlace, PolylineSampler, PrepareDragSequence, PrepareDragSequenceRequest, PreventDefaultIsExternalItem, PreventDefaultIsExternalItemRequest, QueueConnectionRedraw, QueueConnectionRedrawRequest, QueueConnectionRedrawState, RESIZE_DIRECTIONS, RESIZE_NODE_HANDLER_KIND, RESIZE_NODE_HANDLER_TYPE, ROTATE_NODE_HANDLER_KIND, ROTATE_NODE_HANDLER_TYPE, ReadNodeBoundsWithPaddings, ReadNodeBoundsWithPaddingsRequest, ReadNodeBoundsWithPaddingsResponse, ReassignConnectionFinalize, ReassignConnectionFinalizeRequest, ReassignConnectionHandler, ReassignConnectionPreparation, ReassignConnectionPreparationRequest, ReassignConnectionSourceHandler, ReassignConnectionTargetHandler, RedrawCanvasWithAnimation, RedrawCanvasWithAnimationRequest, RedrawConnections, RedrawConnectionsRequest, RegisterFCacheConnector, RegisterFCacheConnectorRequest, RegisterFCacheNode, RegisterFCacheNodeRequest, RegisterPluginInstance, RegisterPluginInstanceRequest, RemoveCanvasFromStore, RemoveCanvasFromStoreRequest, RemoveConnectionForCreateFromStore, RemoveConnectionForCreateFromStoreRequest, RemoveConnectionFromStore, RemoveConnectionFromStoreRequest, RemoveConnectionMarkerFromStore, RemoveConnectionMarkerFromStoreRequest, RemoveConnectionWaypoint, RemoveConnectionWaypointRequest, RemoveConnectorFromStore, RemoveConnectorFromStoreRequest, RemoveDndFromStore, RemoveDndFromStoreRequest, RemoveFlowFromStore, RemoveFlowFromStoreRequest, RemoveNodeFromStore, RemoveNodeFromStoreRequest, RemovePluginInstance, RemovePluginInstanceRequest, RemoveSnapConnectionFromStore, RemoveSnapConnectionFromStoreRequest, RenderConnection, RenderConnectionFromGeometry, RenderConnectionFromGeometryRequest, RenderConnectionRequest, RenderConnectionWithLine, RenderConnectionWithLineRequest, RenderLifecycleState, ResetConnectionWorkerRuntime, ResetConnectionWorkerRuntimeRequest, ResetRenderLifecycle, ResetRenderLifecycleRequest, ResetScale, ResetScaleAndCenter, ResetScaleAndCenterRequest, ResetScaleRequest, ResetZoom, ResetZoomRequest, ResizeNodeConnectionBothSidesHandler, ResizeNodeConnectionHandlerBase, ResizeNodeConnectionSourceHandler, ResizeNodeConnectionTargetHandler, ResizeNodeFinalize, ResizeNodeFinalizeRequest, ResizeNodeHandler, ResizeNodePreparation, ResizeNodePreparationRequest, ResolveConnectableOutputForOutlet, ResolveConnectableOutputForOutletRequest, ResolveConnectionEndpointRect, ResolveConnectionEndpointRectRequest, ResolveConnectionEndpointRotationContext, ResolveConnectionEndpointRotationContextRequest, ResolveConnectionEndpoints, ResolveConnectionEndpointsRequest, ResolveConnectionGeometry, ResolveConnectionGeometryRequest, RotateNodeFinalize, RotateNodeFinalizeRequest, RotateNodeHandler, RotateNodePreparation, RotateNodePreparationRequest, RunAutoPanFrame, RunAutoPanFrameRequest, RunConnectionRedrawSlice, RunConnectionRedrawSliceRequest, RunConnectionWorker, RunConnectionWorkerBatch, RunConnectionWorkerBatchRequest, RunConnectionWorkerRequest, RunDevDiagnostics, RunDevDiagnosticsRequest, ScheduleAutoPanFrame, ScheduleAutoPanFrameRequest, ScrollCanvas, ScrollCanvasRequest, Select, SelectAll, SelectAllRequest, SelectAndUpdateNodeLayer, SelectAndUpdateNodeLayerRequest, SelectByPointer, SelectByPointerRequest, SelectRequest, SelectionAreaFinalize, SelectionAreaFinalizeRequest, SelectionAreaHandler, SelectionAreaPreparation, SelectionAreaPreparationRequest, SetBackgroundTransform, SetBackgroundTransformRequest, SetFCacheConnectorRect, SetFCacheConnectorRectRequest, SetFCacheNodeRect, SetFCacheNodeRectRequest, SetZoom, SetZoomRequest, ShouldUseConnectionWorker, ShouldUseConnectionWorkerRequest, SortDropCandidatesByLayer, SortDropCandidatesByLayerRequest, SortItemLayers, SortItemLayersRequest, SortItemsByParent, SortItemsByParentRequest, SortNodeLayers, SortNodeLayersRequest, StartConnectionRedraw, StartConnectionRedrawRequest, StartConnectionWorkerRedraw, StartConnectionWorkerRedrawRequest, StopAutoPan, StopAutoPanRequest, StopCollisionResolver, UnmarkConnectableConnectors, UnmarkConnectableConnectorsRequest, UnregisterFCacheConnector, UnregisterFCacheConnectorRequest, UnregisterFCacheNode, UnregisterFCacheNodeRequest, UpdateFCacheRectByElement, UpdateFCacheRectByElementRequest, UpdateItemAndChildrenLayers, UpdateItemAndChildrenLayersRequest, UpdateNodeWhenStateOrSizeChanged, UpdateNodeWhenStateOrSizeChangedRequest, UpdateScale, UpdateScaleRequest, WaitForConnectionsRendered, WaitForConnectionsRenderedRequest, XRangeSelectionStrategy, afterNextPaint, buildConnectionAnchors, buildCornerMidPointsAndApplyOffsets, calculateAutoPanAxisDelta, calculateAutoPanDelta, calculateCenterBetweenPoints, calculateCurveCandidates, calculateDifferenceAfterRotation, calculateMagneticGuides, calculateMagneticRects, calculatePointerInFlow, calculatePolylineCandidates, calculatePositionAfterRotation, castToConnectorType, coerceMarkerType, computeEdgeDeltas, createConnectionDomIdentifier, createConnectionSelectionDomIdentifier, createConnectionWorkerUrl, createGradientDomIdentifier, createGradientDomUrl, createMultiCubicPath, createSVGElement, createSegmentLinePath, cubicBezierAtT, debounceAnimationFrame, debounceMicrotask, debounceTime, defaultEventTrigger, determineSide, expandRectByOverflow, fDiagnosticMessage, fInstanceKey, fProvideCache, fSuppressDevWarnings, fWarnOnce, filterConnectableTargets, findExistingWaypoint, findNodeOrGroupContaining, findSourceConnector, findSpatialNeighbor, findTargetConnector, findWaypointCandidate, fixedCenterBehavior, fixedOutboundBehavior, floatingBehavior, getAllSourceConnectors, getAllTargetConnectors, getExternalItemHost, infinityMinMax, injectFlowState, isCalculateMode, isConnectionWorkerRuntimeSupported, isConnector, isDragBlocker, isDragExternalItemHandler, isDragHandleEnd, isDragHandleStart, isDragMinimapHandler, isDragNodeHandler, isExternalItem, isFDevMode, isMobile, isNode, isNodeOutlet, isNodeOutput, isOnFlowBackground, isOutletConnector, isPointerInsidePoint, isPointerInsideStartOrEndDragHandles, isResizeNodeHandler, isRotateHandle, isRotateNodeHandler, isSourceConnector, isTargetConnector, isValidEventTrigger, mergeA11yConfig, mergeControlSchemeConfig, mergeFCanvasConfig, mergeFlowStateConfig, mergeLayoutNodes, mergePointChains, mergeReflowConfig, middleButtonEventTrigger, mixinChangeSelection, mixinChangeVisibility, normalizeFlowLayoutData, normalizePolyline, notifyOnStart, pickWaypoint, primaryButtonEventTrigger, provideFFlow, provideFLayout, rebaseAutoPanPointerDownPosition, rectFromPoint, requireSourceConnector, requireTargetConnector, resolveAutoPanMode, resolveConnectionWorkerRuntime, resolveLayerOrder, revokeConnectionWorkerUrl, sampleCubicBezierUniform, sampleMultiCubicUniform, stringAttribute, takeOne, transitionEnd, withA11y, withConnectionFlow, withControlScheme, withFCanvas, withFlowState, withReflowOnResize, withinSnapThreshold };
24853
+ export { AddCanvasToStore, AddCanvasToStoreRequest, AddConnectionForCreateToStore, AddConnectionForCreateToStoreRequest, AddConnectionMarkerToStore, AddConnectionMarkerToStoreRequest, AddConnectionToStore, AddConnectionToStoreRequest, AddConnectorToStore, AddConnectorToStoreRequest, AddDndToStore, AddDndToStoreRequest, AddFlowToStore, AddFlowToStoreRequest, AddNodeToStore, AddNodeToStoreRequest, AddPatternToBackground, AddPatternToBackgroundRequest, AddSnapConnectionToStore, AddSnapConnectionToStoreRequest, ApplyChildResizeConstraints, ApplyChildResizeConstraintsRequest, ApplyConnectionRender, ApplyConnectionRenderRequest, ApplyConnectionWorkerResult, ApplyConnectionWorkerResultRequest, ApplyParentResizeConstraints, ApplyParentResizeConstraintsRequest, AttachDragNodeHandlerFromSelection, AttachDragNodeHandlerFromSelectionRequest, AttachResizeConnectionDragHandlersToNode, AttachResizeConnectionDragHandlersToNodeRequest, AttachSoftParentConnectionDragHandlersToNode, AttachSoftParentConnectionDragHandlersToNodeRequest, AttachSourceConnectionDragHandlersToNode, AttachSourceConnectionDragHandlersToNodeRequest, AttachTargetConnectionDragHandlersToNode, AttachTargetConnectionDragHandlersToNodeRequest, BuildConnectionLine, BuildConnectionLineRequest, BuildConnectionWorkerBatch, BuildConnectionWorkerBatchRequest, BuildConnectionWorkerPayloadItem, BuildConnectionWorkerPayloadItemRequest, BuildDragNodeConstraints, BuildDragNodeConstraintsRequest, CALCULATABLE_SIDES, COMMON_PROVIDERS, CONNECTABLE_SIDE_EPSILON, CREATE_MOVE_NODE_DRAG_MODEL_FROM_SELECTION_PROVIDERS, CalculateAdaptiveCurveData, CalculateBezierCurveData, CalculateChangedRectFromDifference, CalculateChangedRectFromDifferenceRequest, CalculateClosestConnector, CalculateClosestConnectorRequest, CalculateConnectableSideByConnectedPositions, CalculateConnectableSideByConnectedPositionsRequest, CalculateConnectableSideByInternalPosition, CalculateConnectableSideByInternalPositionRequest, CalculateConnectionsState, CalculateConnectionsStateRequest, CalculateConnectorsConnectableSides, CalculateConnectorsConnectableSidesRequest, CalculateDirectChildrenUnionRect, CalculateDirectChildrenUnionRectRequest, CalculateFlowPointFromMinimapPoint, CalculateFlowPointFromMinimapPointRequest, CalculateFlowState, CalculateFlowStateRequest, CalculateInputConnections, CalculateInputConnectionsRequest, CalculateNodesBoundingBox, CalculateNodesBoundingBoxNormalizedPosition, CalculateNodesBoundingBoxNormalizedPositionRequest, CalculateNodesBoundingBoxRequest, CalculateNodesState, CalculateNodesStateRequest, CalculateOutputConnections, CalculateOutputConnectionsRequest, CalculateResizeLimits, CalculateResizeLimitsRequest, CalculateSegmentLineData, CalculateSelectableItems, CalculateSelectableItemsRequest, CalculateSourceConnectorsToConnect, CalculateSourceConnectorsToConnectRequest, CalculateStraightLineData, CalculateTargetConnectorsToConnect, CalculateTargetConnectorsToConnectRequest, CenterBasedDeltaCalculator, CenterGroupOrNode, CenterGroupOrNodeRequest, CenterOfMassSelectionStrategy, ChainPushCollisionResolver, ClearSelection, ClearSelectionRequest, CompleteConnectionRedraw, CompleteConnectionRedrawRequest, ConnectableSidesScheduler, ConnectedSubgraphScopeFilter, ConnectionBehaviourBuilder, ConnectionBehaviourBuilderRequest, ConnectionContentLayoutEngine, ConnectionLineBuilder, ConnectionLineBuilderRequest, ConnectionRedrawState, ConnectionWorkerState, CreateConnectionCreateDragHandler, CreateConnectionCreateDragHandlerRequest, CreateConnectionFinalize, CreateConnectionFinalizeRequest, CreateConnectionFromConnectorPreparation, CreateConnectionFromConnectorPreparationRequest, CreateConnectionFromOutletPreparation, CreateConnectionFromOutletPreparationRequest, CreateConnectionFromOutputPreparation, CreateConnectionFromOutputPreparationRequest, CreateConnectionHandler, CreateConnectionMarkers, CreateConnectionMarkersRequest, CreateConnectionPreparation, CreateConnectionPreparationRequest, CreateDragNodeHandler, CreateDragNodeHandlerRequest, CreateDragNodeHierarchy, CreateDragNodeHierarchyRequest, DRAG_AND_DROP_COMMON_PROVIDERS, DRAG_AUTO_PAN_PROVIDERS, DRAG_CANVAS_PROVIDERS, DRAG_CONNECTIONS_PROVIDERS, DRAG_DROP_TO_GROUP_PROVIDERS, DRAG_EXTERNAL_ITEM_HANDLER_KIND, DRAG_EXTERNAL_ITEM_HANDLER_TYPE, DRAG_EXTERNAL_ITEM_PROVIDERS, DRAG_MINIMAP_HANDLER_KIND, DRAG_MINIMAP_HANDLER_TYPE, DRAG_MINIMAP_PROVIDERS, DRAG_NODE_HANDLER_KIND, DRAG_NODE_HANDLER_TYPE, DRAG_SELECTION_AREA_PROVIDERS, DRAG_SELECT_BY_POINTER_PROVIDERS, DeltaClamp, Deprecated, DetectConnectionsUnderDragNode, DetectConnectionsUnderDragNodeRequest, DisableConnectionWorker, DisableConnectionWorkerRequest, DownstreamConnectionsSelectionStrategy, DragAndDropBase, DragCanvasFinalize, DragCanvasFinalizeRequest, DragCanvasHandler, DragCanvasPreparation, DragCanvasPreparationRequest, DragConnectionWaypointFinalize, DragConnectionWaypointFinalizeRequest, DragConnectionWaypointHandler, DragConnectionWaypointPreparation, DragConnectionWaypointPreparationRequest, DragExternalItemCreatePlaceholder, DragExternalItemCreatePlaceholderRequest, DragExternalItemCreatePreview, DragExternalItemCreatePreviewRequest, DragExternalItemFinalize, DragExternalItemFinalizeRequest, DragExternalItemHandler, DragExternalItemPreparation, DragExternalItemPreparationRequest, DragHandlerBase, DragHandlerInjector, DragMinimapFinalize, DragMinimapFinalizeRequest, DragMinimapHandler, DragMinimapPreparation, DragMinimapPreparationRequest, DragNodeConnectionBothSidesHandler, DragNodeConnectionHandlerBase, DragNodeConnectionSourceHandler, DragNodeConnectionTargetHandler, DragNodeDeltaConstraints, DragNodeFinalize, DragNodeFinalizeRequest, DragNodeHandler, DragNodeHierarchy, DragNodeItemHandler, DragNodePreparation, DragNodePreparationRequest, DropToGroupFinalize, DropToGroupFinalizeRequest, DropToGroupHandler, DropToGroupPreparation, DropToGroupPreparationRequest, ECanvasRedrawContext, EFCanvasLayer, EFConnectableSide, EFConnectionBehavior, EFConnectionConnectableSide, EFConnectionType, EFFlowFeatureKind, EFLayoutDirection, EFLayoutMode, EFMarkerType, EFReflowAxis, EFReflowCollision, EFReflowDeltaSource, EFReflowMode, EFReflowScope, EFResizeHandleType, EFZoomDirection, EMPTY_REFLOW_PLAN, EdgeBasedDeltaCalculator, EmitConnectionsChanges, EmitConnectionsChangesRequest, EmitEndDragSequenceEvent, EmitEndDragSequenceEventRequest, EmitSelectionChangeEvent, EmitSelectionChangeEventRequest, EmitStartDragSequenceEvent, EmitStartDragSequenceEventRequest, EnsureConnectionWorker, EnsureConnectionWorkerRequest, EventExtensions, ExternalRectConstraint, FA11yAnnouncer, FA11yController, FAutoPan, FAutoPanBase, FBackgroundBase, FBackgroundComponent, FCache, FCacheConnector, FCacheConnectorKeyFactory, FCacheNode, FCanvasBase, FCanvasChangeEvent, FCanvasComponent, FChannel, FChannelHub, FCirclePatternComponent, FClickConnectFlow, FComponentsStore, FConnectionBase, FConnectionComponent, FConnectionComponentsParent, FConnectionContent, FConnectionContentBase, FConnectionDragHandleBase, FConnectionDragHandleEnd, FConnectionDragHandleStart, FConnectionForCreateComponent, FConnectionGradient, FConnectionGradientBase, FConnectionGradientRenderer, FConnectionGradientRendererBase, FConnectionMarker, FConnectionMarkerArrow, FConnectionMarkerBase, FConnectionMarkerCircle, FConnectionMarkerRegistry, FConnectionPath, FConnectionPathBase, FConnectionRegistry, FConnectionSelection, FConnectionSelectionBase, FConnectionWaypoints, FConnectionWaypointsBase, FConnectionWaypointsChangedEvent, FConnectorBase, FConnectorDirective, FConnectorRegistry, FControlSchemeController, FCreateConnectionEvent, FCreateConnectionSession, FCreateNodeEvent, FDeleteSelectedEvent, FDragBlockerDirective, FDragExternalItemStartEventData, FDragHandleDirective, FDragHandlerResult, FDragNodeStartEventData, FDragStartedEvent, FDraggableBase, FDraggableDataContext, FDraggableDirective, FDropToGroupEvent, FExternalItem, FExternalItemBase, FExternalItemPlaceholder, FExternalItemPreview, FExternalItemService, FFlowBase, FFlowComponent, FFlowModule, FFlowState, FFlowStateController, FGroupDirective, FIdRegistryBase, FLayoutController, FLayoutEngine, FLineAlignmentComponent, FMagneticLines, FMagneticLinesBase, FMagneticRects, FMagneticRectsBase, FMinimapBase, FMinimapCanvasDirective, FMinimapComponent, FMinimapFlowDirective, FMinimapState, FMinimapViewDirective, FMoveNodesEvent, FNodeBase, FNodeConnectionsIntersectionEvent, FNodeDirective, FNodeInputBase, FNodeInputDirective, FNodeIntersectedWithConnections, FNodeOutletBase, FNodeOutletDirective, FNodeOutputBase, FNodeOutputDirective, FNodeRegistry, FReassignConnectionEvent, FRectPatternComponent, FReflowBaselineTracker, FReflowController, FReflowCycleGuard, FReflowIgnore, FReflowIgnoreRegistry, FReflowOrchestrator, FReflowPlanner, FResizeChannel, FResizeHandleDirective, FResizeNodeStartEventData, FRotateHandleDirective, FRotateNodeStartEventData, FSelectionArea, FSelectionAreaBase, FSelectionChangeEvent, FSingleRegistryBase, FSnapConnectionComponent, FSnapTargetChangeEvent, FSourceConnectorBase, FVirtualFor, FZoomBase, FZoomDirective, F_A11Y_CONFIG, F_AUTO_PAN_PROVIDERS, F_BACKGROUND, F_BACKGROUND_FEATURES, F_BACKGROUND_PATTERN, F_BACKGROUND_PROVIDERS, F_CACHE_FEATURES, F_CACHE_OPTIONS, F_CANVAS, F_CANVAS_CONFIG, F_CANVAS_FEATURES, F_CANVAS_PROVIDERS, F_CONNECTION_BUILDERS, F_CONNECTION_COMPONENTS_PARENT, F_CONNECTION_CONTENT, F_CONNECTION_DRAG_HANDLE_END, F_CONNECTION_DRAG_HANDLE_START, F_CONNECTION_FEATURES, F_CONNECTION_FLOW, F_CONNECTION_GRADIENT, F_CONNECTION_IMPORTS_EXPORTS, F_CONNECTION_MARKER, F_CONNECTION_PATH, F_CONNECTION_PROVIDERS, F_CONNECTION_SELECTION, F_CONNECTION_WAYPOINTS, F_CONNECTOR, F_CONNECTORS_FEATURES, F_CONNECTORS_PROVIDERS, F_CONTROL_SCHEME_CONFIG, F_CSS_CLASS, F_DEFAULT_A11Y_CONFIG, F_DEFAULT_A11Y_KEYS, F_DEFAULT_A11Y_MESSAGES, F_DEFAULT_CONTROL_SCHEME, F_DEFAULT_LAYER_ORDER, F_DRAGGABLE_FEATURES, F_DRAGGABLE_PROVIDERS, F_DRAG_SELECT_CONTROL_SCHEME, F_EXTERNAL_ITEM, F_EXTERNAL_ITEM_PROVIDERS, F_FLOW, F_FLOW_CONFIG, F_FLOW_FEATURES, F_FLOW_PROVIDERS, F_FLOW_STATE_CONFIG, F_LAYOUT, F_LAYOUT_OPTIONS, F_LINE_ALIGNMENT_PROVIDERS, F_MAGNETIC_LINES, F_MAGNETIC_LINES_PROVIDERS, F_MAGNETIC_RECTS, F_MAGNETIC_RECTS_PROVIDERS, F_MINIMAP_BASE, F_MINIMAP_FEATURES, F_MINIMAP_PROVIDERS, F_NODE, F_NODE_FEATURES, F_NODE_INPUT, F_NODE_OUTLET, F_NODE_OUTPUT, F_NODE_PROVIDERS, F_REFLOW_CONFIG, F_REFLOW_PROVIDERS, F_SCROLL_PAN_CONTROL_SCHEME, F_SELECTED_CLASS, F_SELECTION_AREA_PROVIDERS, F_SELECTION_FEATURES, F_STORAGE_PROVIDERS, F_VIRTUAL_FOR_PROVIDERS, F_ZOOM, F_ZOOM_FEATURES, F_ZOOM_PROVIDERS, FindConnectableConnectorUsingPriorityAndPosition, FindConnectableConnectorUsingPriorityAndPositionRequest, FitToChildNodesAndGroups, FitToChildNodesAndGroupsRequest, FitToFlow, FitToFlowRequest, GET_FLOW_STATE_PROVIDERS, GetCachedFCacheRect, GetCachedFCacheRectRequest, GetChildNodeIds, GetChildNodeIdsRequest, GetConnectorRectReference, GetConnectorRectReferenceRequest, GetCurrentSelection, GetCurrentSelectionRequest, GetDeepChildrenNodesAndGroups, GetDeepChildrenNodesAndGroupsRequest, GetFlow, GetFlowRequest, GetNodePadding, GetNodePaddingRequest, GetNormalizedConnectorRect, GetNormalizedConnectorRectRequest, GetNormalizedElementRect, GetNormalizedElementRectRequest, GetNormalizedParentNodeRect, GetNormalizedParentNodeRectRequest, GetNormalizedPoint, GetNormalizedPointRequest, GetParentNodes, GetParentNodesRequest, GlobalScopeFilter, GridSnapper, GroupScopeFilter, HandleConnectionWorkerMessage, HandleConnectionWorkerMessageRequest, IMouseEvent, INSTANCES, IPointerEvent, IPointerUpEvent, ITouchDownEvent, ITouchMoveEvent, InitializeDragSequence, InitializeDragSequenceRequest, InputCanvasPosition, InputCanvasPositionRequest, InputCanvasScale, InputCanvasScaleRequest, InvalidateFCacheNode, InvalidateFCacheNodeRequest, IsArrayHasParentNode, IsArrayHasParentNodeRequest, IsConnectionRedrawCurrent, IsConnectionRedrawCurrentRequest, IsConnectionWorkerEnabled, IsConnectionWorkerEnabledRequest, IsDragStarted, IsDragStartedRequest, ListenConnectionsChanges, ListenConnectionsChangesRequest, ListenNodesChanges, ListenNodesChangesRequest, ListenTransformChanges, ListenTransformChangesRequest, LogExecutionTime, MOUSE_EVENT_IGNORE_TIME, MagneticLineElement, MagneticLineRenderer, MagneticLinesHandler, MagneticLinesPreparation, MagneticLinesPreparationRequest, MagneticRectElement, MagneticRectsHandler, MagneticRectsPreparation, MagneticRectsPreparationRequest, MagneticRectsRenderer, MarkConnectableConnectors, MarkConnectableConnectorsRequest, MarkConnectionConnectorsAsConnected, MarkConnectionConnectorsAsConnectedRequest, MinimapCalculateViewRect, MinimapCalculateViewRectRequest, MinimapCalculateViewport, MinimapCalculateViewportRequest, MinimapDrawNodes, MinimapDrawNodesRequest, MinimapNodeRects, MoveFrontElementsBeforeTargetElement, MoveFrontElementsBeforeTargetElementRequest, NODE_PROVIDERS, NODE_RESIZE_PROVIDERS, NODE_ROTATE_PROVIDERS, NotifyFullRendered, NotifyFullRenderedRequest, NotifyNodesRendered, NotifyNodesRenderedRequest, NotifyTransformChanged, NotifyTransformChangedRequest, OnPointerMove, OnPointerMoveRequest, PINCH_TO_ZOOM_PROVIDERS, PinchToZoomFinalize, PinchToZoomFinalizeRequest, PinchToZoomHandler, PinchToZoomPreparation, PinchToZoomPreparationRequest, Polyline, PolylineContentAlign, PolylineContentPlace, PolylineSampler, PrepareDragSequence, PrepareDragSequenceRequest, PreventDefaultIsExternalItem, PreventDefaultIsExternalItemRequest, QueueConnectionRedraw, QueueConnectionRedrawRequest, QueueConnectionRedrawState, RESIZE_DIRECTIONS, RESIZE_NODE_HANDLER_KIND, RESIZE_NODE_HANDLER_TYPE, ROTATE_NODE_HANDLER_KIND, ROTATE_NODE_HANDLER_TYPE, ReadNodeBoundsWithPaddings, ReadNodeBoundsWithPaddingsRequest, ReadNodeBoundsWithPaddingsResponse, ReassignConnectionFinalize, ReassignConnectionFinalizeRequest, ReassignConnectionHandler, ReassignConnectionPreparation, ReassignConnectionPreparationRequest, ReassignConnectionSourceHandler, ReassignConnectionTargetHandler, RedrawCanvasWithAnimation, RedrawCanvasWithAnimationRequest, RedrawConnections, RedrawConnectionsRequest, RegisterFCacheConnector, RegisterFCacheConnectorRequest, RegisterFCacheNode, RegisterFCacheNodeRequest, RegisterPluginInstance, RegisterPluginInstanceRequest, RemoveCanvasFromStore, RemoveCanvasFromStoreRequest, RemoveConnectionForCreateFromStore, RemoveConnectionForCreateFromStoreRequest, RemoveConnectionFromStore, RemoveConnectionFromStoreRequest, RemoveConnectionMarkerFromStore, RemoveConnectionMarkerFromStoreRequest, RemoveConnectionWaypoint, RemoveConnectionWaypointRequest, RemoveConnectorFromStore, RemoveConnectorFromStoreRequest, RemoveDndFromStore, RemoveDndFromStoreRequest, RemoveFlowFromStore, RemoveFlowFromStoreRequest, RemoveNodeFromStore, RemoveNodeFromStoreRequest, RemovePluginInstance, RemovePluginInstanceRequest, RemoveSnapConnectionFromStore, RemoveSnapConnectionFromStoreRequest, RenderConnection, RenderConnectionFromGeometry, RenderConnectionFromGeometryRequest, RenderConnectionRequest, RenderConnectionWithLine, RenderConnectionWithLineRequest, RenderLifecycleState, ResetConnectionWorkerRuntime, ResetConnectionWorkerRuntimeRequest, ResetRenderLifecycle, ResetRenderLifecycleRequest, ResetScale, ResetScaleAndCenter, ResetScaleAndCenterRequest, ResetScaleRequest, ResetZoom, ResetZoomRequest, ResizeNodeConnectionBothSidesHandler, ResizeNodeConnectionHandlerBase, ResizeNodeConnectionSourceHandler, ResizeNodeConnectionTargetHandler, ResizeNodeFinalize, ResizeNodeFinalizeRequest, ResizeNodeHandler, ResizeNodePreparation, ResizeNodePreparationRequest, ResolveConnectableOutputForOutlet, ResolveConnectableOutputForOutletRequest, ResolveConnectionEndpointRect, ResolveConnectionEndpointRectRequest, ResolveConnectionEndpointRotationContext, ResolveConnectionEndpointRotationContextRequest, ResolveConnectionEndpoints, ResolveConnectionEndpointsRequest, ResolveConnectionGeometry, ResolveConnectionGeometryRequest, RotateNodeFinalize, RotateNodeFinalizeRequest, RotateNodeHandler, RotateNodePreparation, RotateNodePreparationRequest, RunAutoPanFrame, RunAutoPanFrameRequest, RunConnectionRedrawSlice, RunConnectionRedrawSliceRequest, RunConnectionWorker, RunConnectionWorkerBatch, RunConnectionWorkerBatchRequest, RunConnectionWorkerRequest, RunDevDiagnostics, RunDevDiagnosticsRequest, ScheduleAutoPanFrame, ScheduleAutoPanFrameRequest, ScrollCanvas, ScrollCanvasRequest, Select, SelectAll, SelectAllRequest, SelectAndUpdateNodeLayer, SelectAndUpdateNodeLayerRequest, SelectByPointer, SelectByPointerRequest, SelectRequest, SelectionAreaFinalize, SelectionAreaFinalizeRequest, SelectionAreaHandler, SelectionAreaPreparation, SelectionAreaPreparationRequest, SetBackgroundTransform, SetBackgroundTransformRequest, SetFCacheConnectorRect, SetFCacheConnectorRectRequest, SetFCacheNodeRect, SetFCacheNodeRectRequest, SetZoom, SetZoomRequest, ShouldUseConnectionWorker, ShouldUseConnectionWorkerRequest, SortDropCandidatesByLayer, SortDropCandidatesByLayerRequest, SortItemLayers, SortItemLayersRequest, SortItemsByParent, SortItemsByParentRequest, SortNodeLayers, SortNodeLayersRequest, StartConnectionRedraw, StartConnectionRedrawRequest, StartConnectionWorkerRedraw, StartConnectionWorkerRedrawRequest, StopAutoPan, StopAutoPanRequest, StopCollisionResolver, UnmarkConnectableConnectors, UnmarkConnectableConnectorsRequest, UnregisterFCacheConnector, UnregisterFCacheConnectorRequest, UnregisterFCacheNode, UnregisterFCacheNodeRequest, UpdateFCacheRectByElement, UpdateFCacheRectByElementRequest, UpdateItemAndChildrenLayers, UpdateItemAndChildrenLayersRequest, UpdateNodeWhenStateOrSizeChanged, UpdateNodeWhenStateOrSizeChangedRequest, UpdateScale, UpdateScaleRequest, WaitForConnectionsRendered, WaitForConnectionsRenderedRequest, XRangeSelectionStrategy, afterNextPaint, buildConnectionAnchors, buildCornerMidPointsAndApplyOffsets, calculateAutoPanAxisDelta, calculateAutoPanDelta, calculateCenterBetweenPoints, calculateCornerApex, calculateCurveCandidates, calculateDifferenceAfterRotation, calculateMagneticGuides, calculateMagneticRects, calculatePointerInFlow, calculatePolylineCandidates, calculatePositionAfterRotation, calculateSmoothControlPoint, castToConnectorType, coerceMarkerType, computeEdgeDeltas, createConnectionDomIdentifier, createConnectionSelectionDomIdentifier, createConnectionWorkerUrl, createGradientDomIdentifier, createGradientDomUrl, createMultiCubicPath, createSVGElement, createSegmentLinePath, cubicBezierAtT, debounceAnimationFrame, debounceMicrotask, debounceTime, defaultEventTrigger, determineSide, expandRectByOverflow, fDiagnosticMessage, fInstanceKey, fProvideCache, fSuppressDevWarnings, fWarnOnce, filterConnectableTargets, findExistingWaypoint, findNodeOrGroupContaining, findSourceConnector, findSpatialNeighbor, findTargetConnector, findWaypointCandidate, fixedCenterBehavior, fixedOutboundBehavior, floatingBehavior, getAllSourceConnectors, getAllTargetConnectors, getExternalItemHost, infinityMinMax, injectFlowState, isCalculateMode, isConnectionWorkerRuntimeSupported, isConnector, isDragBlocker, isDragExternalItemHandler, isDragHandleEnd, isDragHandleStart, isDragMinimapHandler, isDragNodeHandler, isExternalItem, isFDevMode, isMobile, isNode, isNodeOutlet, isNodeOutput, isOnFlowBackground, isOutletConnector, isPointerInsidePoint, isPointerInsideStartOrEndDragHandles, isResizeNodeHandler, isRotateHandle, isRotateNodeHandler, isSourceConnector, isTargetConnector, isValidEventTrigger, mergeA11yConfig, mergeControlSchemeConfig, mergeFCanvasConfig, mergeFlowStateConfig, mergeLayoutNodes, mergePointChains, mergeReflowConfig, middleButtonEventTrigger, mixinChangeSelection, mixinChangeVisibility, normalizeFlowLayoutData, normalizePolyline, notifyOnStart, pickWaypoint, primaryButtonEventTrigger, provideFFlow, provideFLayout, rebaseAutoPanPointerDownPosition, rectFromPoint, requireSourceConnector, requireTargetConnector, resolveAutoPanMode, resolveConnectionWorkerRuntime, resolveLayerOrder, revokeConnectionWorkerUrl, sampleCubicBezierUniform, sampleMultiCubicUniform, stringAttribute, takeOne, transitionEnd, withA11y, withConnectionFlow, withControlScheme, withFCanvas, withFlowState, withReflowOnResize, withinSnapThreshold };
24427
24854
  //# sourceMappingURL=foblex-flow.mjs.map