@memberjunction/ng-flow-editor 6.1.0-edge.4 → 6.1.0-edge.6

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.
@@ -20,44 +20,44 @@ const _c1 = ["canvasArea"];
20
20
  const _c2 = (a0, a1) => ({ x: a0, y: a1 });
21
21
  const _forTrack0 = ($index, $item) => $item.ID;
22
22
  function FlowEditorComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
23
- const _r2 = i0.ɵɵgetCurrentView();
23
+ const _r1 = i0.ɵɵgetCurrentView();
24
24
  i0.ɵɵelementStart(0, "div", 3)(1, "mj-flow-toolbar", 20);
25
- i0.ɵɵlistener("ZoomInClicked", function FlowEditorComponent_Conditional_1_Template_mj_flow_toolbar_ZoomInClicked_1_listener() { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.ZoomIn()); })("ZoomOutClicked", function FlowEditorComponent_Conditional_1_Template_mj_flow_toolbar_ZoomOutClicked_1_listener() { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.ZoomOut()); })("FitToScreenClicked", function FlowEditorComponent_Conditional_1_Template_mj_flow_toolbar_FitToScreenClicked_1_listener() { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.ZoomToFit()); })("AutoLayoutClicked", function FlowEditorComponent_Conditional_1_Template_mj_flow_toolbar_AutoLayoutClicked_1_listener() { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.AutoArrange()); })("GridToggled", function FlowEditorComponent_Conditional_1_Template_mj_flow_toolbar_GridToggled_1_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onGridToggled($event)); })("MinimapToggled", function FlowEditorComponent_Conditional_1_Template_mj_flow_toolbar_MinimapToggled_1_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onMinimapToggled($event)); })("LegendToggled", function FlowEditorComponent_Conditional_1_Template_mj_flow_toolbar_LegendToggled_1_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onLegendToggled($event)); })("PanModeToggled", function FlowEditorComponent_Conditional_1_Template_mj_flow_toolbar_PanModeToggled_1_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onPanModeToggled($event)); })("MinimizeClicked", function FlowEditorComponent_Conditional_1_Template_mj_flow_toolbar_MinimizeClicked_1_listener() { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.SetToolbarVisibility("minimized")); })("HideClicked", function FlowEditorComponent_Conditional_1_Template_mj_flow_toolbar_HideClicked_1_listener() { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.SetToolbarVisibility("hidden")); });
25
+ i0.ɵɵlistener("ZoomInClicked", function FlowEditorComponent_Conditional_1_Template_mj_flow_toolbar_ZoomInClicked_1_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.ZoomIn()); })("ZoomOutClicked", function FlowEditorComponent_Conditional_1_Template_mj_flow_toolbar_ZoomOutClicked_1_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.ZoomOut()); })("FitToScreenClicked", function FlowEditorComponent_Conditional_1_Template_mj_flow_toolbar_FitToScreenClicked_1_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.ZoomToFit()); })("AutoLayoutClicked", function FlowEditorComponent_Conditional_1_Template_mj_flow_toolbar_AutoLayoutClicked_1_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.AutoArrange()); })("GridToggled", function FlowEditorComponent_Conditional_1_Template_mj_flow_toolbar_GridToggled_1_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onGridToggled($event)); })("MinimapToggled", function FlowEditorComponent_Conditional_1_Template_mj_flow_toolbar_MinimapToggled_1_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onMinimapToggled($event)); })("LegendToggled", function FlowEditorComponent_Conditional_1_Template_mj_flow_toolbar_LegendToggled_1_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onLegendToggled($event)); })("PanModeToggled", function FlowEditorComponent_Conditional_1_Template_mj_flow_toolbar_PanModeToggled_1_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onPanModeToggled($event)); })("MinimizeClicked", function FlowEditorComponent_Conditional_1_Template_mj_flow_toolbar_MinimizeClicked_1_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.SetToolbarVisibility("minimized")); })("HideClicked", function FlowEditorComponent_Conditional_1_Template_mj_flow_toolbar_HideClicked_1_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.SetToolbarVisibility("hidden")); });
26
26
  i0.ɵɵelementEnd()();
27
27
  } if (rf & 2) {
28
- const ctx_r2 = i0.ɵɵnextContext();
29
- i0.ɵɵattribute("data-align", ctx_r2.ToolbarAlign);
28
+ const ctx_r1 = i0.ɵɵnextContext();
29
+ i0.ɵɵattribute("data-align", ctx_r1.ToolbarAlign);
30
30
  i0.ɵɵadvance();
31
- i0.ɵɵproperty("ZoomLevel", ctx_r2.zoomLevel)("ShowGrid", ctx_r2.ShowGrid)("ShowMinimap", ctx_r2.ShowMinimap)("ShowLegend", ctx_r2.ShowLegend)("ReadOnly", ctx_r2.ReadOnly)("PanMode", ctx_r2.panMode);
31
+ i0.ɵɵproperty("ZoomLevel", ctx_r1.zoomLevel)("ShowGrid", ctx_r1.ShowGrid)("ShowMinimap", ctx_r1.ShowMinimap)("ShowLegend", ctx_r1.ShowLegend)("ReadOnly", ctx_r1.ReadOnly)("PanMode", ctx_r1.panMode);
32
32
  } }
33
33
  function FlowEditorComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
34
- const _r4 = i0.ɵɵgetCurrentView();
34
+ const _r3 = i0.ɵɵgetCurrentView();
35
35
  i0.ɵɵelementStart(0, "button", 21);
36
- i0.ɵɵlistener("click", function FlowEditorComponent_Conditional_2_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r4); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.SetToolbarVisibility("shown")); });
36
+ i0.ɵɵlistener("click", function FlowEditorComponent_Conditional_2_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.SetToolbarVisibility("shown")); });
37
37
  i0.ɵɵelement(1, "i", 22);
38
38
  i0.ɵɵelementEnd();
39
39
  } if (rf & 2) {
40
- const ctx_r2 = i0.ɵɵnextContext();
41
- i0.ɵɵattribute("data-align", ctx_r2.ToolbarAlign);
40
+ const ctx_r1 = i0.ɵɵnextContext();
41
+ i0.ɵɵattribute("data-align", ctx_r1.ToolbarAlign);
42
42
  } }
43
43
  function FlowEditorComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
44
- const _r5 = i0.ɵɵgetCurrentView();
44
+ const _r4 = i0.ɵɵgetCurrentView();
45
45
  i0.ɵɵelementStart(0, "button", 23);
46
- i0.ɵɵlistener("click", function FlowEditorComponent_Conditional_3_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r5); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.SetToolbarVisibility("shown")); });
46
+ i0.ɵɵlistener("click", function FlowEditorComponent_Conditional_3_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.SetToolbarVisibility("shown")); });
47
47
  i0.ɵɵelement(1, "i", 24);
48
48
  i0.ɵɵelementEnd();
49
49
  } if (rf & 2) {
50
- const ctx_r2 = i0.ɵɵnextContext();
51
- i0.ɵɵattribute("data-align", ctx_r2.ToolbarAlign);
50
+ const ctx_r1 = i0.ɵɵnextContext();
51
+ i0.ɵɵattribute("data-align", ctx_r1.ToolbarAlign);
52
52
  } }
53
53
  function FlowEditorComponent_Conditional_5_Template(rf, ctx) { if (rf & 1) {
54
- const _r6 = i0.ɵɵgetCurrentView();
54
+ const _r5 = i0.ɵɵgetCurrentView();
55
55
  i0.ɵɵelementStart(0, "mj-flow-palette", 25);
56
- i0.ɵɵlistener("NodeTypeActivated", function FlowEditorComponent_Conditional_5_Template_mj_flow_palette_NodeTypeActivated_0_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onPaletteNodeTypeActivated($event)); });
56
+ i0.ɵɵlistener("NodeTypeActivated", function FlowEditorComponent_Conditional_5_Template_mj_flow_palette_NodeTypeActivated_0_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onPaletteNodeTypeActivated($event)); });
57
57
  i0.ɵɵelementEnd();
58
58
  } if (rf & 2) {
59
- const ctx_r2 = i0.ɵɵnextContext();
60
- i0.ɵɵproperty("NodeTypes", ctx_r2.NodeTypes);
59
+ const ctx_r1 = i0.ɵɵnextContext();
60
+ i0.ɵɵproperty("NodeTypes", ctx_r1.NodeTypes);
61
61
  } }
62
62
  function FlowEditorComponent_Conditional_9_Template(rf, ctx) { if (rf & 1) {
63
63
  i0.ɵɵelementStart(0, "f-background");
@@ -86,9 +86,9 @@ function FlowEditorComponent_Conditional_13_Template(rf, ctx) { if (rf & 1) {
86
86
  function FlowEditorComponent_For_15_Conditional_3_Conditional_1_Template(rf, ctx) { if (rf & 1) {
87
87
  i0.ɵɵelement(0, "i", 34);
88
88
  } if (rf & 2) {
89
- const conn_r8 = i0.ɵɵnextContext(2).$implicit;
90
- i0.ɵɵstyleProp("color", conn_r8.LabelIconColor || "inherit");
91
- i0.ɵɵproperty("ngClass", conn_r8.LabelIcon);
89
+ const conn_r7 = i0.ɵɵnextContext(2).$implicit;
90
+ i0.ɵɵstyleProp("color", conn_r7.LabelIconColor || "inherit");
91
+ i0.ɵɵproperty("ngClass", conn_r7.LabelIcon);
92
92
  } }
93
93
  function FlowEditorComponent_For_15_Conditional_3_Template(rf, ctx) { if (rf & 1) {
94
94
  i0.ɵɵelementStart(0, "div", 32);
@@ -96,19 +96,19 @@ function FlowEditorComponent_For_15_Conditional_3_Template(rf, ctx) { if (rf & 1
96
96
  i0.ɵɵtext(2);
97
97
  i0.ɵɵelementEnd();
98
98
  } if (rf & 2) {
99
- const conn_r8 = i0.ɵɵnextContext().$implicit;
100
- const ctx_r2 = i0.ɵɵnextContext();
101
- i0.ɵɵstyleProp("background-color", ctx_r2.ConnectionLabelBackground)("border-color", ctx_r2.ConnectionLabelBorderColor)("color", ctx_r2.ConnectionLabelTextColor);
102
- i0.ɵɵproperty("position", 0.5)("title", conn_r8.LabelDetail || conn_r8.Label || "");
99
+ const conn_r7 = i0.ɵɵnextContext().$implicit;
100
+ const ctx_r1 = i0.ɵɵnextContext();
101
+ i0.ɵɵstyleProp("background-color", ctx_r1.ConnectionLabelBackground)("border-color", ctx_r1.ConnectionLabelBorderColor)("color", ctx_r1.ConnectionLabelTextColor);
102
+ i0.ɵɵproperty("position", 0.5)("title", conn_r7.LabelDetail || conn_r7.Label || "");
103
103
  i0.ɵɵadvance();
104
- i0.ɵɵconditional(conn_r8.LabelIcon ? 1 : -1);
104
+ i0.ɵɵconditional(conn_r7.LabelIcon ? 1 : -1);
105
105
  i0.ɵɵadvance();
106
- i0.ɵɵtextInterpolate1(" ", conn_r8.Label, " ");
106
+ i0.ɵɵtextInterpolate1(" ", conn_r7.Label, " ");
107
107
  } }
108
108
  function FlowEditorComponent_For_15_Template(rf, ctx) { if (rf & 1) {
109
- const _r7 = i0.ɵɵgetCurrentView();
109
+ const _r6 = i0.ɵɵgetCurrentView();
110
110
  i0.ɵɵelementStart(0, "f-connection", 29);
111
- i0.ɵɵlistener("click", function FlowEditorComponent_For_15_Template_f_connection_click_0_listener($event) { const conn_r8 = i0.ɵɵrestoreView(_r7).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onConnectionClicked($event, conn_r8)); })("contextmenu", function FlowEditorComponent_For_15_Template_f_connection_contextmenu_0_listener($event) { const conn_r8 = i0.ɵɵrestoreView(_r7).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onConnectionContextMenu($event, conn_r8)); });
111
+ i0.ɵɵlistener("click", function FlowEditorComponent_For_15_Template_f_connection_click_0_listener($event) { const conn_r7 = i0.ɵɵrestoreView(_r6).$implicit; const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onConnectionClicked($event, conn_r7)); })("contextmenu", function FlowEditorComponent_For_15_Template_f_connection_contextmenu_0_listener($event) { const conn_r7 = i0.ɵɵrestoreView(_r6).$implicit; const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onConnectionContextMenu($event, conn_r7)); });
112
112
  i0.ɵɵnamespaceSVG();
113
113
  i0.ɵɵelementStart(1, "svg", 27);
114
114
  i0.ɵɵelement(2, "path", 30);
@@ -116,27 +116,27 @@ function FlowEditorComponent_For_15_Template(rf, ctx) { if (rf & 1) {
116
116
  i0.ɵɵconditionalCreate(3, FlowEditorComponent_For_15_Conditional_3_Template, 3, 10, "div", 31);
117
117
  i0.ɵɵelementEnd();
118
118
  } if (rf & 2) {
119
- const conn_r8 = ctx.$implicit;
120
- const ctx_r2 = i0.ɵɵnextContext();
121
- i0.ɵɵstyleProp("--connection-color", conn_r8.Color || "#94a3b8")("--connection-width", conn_r8.StrokeWidth || 2, "px");
122
- i0.ɵɵclassProp("mj-flow-connection-colored", !!conn_r8.Color)("mj-flow-connection-dashed", conn_r8.Style === "dashed")("mj-flow-connection-dotted", conn_r8.Style === "dotted")("mj-flow-connection-animated", !!conn_r8.Animated);
123
- i0.ɵɵproperty("fConnectionId", conn_r8.ID)("fOutputId", conn_r8.SourcePortID)("fInputId", conn_r8.TargetPortID)("fRadius", 8)("fOffset", 12)("fSelectionDisabled", false)("fReassignDisabled", ctx_r2.ReadOnly);
119
+ const conn_r7 = ctx.$implicit;
120
+ const ctx_r1 = i0.ɵɵnextContext();
121
+ i0.ɵɵstyleProp("--connection-color", conn_r7.Color || "#94a3b8")("--connection-width", conn_r7.StrokeWidth || 2, "px");
122
+ i0.ɵɵclassProp("mj-flow-connection-colored", !!conn_r7.Color)("mj-flow-connection-dashed", conn_r7.Style === "dashed")("mj-flow-connection-dotted", conn_r7.Style === "dotted")("mj-flow-connection-animated", !!conn_r7.Animated);
123
+ i0.ɵɵproperty("fConnectionId", conn_r7.ID)("fOutputId", conn_r7.SourcePortID)("fInputId", conn_r7.TargetPortID)("fRadius", 8)("fOffset", 12)("fSelectionDisabled", false)("fReassignDisabled", ctx_r1.ReadOnly);
124
124
  i0.ɵɵadvance();
125
- i0.ɵɵproperty("refX", 9)("refY", 5)("height", conn_r8.Animated ? 16 : 10)("width", conn_r8.Animated ? 16 : 10);
125
+ i0.ɵɵproperty("refX", 9)("refY", 5)("height", conn_r7.Animated ? 16 : 10)("width", conn_r7.Animated ? 16 : 10);
126
126
  i0.ɵɵadvance();
127
- i0.ɵɵattribute("fill", conn_r8.Color || "#94a3b8");
127
+ i0.ɵɵattribute("fill", conn_r7.Color || "#94a3b8");
128
128
  i0.ɵɵadvance();
129
- i0.ɵɵconditional(conn_r8.Label ? 3 : -1);
129
+ i0.ɵɵconditional(conn_r7.Label ? 3 : -1);
130
130
  } }
131
131
  function FlowEditorComponent_For_17_Template(rf, ctx) { if (rf & 1) {
132
- const _r9 = i0.ɵɵgetCurrentView();
132
+ const _r8 = i0.ɵɵgetCurrentView();
133
133
  i0.ɵɵelementStart(0, "mj-flow-node", 35);
134
- i0.ɵɵlistener("contextmenu", function FlowEditorComponent_For_17_Template_mj_flow_node_contextmenu_0_listener($event) { const node_r10 = i0.ɵɵrestoreView(_r9).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onNodeContextMenu($event, node_r10)); });
134
+ i0.ɵɵlistener("contextmenu", function FlowEditorComponent_For_17_Template_mj_flow_node_contextmenu_0_listener($event) { const node_r9 = i0.ɵɵrestoreView(_r8).$implicit; const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onNodeContextMenu($event, node_r9)); });
135
135
  i0.ɵɵelementEnd();
136
136
  } if (rf & 2) {
137
- const node_r10 = ctx.$implicit;
138
- const ctx_r2 = i0.ɵɵnextContext();
139
- i0.ɵɵproperty("fNodeId", node_r10.ID)("fNodePosition", i0.ɵɵpureFunction2(8, _c2, node_r10.Position.X, node_r10.Position.Y))("fNodeDraggingDisabled", ctx_r2.ReadOnly || ctx_r2.panMode || node_r10.Locked === true)("fNodeSelectionDisabled", ctx_r2.panMode)("fConnectOnNode", !ctx_r2.ReadOnly && !ctx_r2.panMode)("Node", node_r10)("TypeConfig", ctx_r2.GetTypeConfig(node_r10.Type))("ReadOnly", ctx_r2.ReadOnly);
137
+ const node_r9 = ctx.$implicit;
138
+ const ctx_r1 = i0.ɵɵnextContext();
139
+ i0.ɵɵproperty("fNodeId", node_r9.ID)("fNodePosition", i0.ɵɵpureFunction2(8, _c2, node_r9.Position.X, node_r9.Position.Y))("fNodeDraggingDisabled", ctx_r1.ReadOnly || ctx_r1.panMode || node_r9.Locked === true)("fNodeSelectionDisabled", ctx_r1.panMode)("fConnectOnNode", !ctx_r1.ReadOnly && !ctx_r1.panMode)("Node", node_r9)("TypeConfig", ctx_r1.GetTypeConfig(node_r9.Type))("ReadOnly", ctx_r1.ReadOnly);
140
140
  } }
141
141
  function FlowEditorComponent_Conditional_18_Template(rf, ctx) { if (rf & 1) {
142
142
  i0.ɵɵelement(0, "f-selection-area");
@@ -246,34 +246,34 @@ function FlowEditorComponent_Conditional_21_Template(rf, ctx) { if (rf & 1) {
246
246
  i0.ɵɵconditionalCreate(2, FlowEditorComponent_Conditional_21_Conditional_2_Template, 2, 0, "p", 57);
247
247
  i0.ɵɵelementEnd()();
248
248
  } if (rf & 2) {
249
- const ctx_r2 = i0.ɵɵnextContext();
249
+ const ctx_r1 = i0.ɵɵnextContext();
250
250
  i0.ɵɵadvance();
251
- i0.ɵɵproperty("Title", ctx_r2.EmptyStateTitle);
251
+ i0.ɵɵproperty("Title", ctx_r1.EmptyStateTitle);
252
252
  i0.ɵɵadvance();
253
- i0.ɵɵconditional(!ctx_r2.ReadOnly ? 2 : -1);
253
+ i0.ɵɵconditional(!ctx_r1.ReadOnly ? 2 : -1);
254
254
  } }
255
255
  function FlowEditorComponent_Conditional_22_For_2_Conditional_1_Template(rf, ctx) { if (rf & 1) {
256
256
  i0.ɵɵelement(0, "i", 60);
257
257
  } if (rf & 2) {
258
- const item_r13 = i0.ɵɵnextContext().$implicit;
259
- i0.ɵɵproperty("ngClass", item_r13.Icon);
258
+ const item_r11 = i0.ɵɵnextContext().$implicit;
259
+ i0.ɵɵproperty("ngClass", item_r11.Icon);
260
260
  } }
261
261
  function FlowEditorComponent_Conditional_22_For_2_Conditional_4_Template(rf, ctx) { if (rf & 1) {
262
262
  i0.ɵɵelementStart(0, "kbd", 61);
263
263
  i0.ɵɵtext(1);
264
264
  i0.ɵɵelementEnd();
265
265
  } if (rf & 2) {
266
- const item_r13 = i0.ɵɵnextContext().$implicit;
266
+ const item_r11 = i0.ɵɵnextContext().$implicit;
267
267
  i0.ɵɵadvance();
268
- i0.ɵɵtextInterpolate(item_r13.Shortcut);
268
+ i0.ɵɵtextInterpolate(item_r11.Shortcut);
269
269
  } }
270
270
  function FlowEditorComponent_Conditional_22_For_2_Conditional_5_Template(rf, ctx) { if (rf & 1) {
271
271
  i0.ɵɵelement(0, "div", 62);
272
272
  } }
273
273
  function FlowEditorComponent_Conditional_22_For_2_Template(rf, ctx) { if (rf & 1) {
274
- const _r12 = i0.ɵɵgetCurrentView();
274
+ const _r10 = i0.ɵɵgetCurrentView();
275
275
  i0.ɵɵelementStart(0, "button", 59);
276
- i0.ɵɵlistener("click", function FlowEditorComponent_Conditional_22_For_2_Template_button_click_0_listener() { const item_r13 = i0.ɵɵrestoreView(_r12).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onContextMenuAction(item_r13.ID)); });
276
+ i0.ɵɵlistener("click", function FlowEditorComponent_Conditional_22_For_2_Template_button_click_0_listener() { const item_r11 = i0.ɵɵrestoreView(_r10).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onContextMenuAction(item_r11.ID)); });
277
277
  i0.ɵɵconditionalCreate(1, FlowEditorComponent_Conditional_22_For_2_Conditional_1_Template, 1, 1, "i", 60);
278
278
  i0.ɵɵelementStart(2, "span");
279
279
  i0.ɵɵtext(3);
@@ -282,39 +282,38 @@ function FlowEditorComponent_Conditional_22_For_2_Template(rf, ctx) { if (rf & 1
282
282
  i0.ɵɵelementEnd();
283
283
  i0.ɵɵconditionalCreate(5, FlowEditorComponent_Conditional_22_For_2_Conditional_5_Template, 1, 0, "div", 62);
284
284
  } if (rf & 2) {
285
- const item_r13 = ctx.$implicit;
286
- const $index_r14 = ctx.$index;
287
- const ɵ$index_193_r15 = ctx.$index;
288
- const ɵ$count_193_r16 = ctx.$count;
289
- const ctx_r2 = i0.ɵɵnextContext(2);
290
- i0.ɵɵclassProp("mj-flow-context-menu-item--danger", item_r13.Danger);
291
- i0.ɵɵproperty("disabled", item_r13.Disabled);
285
+ const item_r11 = ctx.$implicit;
286
+ const $index_r12 = ctx.$index;
287
+ const ɵ$index_193_r13 = ctx.$index;
288
+ const ɵ$count_193_r14 = ctx.$count;
289
+ const ctx_r1 = i0.ɵɵnextContext(2);
290
+ i0.ɵɵclassProp("mj-flow-context-menu-item--danger", item_r11.Danger);
291
+ i0.ɵɵproperty("disabled", item_r11.Disabled);
292
292
  i0.ɵɵadvance();
293
- i0.ɵɵconditional(item_r13.Icon ? 1 : -1);
293
+ i0.ɵɵconditional(item_r11.Icon ? 1 : -1);
294
294
  i0.ɵɵadvance(2);
295
- i0.ɵɵtextInterpolate(item_r13.Label);
295
+ i0.ɵɵtextInterpolate(item_r11.Label);
296
296
  i0.ɵɵadvance();
297
- i0.ɵɵconditional(item_r13.Shortcut ? 4 : -1);
297
+ i0.ɵɵconditional(item_r11.Shortcut ? 4 : -1);
298
298
  i0.ɵɵadvance();
299
- i0.ɵɵconditional(!(ɵ$index_193_r15 === ɵ$count_193_r16 - 1) && item_r13.Danger !== (ctx_r2.contextMenuItems[$index_r14 + 1] == null ? null : ctx_r2.contextMenuItems[$index_r14 + 1].Danger) ? 5 : -1);
299
+ i0.ɵɵconditional(!(ɵ$index_193_r13 === ɵ$count_193_r14 - 1) && item_r11.Danger !== (ctx_r1.contextMenuItems[$index_r12 + 1] == null ? null : ctx_r1.contextMenuItems[$index_r12 + 1].Danger) ? 5 : -1);
300
300
  } }
301
301
  function FlowEditorComponent_Conditional_22_Template(rf, ctx) { if (rf & 1) {
302
- const _r11 = i0.ɵɵgetCurrentView();
303
302
  i0.ɵɵelementStart(0, "div", 58);
304
- i0.ɵɵlistener("click", function FlowEditorComponent_Conditional_22_Template_div_click_0_listener($event) { i0.ɵɵrestoreView(_r11); return i0.ɵɵresetView($event.stopPropagation()); });
303
+ i0.ɵɵlistener("click", function FlowEditorComponent_Conditional_22_Template_div_click_0_listener($event) { return $event.stopPropagation(); });
305
304
  i0.ɵɵrepeaterCreate(1, FlowEditorComponent_Conditional_22_For_2_Template, 6, 7, null, null, _forTrack0);
306
305
  i0.ɵɵelementEnd();
307
306
  } if (rf & 2) {
308
- const ctx_r2 = i0.ɵɵnextContext();
309
- i0.ɵɵstyleProp("left", ctx_r2.contextMenuX, "px")("top", ctx_r2.contextMenuY, "px");
307
+ const ctx_r1 = i0.ɵɵnextContext();
308
+ i0.ɵɵstyleProp("left", ctx_r1.contextMenuX, "px")("top", ctx_r1.contextMenuY, "px");
310
309
  i0.ɵɵadvance();
311
- i0.ɵɵrepeater(ctx_r2.contextMenuItems);
310
+ i0.ɵɵrepeater(ctx_r1.contextMenuItems);
312
311
  } }
313
312
  function FlowEditorComponent_Conditional_23_Template(rf, ctx) { if (rf & 1) {
314
313
  i0.ɵɵelement(0, "mj-flow-status-bar", 19);
315
314
  } if (rf & 2) {
316
- const ctx_r2 = i0.ɵɵnextContext();
317
- i0.ɵɵproperty("NodeCount", ctx_r2.Nodes.length)("ConnectionCount", ctx_r2.Connections.length)("SelectedCount", ctx_r2.selectedCount)("ZoomLevel", ctx_r2.zoomLevel);
315
+ const ctx_r1 = i0.ɵɵnextContext();
316
+ i0.ɵɵproperty("NodeCount", ctx_r1.Nodes.length)("ConnectionCount", ctx_r1.Connections.length)("SelectedCount", ctx_r1.selectedCount)("ZoomLevel", ctx_r1.zoomLevel);
318
317
  } }
319
318
  /**
320
319
  * Generic, entity-agnostic visual flow editor component.
@@ -1093,17 +1092,16 @@ export class FlowEditorComponent {
1093
1092
  } }, hostBindings: function FlowEditorComponent_HostBindings(rf, ctx) { if (rf & 1) {
1094
1093
  i0.ɵɵlistener("click", function FlowEditorComponent_click_HostBindingHandler() { return ctx.onDocumentClick(); }, i0.ɵɵresolveDocument)("keydown", function FlowEditorComponent_keydown_HostBindingHandler($event) { return ctx.onKeyDown($event); });
1095
1094
  } }, inputs: { Nodes: "Nodes", Connections: "Connections", NodeTypes: "NodeTypes", ReadOnly: "ReadOnly", ShowMinimap: "ShowMinimap", ShowPalette: "ShowPalette", ShowGrid: "ShowGrid", ShowStatusBar: "ShowStatusBar", ShowToolbar: "ShowToolbar", ToolbarVisibility: "ToolbarVisibility", ToolbarAlign: "ToolbarAlign", ShowLegend: "ShowLegend", GridSize: "GridSize", AutoLayoutDirection: "AutoLayoutDirection", ConnectionLabelBackground: "ConnectionLabelBackground", ConnectionLabelBorderColor: "ConnectionLabelBorderColor", ConnectionLabelTextColor: "ConnectionLabelTextColor" }, outputs: { NodeSelected: "NodeSelected", NodeAdded: "NodeAdded", NodeRemoved: "NodeRemoved", NodeMoved: "NodeMoved", ConnectionCreated: "ConnectionCreated", ConnectionRemoved: "ConnectionRemoved", ConnectionReassigned: "ConnectionReassigned", ConnectionSelected: "ConnectionSelected", SelectionChanged: "SelectionChanged", CanvasClicked: "CanvasClicked", NodesChanged: "NodesChanged", ConnectionsChanged: "ConnectionsChanged", NodeEditRequested: "NodeEditRequested", ConnectionEditRequested: "ConnectionEditRequested", BeforeContextMenu: "BeforeContextMenu", AfterContextMenuAction: "AfterContextMenuAction", GridToggled: "GridToggled", MinimapToggled: "MinimapToggled", LegendToggled: "LegendToggled", ToolbarVisibilityChanged: "ToolbarVisibilityChanged" }, standalone: false, features: [i0.ɵɵProvidersFeature([FlowStateService, FlowLayoutService])], decls: 24, vars: 25, consts: [["canvasArea", ""], ["fZoomRef", "fComponent"], ["tabindex", "0", 1, "mj-flow-editor"], [1, "mj-flow-editor-toolbar-area"], ["type", "button", "title", "Show canvas tools", "aria-label", "Show canvas tools", 1, "mj-flow-editor-toolbar-chip"], ["type", "button", "title", "Show canvas tools", "aria-label", "Show canvas tools", 1, "mj-flow-editor-toolbar-tab"], [1, "mj-flow-editor-canvas-area"], [3, "NodeTypes"], [1, "mj-flow-editor-canvas"], ["fDraggable", "", 3, "fLoaded", "fCreateConnection", "fReassignConnection", "fCreateNode", "fSelectionChange", "fMoveNodes", "fDraggableDisabled", "fCanvasMoveTrigger", "vCellSize", "hCellSize", "fCellSizeWhileDragging"], [3, "fAlignThreshold"], ["fZoom", "", 3, "fCanvasChange", "fZoomMinimum", "fZoomMaximum", "fZoomStep", "position", "scale"], ["fType", "bezier", 3, "fRadius", "fOffset"], ["fType", "bezier", "fBehavior", "fixed", 3, "fConnectionId", "fOutputId", "fInputId", "fRadius", "fOffset", "fSelectionDisabled", "fReassignDisabled", "--connection-color", "--connection-width", "mj-flow-connection-colored", "mj-flow-connection-dashed", "mj-flow-connection-dotted", "mj-flow-connection-animated"], ["fNode", "", "fDragHandle", "", 3, "fNodeId", "fNodePosition", "fNodeDraggingDisabled", "fNodeSelectionDisabled", "fConnectOnNode", "Node", "TypeConfig", "ReadOnly"], ["fDragBlocker", "", 1, "mj-flow-editor-minimap"], [1, "mj-flow-editor-legend"], [1, "mj-flow-editor-empty"], [1, "mj-flow-context-menu", 3, "left", "top"], [3, "NodeCount", "ConnectionCount", "SelectedCount", "ZoomLevel"], [3, "ZoomInClicked", "ZoomOutClicked", "FitToScreenClicked", "AutoLayoutClicked", "GridToggled", "MinimapToggled", "LegendToggled", "PanModeToggled", "MinimizeClicked", "HideClicked", "ZoomLevel", "ShowGrid", "ShowMinimap", "ShowLegend", "ReadOnly", "PanMode"], ["type", "button", "title", "Show canvas tools", "aria-label", "Show canvas tools", 1, "mj-flow-editor-toolbar-chip", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-wrench"], ["type", "button", "title", "Show canvas tools", "aria-label", "Show canvas tools", 1, "mj-flow-editor-toolbar-tab", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-ellipsis"], [3, "NodeTypeActivated", "NodeTypes"], [3, "color", "radius"], ["viewBox", "0 0 10 10", "fMarker", "", "type", "end", "orient", "auto", 3, "refX", "refY", "height", "width"], ["d", "M0 0L10 5L0 10Z", "fill", "#94a3b8"], ["fType", "bezier", "fBehavior", "fixed", 3, "click", "contextmenu", "fConnectionId", "fOutputId", "fInputId", "fRadius", "fOffset", "fSelectionDisabled", "fReassignDisabled"], ["d", "M0 0L10 5L0 10Z"], ["fConnectionContent", "", 1, "mj-flow-connection-label", 3, "position", "backgroundColor", "borderColor", "color", "title"], ["fConnectionContent", "", 1, "mj-flow-connection-label", 3, "position", "title"], [1, "fa-solid", "mj-flow-connection-label-icon", 3, "ngClass", "color"], [1, "fa-solid", "mj-flow-connection-label-icon", 3, "ngClass"], ["fNode", "", "fDragHandle", "", 3, "contextmenu", "fNodeId", "fNodePosition", "fNodeDraggingDisabled", "fNodeSelectionDisabled", "fConnectOnNode", "Node", "TypeConfig", "ReadOnly"], [3, "fMinSize"], [1, "mj-flow-editor-legend-title"], [1, "mj-flow-editor-legend-section"], [1, "mj-flow-editor-legend-heading"], [1, "mj-flow-editor-legend-item"], ["width", "28", "height", "10", 1, "mj-flow-editor-legend-line-svg"], ["x1", "0", "y1", "5", "x2", "28", "y2", "5", "stroke", "#64748b", "stroke-width", "2"], ["x1", "0", "y1", "5", "x2", "28", "y2", "5", "stroke", "#16a34a", "stroke-width", "2"], [1, "fa-solid", "fa-circle-check", 2, "color", "#16a34a", "font-size", "10px"], ["x1", "0", "y1", "5", "x2", "28", "y2", "5", "stroke", "#f59e0b", "stroke-width", "2", "stroke-dasharray", "5 3"], ["x1", "0", "y1", "5", "x2", "28", "y2", "5", "stroke", "#ef4444", "stroke-width", "2"], [1, "fa-solid", "fa-triangle-exclamation", 2, "color", "#ef4444", "font-size", "10px"], [1, "mj-flow-editor-legend-swatch", 2, "background", "#3B82F6"], [1, "mj-flow-editor-legend-swatch", 2, "background", "#8B5CF6"], [1, "mj-flow-editor-legend-swatch", 2, "background", "#10B981"], [1, "mj-flow-editor-legend-swatch", 2, "background", "#F59E0B"], [1, "mj-flow-editor-legend-swatch", 2, "background", "#F97316"], [1, "mj-flow-editor-legend-box", 2, "border-color", "#16a34a", "background", "#f0fdf4"], [1, "mj-flow-editor-legend-box", 2, "border-color", "#ef4444", "background", "#fef2f2"], [1, "fa-solid", "fa-triangle-exclamation", 2, "color", "#ea580c", "font-size", "10px"], ["Icon", "fa-solid fa-diagram-project", 3, "Title"], [1, "mj-flow-editor-empty-subtitle"], [1, "mj-flow-context-menu", 3, "click"], ["type", "button", 1, "mj-flow-context-menu-item", 3, "click", "disabled"], [1, "fa-solid", 3, "ngClass"], [1, "mj-flow-context-menu-shortcut"], [1, "mj-flow-context-menu-divider"]], template: function FlowEditorComponent_Template(rf, ctx) { if (rf & 1) {
1096
- const _r1 = i0.ɵɵgetCurrentView();
1097
1095
  i0.ɵɵelementStart(0, "div", 2);
1098
1096
  i0.ɵɵconditionalCreate(1, FlowEditorComponent_Conditional_1_Template, 2, 7, "div", 3)(2, FlowEditorComponent_Conditional_2_Template, 2, 1, "button", 4)(3, FlowEditorComponent_Conditional_3_Template, 2, 1, "button", 5);
1099
1097
  i0.ɵɵelementStart(4, "div", 6);
1100
1098
  i0.ɵɵconditionalCreate(5, FlowEditorComponent_Conditional_5_Template, 1, 1, "mj-flow-palette", 7);
1101
1099
  i0.ɵɵelementStart(6, "div", 8, 0)(8, "f-flow", 9);
1102
- i0.ɵɵlistener("fLoaded", function FlowEditorComponent_Template_f_flow_fLoaded_8_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onFlowLoaded()); })("fCreateConnection", function FlowEditorComponent_Template_f_flow_fCreateConnection_8_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onCreateConnection($event)); })("fReassignConnection", function FlowEditorComponent_Template_f_flow_fReassignConnection_8_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onReassignConnection($event)); })("fCreateNode", function FlowEditorComponent_Template_f_flow_fCreateNode_8_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onCreateNode($event)); })("fSelectionChange", function FlowEditorComponent_Template_f_flow_fSelectionChange_8_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onSelectionChange($event)); })("fMoveNodes", function FlowEditorComponent_Template_f_flow_fMoveNodes_8_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onNodesMoved($event)); });
1100
+ i0.ɵɵlistener("fLoaded", function FlowEditorComponent_Template_f_flow_fLoaded_8_listener() { return ctx.onFlowLoaded(); })("fCreateConnection", function FlowEditorComponent_Template_f_flow_fCreateConnection_8_listener($event) { return ctx.onCreateConnection($event); })("fReassignConnection", function FlowEditorComponent_Template_f_flow_fReassignConnection_8_listener($event) { return ctx.onReassignConnection($event); })("fCreateNode", function FlowEditorComponent_Template_f_flow_fCreateNode_8_listener($event) { return ctx.onCreateNode($event); })("fSelectionChange", function FlowEditorComponent_Template_f_flow_fSelectionChange_8_listener($event) { return ctx.onSelectionChange($event); })("fMoveNodes", function FlowEditorComponent_Template_f_flow_fMoveNodes_8_listener($event) { return ctx.onNodesMoved($event); });
1103
1101
  i0.ɵɵconditionalCreate(9, FlowEditorComponent_Conditional_9_Template, 2, 2, "f-background");
1104
1102
  i0.ɵɵconditionalCreate(10, FlowEditorComponent_Conditional_10_Template, 1, 1, "f-line-alignment", 10);
1105
1103
  i0.ɵɵelementStart(11, "f-canvas", 11, 1);
1106
- i0.ɵɵlistener("fCanvasChange", function FlowEditorComponent_Template_f_canvas_fCanvasChange_11_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onCanvasChange($event)); });
1104
+ i0.ɵɵlistener("fCanvasChange", function FlowEditorComponent_Template_f_canvas_fCanvasChange_11_listener($event) { return ctx.onCanvasChange($event); });
1107
1105
  i0.ɵɵconditionalCreate(13, FlowEditorComponent_Conditional_13_Template, 3, 6, "f-connection-for-create", 12);
1108
1106
  i0.ɵɵrepeaterCreate(14, FlowEditorComponent_For_15_Template, 4, 25, "f-connection", 13, ctx.trackConnectionById, true);
1109
1107
  i0.ɵɵrepeaterCreate(16, FlowEditorComponent_For_17_Template, 1, 11, "mj-flow-node", 14, ctx.trackNodeById, true);
@@ -1 +1 @@
1
- {"version":3,"file":"flow-editor.component.js","sourceRoot":"","sources":["../../../src/lib/components/flow-editor.component.ts","../../../src/lib/components/flow-editor.component.html"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,EAClB,iBAAiB,EAAE,uBAAuB,EAAE,YAAY,EACxF,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAEN,MAAM,cAAc,CAAC;AACxD,OAAO,EAML,8BAA8B,EAAE,mCAAmC,GAEpE,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;;;;;;;;;;;;;;;;;ICd7D,AADF,8BAA0E,0BAiBvB;IAA/C,AADA,AADA,AADA,AADA,AADA,AADA,AADA,AADA,AADA,gNAAiB,eAAQ,KAAC,qMACR,gBAAS,KAAC,6MACN,kBAAW,KAAC,2MACb,oBAAa,KAAC,qMACpB,4BAAqB,KAAC,2MACnB,+BAAwB,KAAC,yMAC1B,8BAAuB,KAAC,2MACvB,+BAAwB,KAAC,uMACxB,4BAAqB,WAAW,CAAC,KAAC,+LACtC,4BAAqB,QAAQ,CAAC,KAAC;IAElD,AADE,iBAAkB,EACd;;;;IAjBF,cAAuB;IAKvB,AADA,AADA,AADA,AADA,AADA,4CAAuB,6BACF,mCACM,iCACF,6BACJ,2BACF;;;;IAcvB,kCAEiE;IADzD,uLAAS,4BAAqB,OAAO,CAAC,KAAC;IAE7C,wBAAqD;IACvD,iBAAS;;;;;;;IAET,kCAEiE;IADzD,uLAAS,4BAAqB,OAAO,CAAC,KAAC;IAE7C,wBAAuD;IACzD,iBAAS;;;;;;;IAQP,2CAE2D;IAAzD,8NAAqB,yCAAkC,KAAC;IAC1D,iBAAkB;;;IAFhB,4CAAuB;;;IAuBrB,oCAAc;IACZ,uCAAuE;IACzE,iBAAe;;IADK,cAAmB;IAAC,AAApB,iCAAmB,cAAc;;;IAMrD,uCAA4D;;IAA1C,oCAAsB;;;IAatC,mDAGiB;;IACf,+BACiE;IAC/D,2BAA0C;IAE9C,AADE,iBAAM,EACkB;;IALxB,AADA,2BAAa,eACC;IAEE,cAAU;IAA0B,AAAd,AAAX,AAAX,wBAAU,WAAW,cAAc,aAAa;;;IA0C1D,wBAGqD;;;IAArD,4DAAgD;IAD9C,2CAA0B;;;IAThC,+BAKiD;IAC/C,yGAAsB;IAMtB,YACF;IAAA,iBAAM;;;;IATJ,AADA,AADA,oEAAmD,mDACH,0CACR;IACxC,AALsB,8BAAgB,qDAKQ;IAC9C,cAKC;IALD,4CAKC;IACD,cACF;IADE,8CACF;;;;IAxCJ,wCAiBwD;IAAtD,AADA,sNAAS,2CAAiC,KAAC,qNAC5B,+CAAqC,KAAC;;IAErD,+BAGoC;IAClC,2BAAiE;IACnE,iBAAM;IAEN,8FAAkB;IAgBpB,iBAAe;;;;IA/Bb,AADA,gEAAoD,sDACC;IAIrD,AADA,AADA,AADA,6DAAiD,yDACU,yDACA,mDACN;IANrD,AADA,AADA,AADA,AAHA,AADA,AADA,0CAAyB,mCACM,kCACD,cAGjB,eACC,6BACc,sCACE;IAWd,cAAU;IAExB,AADA,AADyB,AAAX,wBAAU,WAAW,sCACD,qCACD;IACP,cAAqC;;IAGjE,cAeC;IAfD,wCAeC;;;;IAMH,wCAWkD;IAAhD,mOAAe,0CAA+B,KAAC;IACjD,iBAAe;;;;IAFb,AADA,AADA,AADA,AADA,AADA,AADA,AADA,qCAAmB,uFACyC,wFACS,0CACnC,uDACM,kBAC3B,mDAC0B,6BAClB;;;IASzB,mCAAqC;;;IAKrC,+BAAiD;IAC/C,gCAAyC;IAC3C,iBAAM;;IADO,cAAiB;IAAjB,+BAAiB;;;IAQ9B,AADF,+BAAmC,cACQ;IAAA,sBAAM;IAAA,iBAAM;IAEnD,AADF,+BAA2C,cACE;IAAA,2BAAW;IAAA,iBAAM;IAC5D,+BAAwC;;IACtC,+BAAmE;IAAA,2BAAsE;IAAA,iBAAM;;IAC/I,4BAAM;IAAA,+BAAc;IACtB,AADsB,iBAAO,EACvB;IACN,gCAAwC;;IACtC,gCAAmE;IAAA,4BAAsE;IAAA,iBAAM;;IAC/I,yBAA8E;IAC9E,6BAAM;IAAA,mCAAkB;IAC1B,AAD0B,iBAAO,EAC3B;IACN,gCAAwC;;IACtC,gCAAmE;IAAA,4BAA6F;IAAA,iBAAM;;IACtK,6BAAM;IAAA,4BAAW;IACnB,AADmB,iBAAO,EACpB;IACN,gCAAwC;;IACtC,gCAAmE;IAAA,4BAAsE;IAAA,iBAAM;;IAC/I,yBAAsF;IACtF,6BAAM;IAAA,mCAAkB;IAE5B,AADE,AAD0B,iBAAO,EAC3B,EACF;IAEJ,AADF,gCAA2C,eACE;IAAA,2BAAU;IAAA,iBAAM;IAC3D,gCAAwC;IACtC,4BAA6E;IAC7E,6BAAM;IAAA,uBAAM;IACd,AADc,iBAAO,EACf;IACN,gCAAwC;IACtC,4BAA6E;IAC7E,6BAAM;IAAA,uBAAM;IACd,AADc,iBAAO,EACf;IACN,gCAAwC;IACtC,4BAA6E;IAC7E,6BAAM;IAAA,0BAAS;IACjB,AADiB,iBAAO,EAClB;IACN,gCAAwC;IACtC,4BAA6E;IAC7E,6BAAM;IAAA,yBAAQ;IAChB,AADgB,iBAAO,EACjB;IACN,gCAAwC;IACtC,4BAA6E;IAC7E,6BAAM;IAAA,sBAAK;IAEf,AADE,AADa,iBAAO,EACd,EACF;IAEJ,AADF,gCAA2C,eACE;IAAA,wBAAO;IAAA,iBAAM;IACxD,gCAAwC;IACtC,4BAAgG;IAChG,6BAAM;IAAA,2BAAU;IAClB,AADkB,iBAAO,EACnB;IACN,gCAAwC;IAEtC,AADA,4BAAgG,aACV;IACtF,6BAAM;IAAA,+BAAc;IAG1B,AADE,AADE,AADsB,iBAAO,EACvB,EACF,EACF;;;IAUA,6BAAyC;IACvC,qFACF;IAAA,iBAAI;;;IANR,AADF,+BAAkC,yBAGJ;IAC1B,mGAAiB;IAMrB,AADE,iBAAiB,EACb;;;IAPF,cAAyB;IAAzB,8CAAyB;IACzB,cAIC;IAJD,2CAIC;;;IAoBD,wBAA8C;;;IAA1B,uCAAqB;;;IAIzC,+BAA2C;IAAA,YAAmB;IAAA,iBAAM;;;IAAzB,cAAmB;IAAnB,uCAAmB;;;IAIhE,0BAAgD;;;;IAblD,kCAG+C;IAAvC,2NAAS,uCAA4B,KAAC;IAC5C,yGAAiB;IAGjB,4BAAM;IAAA,YAAgB;IAAA,iBAAO;IAC7B,2GAAqB;IAGvB,iBAAS;IACT,2GAAqE;;;;;;;IAX7D,oEAAuD;IACvD,4CAA0B;IAEhC,cAEC;IAFD,wCAEC;IACK,eAAgB;IAAhB,oCAAgB;IACtB,cAEC;IAFD,4CAEC;IAEH,cAEC;IAFD,sMAEC;;;;IApBL,+BAIqC;IAAnC,yJAAS,wBAAwB,KAAC;IAClC,uGAgBC;IACH,iBAAM;;;IAnBJ,AADA,iDAA8B,kCACD;IAE7B,cAgBC;IAhBD,sCAgBC;;;IAMH,yCAKqB;;;IADnB,AADA,AADA,AADA,+CAA0B,8CACY,uCACP,+BACR;;AD7Q7B;;;;;;;;;;;;;;GAcG;AAUH,MAAM,OAAO,mBAAmB;IAsHpB;IACA;IACA;IAvHV,+DAA+D;IACtD,KAAK,GAAe,EAAE,CAAC;IACvB,WAAW,GAAqB,EAAE,CAAC;IACnC,SAAS,GAAyB,EAAE,CAAC;IACrC,QAAQ,GAAG,KAAK,CAAC;IACjB,WAAW,GAAG,IAAI,CAAC;IACnB,WAAW,GAAG,IAAI,CAAC;IACnB,QAAQ,GAAG,IAAI,CAAC;IAChB,aAAa,GAAG,IAAI,CAAC;IAC9B;;;OAGG;IACM,WAAW,GAAG,IAAI,CAAC;IAC5B,uFAAuF;IAC9E,iBAAiB,GAA0B,OAAO,CAAC;IAC5D,yDAAyD;IAChD,YAAY,GAAqB,QAAQ,CAAC;IAC1C,UAAU,GAAG,IAAI,CAAC;IAClB,QAAQ,GAAG,EAAE,CAAC;IACd,mBAAmB,GAAwB,UAAU,CAAC;IAC/D,6CAA6C;IAC7C,8FAA8F;IAC9F,2FAA2F;IAClF,yBAAyB,GAAG,sBAAsB,CAAC;IAC5D,yCAAyC;IAChC,0BAA0B,GAAG,0BAA0B,CAAC;IACjE,uCAAuC;IAC9B,wBAAwB,GAAG,0BAA0B,CAAC;IAE/D,4EAA4E;IAC5E,IAAW,eAAe;QACxB,OAAO,IAAI,CAAC,QAAQ;YAClB,CAAC,CAAC,gCAAgC;YAClC,CAAC,CAAC,yFAAyF,CAAC;IAChG,CAAC;IAED,+DAA+D;IACrD,YAAY,GAAG,IAAI,YAAY,EAAmB,CAAC;IACnD,SAAS,GAAG,IAAI,YAAY,EAAsB,CAAC;IACnD,WAAW,GAAG,IAAI,YAAY,EAAY,CAAC;IAC3C,SAAS,GAAG,IAAI,YAAY,EAAsB,CAAC;IACnD,iBAAiB,GAAG,IAAI,YAAY,EAA8B,CAAC;IACnE,iBAAiB,GAAG,IAAI,YAAY,EAAkB,CAAC;IACvD,oBAAoB,GAAG,IAAI,YAAY,EAAiC,CAAC;IACzE,kBAAkB,GAAG,IAAI,YAAY,EAAyB,CAAC;IAC/D,gBAAgB,GAAG,IAAI,YAAY,EAA6B,CAAC;IACjE,aAAa,GAAG,IAAI,YAAY,EAAwB,CAAC;IACzD,YAAY,GAAG,IAAI,YAAY,EAAc,CAAC;IAC9C,kBAAkB,GAAG,IAAI,YAAY,EAAoB,CAAC;IAC1D,iBAAiB,GAAG,IAAI,YAAY,EAAY,CAAC;IACjD,uBAAuB,GAAG,IAAI,YAAY,EAAkB,CAAC;IACvE,mGAAmG;IACzF,iBAAiB,GAAG,IAAI,YAAY,EAAkC,CAAC;IACvE,sBAAsB,GAAG,IAAI,YAAY,EAAuC,CAAC;IACjF,WAAW,GAAG,IAAI,YAAY,EAAW,CAAC;IAC1C,cAAc,GAAG,IAAI,YAAY,EAAW,CAAC;IAC7C,aAAa,GAAG,IAAI,YAAY,EAAW,CAAC;IACtD,4EAA4E;IAClE,wBAAwB,GAAG,IAAI,YAAY,EAAyB,CAAC;IAE/E,kFAAkF;IAClF,IAAW,0BAA0B;QACnC,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC9D,CAAC;IAEM,oBAAoB,CAAC,IAA2B;QACrD,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE,OAAO;QAC9B,IAAI,IAAI,CAAC,iBAAiB,KAAK,IAAI;YAAE,OAAO;QAC5C,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAC9B,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC;IAED,+DAA+D;IAC1B,KAAK,CAA6B;IAChC,OAAO,CAA+B;IAC5C,KAAK,CAA6B;IAChC,UAAU,CAAsC;IAEnF,+DAA+D;IACrD,SAAS,GAAG,GAAG,CAAC;IAChB,cAAc,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IAChC,WAAW,GAAG,CAAC,CAAC;IAC1B,sFAAsF;IAC9E,aAAa,GAAG,KAAK,CAAC;IAC9B,8FAA8F;IACtF,mBAAmB,GAAG,KAAK,CAAC;IAC5B,4BAA4B,GAAG,KAAK,CAAC;IACnC,eAAe,GAAa,EAAE,CAAC;IAC/B,qBAAqB,GAAa,EAAE,CAAC;IACrC,OAAO,GAAG,KAAK,CAAC;IAE1B,4EAA4E;IAClE,mBAAmB,GAAG,CAAC,MAA+B,EAAW,EAAE;QAC3E,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC,CAAC;IAEF,wBAAwB;IACd,kBAAkB,GAAG,KAAK,CAAC;IAC3B,YAAY,GAAG,CAAC,CAAC;IACjB,YAAY,GAAG,CAAC,CAAC;IACjB,qBAAqB,GAA0B,MAAM,CAAC;IACtD,eAAe,GAAoB,IAAI,CAAC;IACxC,qBAAqB,GAA0B,IAAI,CAAC;IACpD,gBAAgB,GAA0B,EAAE,CAAC;IAE/C,QAAQ,GAAG,IAAI,OAAO,EAAQ,CAAC;IAC/B,WAAW,GAAG,KAAK,CAAC;IACpB,uBAAuB,GAAG,CAAC,CAAC;IAEpC,oGAAoG;IAC5F,MAAM,CAAU,mBAAmB,GAAG,CAAC,CAAC;IAChD,0EAA0E;IAClE,MAAM,CAAU,oBAAoB,GAAG,EAAE,CAAC;IAC1C,mBAAmB,GAAG,CAAC,CAAC;IAEhC,YACU,GAAsB,EACtB,YAA8B,EAC9B,aAAgC;QAFhC,QAAG,GAAH,GAAG,CAAmB;QACtB,iBAAY,GAAZ,YAAY,CAAkB;QAC9B,kBAAa,GAAb,aAAa,CAAmB;IACvC,CAAC;IAEJ,+DAA+D;IAE/D,QAAQ;QACN,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC1B,CAAC;IAED,WAAW;QACT,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACrB,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAC3B,CAAC;IAED,+DAA+D;IAE/D,wCAAwC;IACxC,SAAS;QACP,IAAI,CAAC,4BAA4B,GAAG,IAAI,CAAC;QACzC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;QACpD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,cAAc,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,4BAA4B,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACvE,CAAC;IAED,uBAAuB;IACvB,MAAM;QACJ,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;QAChC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;YACtD,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACjC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,wBAAwB;IACxB,OAAO;QACL,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;QAChC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC;YACxD,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACjC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,kCAAkC;IAClC,WAAW,CAAC,SAA+B;QACzC,MAAM,GAAG,GAAG,SAAS,IAAI,IAAI,CAAC,mBAAmB,CAAC;QAClD,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QACrF,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC7C,IAAI,MAAM,EAAE,CAAC;gBACX,IAAI,CAAC,QAAQ,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC;YAChC,CAAC;QACH,CAAC;QACD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QACzB,6BAA6B;QAC7B,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,GAAG,CAAC,CAAC;IAC1C,CAAC;IAED,2CAA2C;IAC3C,YAAY,CAAC,MAAc;QACzB,IAAI,CAAC,OAAO,EAAE,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAChD,CAAC;IAED,qCAAqC;IACrC,UAAU,CAAC,MAAc;QACvB,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,IAAI,IAAI,CAAC;QACpE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED,0BAA0B;IAC1B,cAAc;QACZ,IAAI,CAAC,KAAK,EAAE,cAAc,EAAE,CAAC;QAC7B,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;QAC1B,IAAI,CAAC,qBAAqB,GAAG,EAAE,CAAC;QAChC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IAED,oCAAoC;IACpC,aAAa,CAAC,MAAc,EAAE,MAA0B,EAAE,OAAgB;QACxE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;QAC5D,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;YACrB,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC;YAC7B,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAED;yEACqE;IACrE,UAAU,CAAC,MAAc,EAAE,OAAgI;QACzJ,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;QAChE,IAAI,GAAG,KAAK,CAAC,CAAC;YAAE,OAAO;QACvB,oFAAoF;QACpF,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC;QACrD,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC3B,CAAC;IAED,mFAAmF;IACnF,gBAAgB,CAAC,MAAc,EAAE,OAAiJ;QAChL,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;QAClE,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC7B,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC3B,CAAC;IAED,2DAA2D;IAC3D,aAAa,CAAC,OAAiB;QAC7B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBAChD,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;YAC1B,CAAC;QACH,CAAC;QACD,uCAAuC;QACvC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACpC,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;YAC1E,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;YAC1E,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,KAAK,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YACvB,CAAC;QACH,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC3B,CAAC;IAED,uCAAuC;IACvC,eAAe;QACb,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;YACxB,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;QACjC,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACpC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACxB,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC3B,CAAC;IAED,8BAA8B;IAC9B,IAAI;QACF,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QACtE,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;YAC5B,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC;YACxC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC/C,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,qCAAqC;IACrC,IAAI;QACF,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QACtE,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;YAC5B,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC;YACxC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC/C,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;IACnC,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;IACnC,CAAC;IAED,0DAA0D;IAC1D,cAAc;QACZ,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,qBAAqB,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;YACpG,OAAO;QACT,CAAC;QACD,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IAED,8DAA8D;IAE9D,+CAA+C;IACrC,YAAY;QACpB,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACpC,IAAI,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACnD,IAAI,CAAC,eAAe,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,GAAG,CAAC,CAAC;IAC1C,CAAC;IAED,8BAA8B;IACpB,cAAc,CAAC,KAAyB;QAChD,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,QAAQ,CAAC;QACrC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC;QAC/B,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,CAAC,4BAA4B;YAAE,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;IAC1E,CAAC;IAEO,eAAe;QACrB,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAC1B,IAAI,CAAC,4BAA4B,GAAG,IAAI,CAAC;QACzC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACxC,cAAc,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,4BAA4B,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACvE,CAAC;IAED,iCAAiC;IACvB,kBAAkB,CAAC,KAA6B;QACxD,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC7C,IAAI,CAAC,aAAa,EAAE,CAAC;QAErB,+EAA+E;QAC/E,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC5D,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAE3D,IAAI,CAAC,YAAY,IAAI,CAAC,YAAY;YAAE,OAAO;QAE3C,uEAAuE;QACvE,yEAAyE;QACzE,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;QACjF,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,QAAQ,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;QAE/E,gCAAgC;QAChC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAClC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,EAAE,YAAY,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,YAAY,EAAE,YAAY,CAAC,CAC1F,CAAC;QACF,IAAI,MAAM;YAAE,OAAO;QAEnB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;YAC1B,YAAY,EAAE,YAAY;YAC1B,YAAY,EAAE,YAAY;YAC1B,YAAY,EAAE,YAAY;YAC1B,YAAY,EAAE,YAAY;SAC3B,CAAC,CAAC;IACL,CAAC;IAED,8EAA8E;IACpE,oBAAoB,CAAC,KAA+B;QAC5D,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAE1B,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;QAC9E,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,6EAA6E;QAC7E,IAAI,KAAK,CAAC,gBAAgB,IAAI,CAAC,KAAK,CAAC,WAAW;YAAE,OAAO;QACzD,IAAI,KAAK,CAAC,gBAAgB,IAAI,CAAC,KAAK,CAAC,WAAW;YAAE,OAAO;QAEzD,IAAI,CAAC,aAAa,EAAE,CAAC;QAErB,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC;QAC1C,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC;QAC1C,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC;QAC1C,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC;QAE1C,wBAAwB;QACxB,IAAI,eAAe,GAAG,eAAe,CAAC;QACtC,IAAI,eAAe,GAAG,eAAe,CAAC;QACtC,IAAI,eAAe,GAAG,eAAe,CAAC;QACtC,IAAI,eAAe,GAAG,eAAe,CAAC;QAEtC,IAAI,KAAK,CAAC,gBAAgB,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;YAChD,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,eAAe,CAAC;YAC9E,eAAe,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,WAAW,EAAE,eAAe,EAAE,QAAQ,CAAC,CAAC;QACrF,CAAC;QAED,IAAI,KAAK,CAAC,gBAAgB,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;YAChD,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,eAAe,CAAC;YAC9E,eAAe,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,WAAW,EAAE,eAAe,EAAE,OAAO,CAAC,CAAC;QACpF,CAAC;QAED,2BAA2B;QAC3B,IAAI,eAAe,KAAK,eAAe;YAAE,OAAO;QAEhD,qBAAqB;QACrB,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CACrC,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC;YAC1B,UAAU,CAAC,CAAC,CAAC,YAAY,EAAE,eAAe,CAAC;YAC3C,UAAU,CAAC,CAAC,CAAC,YAAY,EAAE,eAAe,CAAC,CACjD,CAAC;QACF,IAAI,SAAS;YAAE,OAAO;QAEtB,iCAAiC;QACjC,IAAI,CAAC,YAAY,GAAG,eAAe,CAAC;QACpC,IAAI,CAAC,YAAY,GAAG,eAAe,CAAC;QACpC,IAAI,CAAC,YAAY,GAAG,eAAe,CAAC;QACpC,IAAI,CAAC,YAAY,GAAG,eAAe,CAAC;QAEpC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC;YAC7B,YAAY,EAAE,IAAI,CAAC,EAAE;YACrB,eAAe,EAAE,eAAe;YAChC,eAAe,EAAE,eAAe;YAChC,eAAe,EAAE,eAAe;YAChC,eAAe,EAAE,eAAe;YAChC,eAAe,EAAE,eAAe;YAChC,eAAe,EAAE,eAAe;YAChC,eAAe,EAAE,eAAe;YAChC,eAAe,EAAE,eAAe;SACjC,CAAC,CAAC;QAEH,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC/C,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC3B,CAAC;IAED,yCAAyC;IAC/B,YAAY,CAAC,KAAuB;QAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,KAAM,KAAK,CAAC,IAAe,CAAC,CAAC;QAC7E,IAAI,CAAC,MAAM;YAAE,OAAO;QAEpB,qEAAqE;QACrE,kEAAkE;QAClE,4EAA4E;QAC5E,sDAAsD;QACtD,uEAAuE;QACvE,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE;YAC9B,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC;YACtC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;SACxC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACO,0BAA0B,CAAC,MAA0B;QAC7D,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC,qBAAqB,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,wEAAwE;IAChE,kBAAkB,CAAC,MAA0B,EAAE,YAA0B;QAC/E,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1B,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QAC7D,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC,CAAC;IACrE,CAAC;IAED;;;;;;;OAOG;IACK,qBAAqB;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,qBAAqB,EAAE,CAAC;QACpE,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC;QACpC,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;QAC3E,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;QAE5E,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,mBAAmB,EAAE,GAAG,mBAAmB,CAAC,mBAAmB,CAAC,GAAG,mBAAmB,CAAC,oBAAoB,CAAC;QAC/H,OAAO,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC;IAC1E,CAAC;IAED,kCAAkC;IACxB,iBAAiB,CAAC,KAA4B;QACtD,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,uBAAuB,CAAC;QAEjE,qEAAqE;QACrE,oEAAoE;QACpE,IAAI,cAAc,GAAG,GAAG,EAAE,CAAC;YACzB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC;QAC5C,IAAI,CAAC,qBAAqB,GAAG,KAAK,CAAC,cAAc,IAAI,EAAE,CAAC;QAExD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;YACzB,eAAe,EAAE,IAAI,CAAC,eAAe;YACrC,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;SAClD,CAAC,CAAC;QAEH,kDAAkD;QAClD,2EAA2E;QAC3E,0EAA0E;QAC1E,mCAAmC;QACnC,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7E,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;QACvC,CAAC;aAAM,IAAI,IAAI,CAAC,qBAAqB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnD,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACzF,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7B,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;QAC7C,CAAC;aAAM,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,qBAAqB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxF,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7B,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,4BAA4B;IAClB,YAAY,CAAC,KAAsB;QAC3C,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACxE,IAAI,CAAC,aAAa,EAAE,CAAC;QAErB,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;YAC9D,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,WAAW,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACzC,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;gBAC7D,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;oBAClB,MAAM,EAAE,IAAI,CAAC,EAAE;oBACf,WAAW,EAAE,WAAW;oBACxB,WAAW,EAAE,IAAI,CAAC,QAAQ;iBAC3B,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IAED,8DAA8D;IAEpD,aAAa,CAAC,IAAa;QACnC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC3B,CAAC;IAES,gBAAgB,CAAC,IAAa;QACtC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC3B,CAAC;IAES,eAAe,CAAC,IAAa;QACrC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC3B,CAAC;IAES,gBAAgB,CAAC,OAAgB;QACzC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC3B,CAAC;IAED,8DAA8D;IAEpD,iBAAiB,CAAC,KAAiB,EAAE,IAAc;QAC3D,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAClD,CAAC;IAED,+EAA+E;IACrE,mBAAmB,CAAC,KAAiB,EAAE,IAAoB;QACnE,uEAAuE;QACvE,mEAAmE;QACnE,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC1C,IAAI,CAAC,qBAAqB,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;QAC1B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC3B,CAAC;IAES,uBAAuB,CAAC,KAAiB,EAAE,IAAoB;QACvE,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACxD,CAAC;IAES,mBAAmB,CAAC,MAA6B;QACzD,iFAAiF;QACjF,8FAA8F;QAC9F,gGAAgG;QAChG,MAAM,UAAU,GAAG,IAAI,CAAC,qBAAqB,CAAC;QAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC;QAClC,MAAM,UAAU,GAAG,IAAI,CAAC,qBAAqB,CAAC;QAE9C,IAAI,CAAC,eAAe,EAAE,CAAC;QAEvB,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACxC,IAAI,UAAU,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC;gBAClC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpC,CAAC;iBAAM,IAAI,UAAU,KAAK,YAAY,IAAI,UAAU,EAAE,CAAC;gBACrD,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAChD,CAAC;QACH,CAAC;aAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;YACjD,IAAI,UAAU,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC;gBAClC,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC/B,CAAC;iBAAM,IAAI,UAAU,KAAK,YAAY,IAAI,UAAU,EAAE,CAAC;gBACrD,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;QAED,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAC9B,IAAI,mCAAmC,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,CAAC,CAC9E,CAAC;IACJ,CAAC;IAGS,eAAe;QACvB,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC5B,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,CAAC;IACH,CAAC;IAEO,eAAe,CACrB,KAAiB,EACjB,UAAiC,EACjC,IAAqB,EACrB,UAAiC;QAEjC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,uBAAuB,CAAC,UAAU,CAAC,CAAC;QAC1E,MAAM,MAAM,GAAG,IAAI,8BAA8B,CAAC,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;QACjG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAEvD,IAAI,CAAC,qBAAqB,GAAG,UAAU,CAAC;QACxC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,qBAAqB,GAAG,UAAU,CAAC;QACxC,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,KAAK,CAAC;QACrC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC;QAClC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC;QAClC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QAC/B,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC3B,CAAC;IAEO,eAAe;QACrB,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;QAChC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;QAClC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC3B,CAAC;IAEO,cAAc,CAAC,MAAc;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;QAC5D,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;QAE/D,8CAA8C;QAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CACtC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,EAAE,MAAM,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,YAAY,EAAE,MAAM,CAAC,CAC9E,CAAC;QACF,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CACxC,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,EAAE,MAAM,CAAC,CAChF,CAAC;QACF,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC/C,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC3B,CAAC;IAEO,oBAAoB,CAAC,MAAc;QACzC,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;QAClE,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;QAC3E,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC/C,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC3B,CAAC;IAED,8DAA8D;IAGpD,SAAS,CAAC,KAAoB;QACtC,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAE1B,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC;QAEpD,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,EAAE,CAAC;YACxD,6CAA6C;YAC7C,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB,CAAC;YAC3C,IAAI,MAAM,CAAC,OAAO,KAAK,OAAO,IAAI,MAAM,CAAC,OAAO,KAAK,UAAU,IAAI,MAAM,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;gBAC/F,OAAO;YACT,CAAC;YACD,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,CAAC;aAAM,IAAI,YAAY,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YAChE,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,CAAC;aAAM,IAAI,YAAY,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;YACxF,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,CAAC;aAAM,IAAI,YAAY,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;YAC7C,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,+DAA+D;IAErD,aAAa,CAAC,MAAc,EAAE,IAAc;QACpD,OAAO,IAAI,CAAC,EAAE,CAAC;IACjB,CAAC;IAES,mBAAmB,CAAC,MAAc,EAAE,IAAoB;QAChE,OAAO,IAAI,CAAC,EAAE,CAAC;IACjB,CAAC;IAED,8DAA8D;IAE9D,aAAa,CAAC,IAAY;QACxB,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,CAAC;IAC7D,CAAC;IAED,oEAAoE;IACpE,kBAAkB,CAAC,IAAwB;QACzC,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,MAAM,CAAC,CAAC,OAAO,MAAM,CAAC;YAC3B,KAAK,OAAO,CAAC,CAAC,OAAO,OAAO,CAAC;YAC7B,KAAK,KAAK,CAAC,CAAC,OAAO,KAAK,CAAC;YACzB,KAAK,QAAQ,CAAC,CAAC,OAAO,QAAQ,CAAC;YAC/B,OAAO,CAAC,CAAC,OAAO,MAAM,CAAC;QACzB,CAAC;IACH,CAAC;IAED,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC;IACzE,CAAC;IAEO,aAAa;QACnB,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAC5D,CAAC;IAEO,eAAe,CAAC,KAAa;QACnC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC;QACzC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC3B,CAAC;IAEO,gBAAgB,CAAC,MAAc;QACrC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBAC9B,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC;oBAChC,OAAO,IAAI,CAAC,EAAE,CAAC;gBACjB,CAAC;YACH,CAAC;QACH,CAAC;QACD,qEAAqE;QACrE,sEAAsE;QACtE,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;QACnE,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,WAAW,CAAC,EAAE,CAAC;QACxB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACK,aAAa,CAAC,KAAa,EAAE,MAAc,EAAE,SAA6B;QAChF,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;QAC5D,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QAExB,iEAAiE;QACjE,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;QAChE,IAAI,SAAS;YAAE,OAAO,KAAK,CAAC;QAE5B,iEAAiE;QACjE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC;QAChE,OAAO,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;IACtC,CAAC;IAEO,iBAAiB,CAAC,MAA0B,EAAE,QAAsB;QAC1E,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC7B,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI;YAC1C,EAAE,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAgB,EAAE,IAAI,EAAE,KAAc,EAAE,QAAQ,EAAE,IAAI,EAAE;YACxF,EAAE,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,QAAiB,EAAE,IAAI,EAAE,QAAiB,EAAE,QAAQ,EAAE,IAAI,EAAE;SAC9F,CAAC;QAEF,OAAO;YACL,EAAE,EAAE,EAAE;YACN,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,MAAM,EAAE,SAAS;YACjB,QAAQ,EAAE,QAAQ;YAClB,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC5B,GAAG,CAAC;gBACJ,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE;aACjD,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC;IAEO,mBAAmB;QACzB,8BAA8B;QAC9B,MAAM,kBAAkB,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACrH,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9G,KAAK,MAAM,IAAI,IAAI,kBAAkB,EAAE,CAAC;YACtC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC;QAED,8CAA8C;QAC9C,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACnG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAE5F,oDAAoD;QACpD,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAClF,MAAM,mBAAmB,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CACjD,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,IAAI,cAAc,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAC5G,CAAC;QACF,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CACxC,CAAC,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAC9G,CAAC;QAEF,KAAK,MAAM,IAAI,IAAI,mBAAmB,EAAE,CAAC;YACvC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;YAChC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC;QAED,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC/C,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC3B,CAAC;IAEO,UAAU;QAChB,OAAO,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/D,CAAC;6GA/0BU,mBAAmB;6DAAnB,mBAAmB;2BA2EnB,cAAc,KACd,gBAAgB;;;;;;;;YA5EhB,wFAAA,qBAAiB,0BAAE,qFAAnB,qBAAiB,IAAE;k3CAFnB,CAAC,gBAAgB,EAAE,iBAAiB,CAAC;;YC3ClD,8BAAqF;YA8BjF,AANA,AArBF,qFAA6D,kEAqBW,kEAMH;YASrE,8BAAwC;YAGtC,iGAAgC;YAU9B,AAFF,iCACoD,gBAYZ;YAApC,AADA,AADA,AADA,AADA,AADA,0IAAW,kBAAc,KAAC,uJACL,8BAA0B,KAAC,2JACzB,gCAA4B,KAAC,2IACrC,wBAAoB,KAAC,qJAChB,6BAAyB,KAAC,yIAChC,wBAAoB,KAAC;YAGnC,2FAAgB;YAOhB,qGAAiB;YAIjB,wCAM2C;YAAzC,+JAAiB,0BAAsB,KAAC;YAGxC,4GAAiB;YAajB,sHA4CC;YAGD,gHAcC;YAEH,iBAAW;YAGX,iGAAiB;YAKjB,wFAAmB;YAKrB,iBAAS;YAGT,yFAAsC;YA+DtC,wFAA0B;YAc9B,AADE,iBAAM,EACF;YAGN,wFAA0B;YA2B1B,uGAAqB;YAQvB,iBAAM;;YArSsB,wDAA2C;YAGrE,cAiCC;YAjCD,qOAiCC;YAMC,eAKC;YALD,2DAKC;YAIC,cAAiD;YAAjD,8DAAiD;YAE/C,eAA4B;YAI5B,AADA,AADA,AADA,AADA,0CAA4B,+CACc,2BACpB,2BACA,wCACa;YASnC,cAIC;YAJD,uCAIC;YAGD,cAEC;YAFD,yCAEC;YAGC,cAAqB;YAIrB,AADA,AADA,AADA,AADA,mCAAqB,mBACH,kBACD,gCACU,0BACN;YAIrB,eAUC;YAVD,yCAUC;YAGD,cA4CC;YA5CD,8BA4CC;YAGD,eAcC;YAdD,wBAcC;YAKH,eAEC;YAFD,yCAEC;YAGD,cAIC;YAJD,2CAIC;YAIH,cA4DC;YA5DD,kEA4DC;YAGD,cAYC;YAZD,kDAYC;YAKL,cAwBC;YAxBD,kDAwBC;YAGD,cAOC;YAPD,6CAOC;;;iFDvPU,mBAAmB;cAT/B,SAAS;6BACI,KAAK,YACP,gBAAgB,iBAGX,iBAAiB,CAAC,IAAI,mBACpB,uBAAuB,CAAC,OAAO,aACrC,CAAC,gBAAgB,EAAE,iBAAiB,CAAC;;kBAI/C,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBAKL,KAAK;;kBAEL,KAAK;;kBAEL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBAIL,KAAK;;kBAEL,KAAK;;kBAEL,KAAK;;kBAUL,MAAM;;kBACN,MAAM;;kBACN,MAAM;;kBACN,MAAM;;kBACN,MAAM;;kBACN,MAAM;;kBACN,MAAM;;kBACN,MAAM;;kBACN,MAAM;;kBACN,MAAM;;kBACN,MAAM;;kBACN,MAAM;;kBACN,MAAM;;kBACN,MAAM;;kBAEN,MAAM;;kBACN,MAAM;;kBACN,MAAM;;kBACN,MAAM;;kBACN,MAAM;;kBAEN,MAAM;;kBAeN,SAAS;mBAAC,cAAc;;kBACxB,SAAS;mBAAC,gBAAgB;;kBAC1B,SAAS;mBAAC,UAAU;;kBACpB,SAAS;mBAAC,YAAY;;kBAgiBtB,YAAY;mBAAC,gBAAgB;;kBAqE7B,YAAY;mBAAC,SAAS,EAAE,CAAC,QAAQ,CAAC;;kFAnrBxB,mBAAmB;AAk1BhC,SAAS,uBAAuB,CAAC,MAA6B;IAC1D,MAAM,IAAI,GAAG,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC;IACvD,OAAO;QACH,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,IAAI,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE;QAC/D,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,IAAI,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,IAAI,EAAE;KAChF,CAAC;AACN,CAAC","sourcesContent":["import {\n Component, Input, Output, EventEmitter, ViewChild, OnInit, OnDestroy,\n ChangeDetectorRef, ElementRef, ViewEncapsulation, ChangeDetectionStrategy, HostListener\n} from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { FFlowComponent, FCanvasComponent, FZoomDirective, FCreateConnectionEvent,\n FCreateNodeEvent, FSelectionChangeEvent, FCanvasChangeEvent, FMoveNodesEvent,\n FReassignConnectionEvent } from '@foblex/flow';\nimport {\n FlowNode, FlowConnection, FlowNodeTypeConfig, FlowNodeAddedEvent,\n FlowNodeMovedEvent, FlowConnectionCreatedEvent, FlowConnectionReassignedEvent,\n FlowSelectionChangedEvent,\n FlowCanvasClickEvent, FlowPosition, FlowLayoutDirection,\n FlowContextMenuTarget, FlowContextMenuAction, FlowContextMenuItem,\n FlowBeforeContextMenuEventArgs, FlowAfterContextMenuActionEventArgs,\n FlowToolbarAlign, FlowToolbarVisibility,\n} from '../interfaces/flow-types';\nimport { FlowStateService } from '../services/flow-state.service';\nimport { FlowLayoutService } from '../services/flow-layout.service';\nimport { UUIDsEqual, NormalizeUUID } from '@memberjunction/global';\n\n/**\n * Generic, entity-agnostic visual flow editor component.\n * Wraps Foblex Flow to provide a clean MJ-style API.\n *\n * Usage:\n * ```html\n * <mj-flow-editor\n * [Nodes]=\"myNodes\"\n * [Connections]=\"myConnections\"\n * [NodeTypes]=\"myNodeTypes\"\n * (NodeSelected)=\"onNodeSelected($event)\"\n * (ConnectionCreated)=\"onConnectionCreated($event)\">\n * </mj-flow-editor>\n * ```\n */\n@Component({\n standalone: false,\n selector: 'mj-flow-editor',\n templateUrl: './flow-editor.component.html',\n styleUrls: ['./flow-editor.component.css'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.Default,\n providers: [FlowStateService, FlowLayoutService]\n})\nexport class FlowEditorComponent implements OnInit, OnDestroy {\n // ── Inputs ──────────────────────────────────────────────────\n @Input() Nodes: FlowNode[] = [];\n @Input() Connections: FlowConnection[] = [];\n @Input() NodeTypes: FlowNodeTypeConfig[] = [];\n @Input() ReadOnly = false;\n @Input() ShowMinimap = true;\n @Input() ShowPalette = true;\n @Input() ShowGrid = true;\n @Input() ShowStatusBar = true;\n /**\n * Legacy on/off. `false` forces the toolbar fully off (no recover tab). Prefer\n * `ToolbarVisibility` when the host wants shown / minimized / hidden with a way back.\n */\n @Input() ShowToolbar = true;\n /** Full bar, a restore chip, or a recover tab. Ignored when `ShowToolbar` is false. */\n @Input() ToolbarVisibility: FlowToolbarVisibility = 'shown';\n /** Left / center / right along the top of the canvas. */\n @Input() ToolbarAlign: FlowToolbarAlign = 'center';\n @Input() ShowLegend = true;\n @Input() GridSize = 20;\n @Input() AutoLayoutDirection: FlowLayoutDirection = 'vertical';\n /** Background color for connection labels */\n // Design tokens, not literals — the canvas renders on both themes, and a near-white pill on a\n // dark canvas made the least important element the most visually dominant thing on screen.\n @Input() ConnectionLabelBackground = 'var(--mj-bg-surface)';\n /** Border color for connection labels */\n @Input() ConnectionLabelBorderColor = 'var(--mj-border-default)';\n /** Text color for connection labels */\n @Input() ConnectionLabelTextColor = 'var(--mj-text-secondary)';\n\n /** Title for the canvas empty-state overlay — depends on read-only mode. */\n public get EmptyStateTitle(): string {\n return this.ReadOnly\n ? 'No steps defined for this flow'\n : 'Click a step in the palette — or drag one onto the canvas — to start building your flow';\n }\n\n // ── Outputs ─────────────────────────────────────────────────\n @Output() NodeSelected = new EventEmitter<FlowNode | null>();\n @Output() NodeAdded = new EventEmitter<FlowNodeAddedEvent>();\n @Output() NodeRemoved = new EventEmitter<FlowNode>();\n @Output() NodeMoved = new EventEmitter<FlowNodeMovedEvent>();\n @Output() ConnectionCreated = new EventEmitter<FlowConnectionCreatedEvent>();\n @Output() ConnectionRemoved = new EventEmitter<FlowConnection>();\n @Output() ConnectionReassigned = new EventEmitter<FlowConnectionReassignedEvent>();\n @Output() ConnectionSelected = new EventEmitter<FlowConnection | null>();\n @Output() SelectionChanged = new EventEmitter<FlowSelectionChangedEvent>();\n @Output() CanvasClicked = new EventEmitter<FlowCanvasClickEvent>();\n @Output() NodesChanged = new EventEmitter<FlowNode[]>();\n @Output() ConnectionsChanged = new EventEmitter<FlowConnection[]>();\n @Output() NodeEditRequested = new EventEmitter<FlowNode>();\n @Output() ConnectionEditRequested = new EventEmitter<FlowConnection>();\n /** Host may replace `Items` or `Cancel` the menu. Debug attaches here — the canvas stays blind. */\n @Output() BeforeContextMenu = new EventEmitter<FlowBeforeContextMenuEventArgs>();\n @Output() AfterContextMenuAction = new EventEmitter<FlowAfterContextMenuActionEventArgs>();\n @Output() GridToggled = new EventEmitter<boolean>();\n @Output() MinimapToggled = new EventEmitter<boolean>();\n @Output() LegendToggled = new EventEmitter<boolean>();\n /** The person changed shown / minimized / hidden from the canvas chrome. */\n @Output() ToolbarVisibilityChanged = new EventEmitter<FlowToolbarVisibility>();\n\n /** What the template actually paints — `ShowToolbar === false` is a hard hide. */\n public get EffectiveToolbarVisibility(): FlowToolbarVisibility {\n return this.ShowToolbar ? this.ToolbarVisibility : 'hidden';\n }\n\n public SetToolbarVisibility(next: FlowToolbarVisibility): void {\n if (!this.ShowToolbar) return;\n if (this.ToolbarVisibility === next) return;\n this.ToolbarVisibility = next;\n this.ToolbarVisibilityChanged.emit(next);\n }\n\n // ── View Children ───────────────────────────────────────────\n @ViewChild(FFlowComponent) protected fFlow: FFlowComponent | undefined;\n @ViewChild(FCanvasComponent) protected fCanvas: FCanvasComponent | undefined;\n @ViewChild('fZoomRef') protected fZoom: FZoomDirective | undefined;\n @ViewChild('canvasArea') protected canvasArea: ElementRef<HTMLElement> | undefined;\n\n // ── Internal State ──────────────────────────────────────────\n protected zoomLevel = 100;\n protected canvasPosition = { x: 0, y: 0 };\n protected canvasScale = 1;\n /** After the first auto-fit, later fLoaded events must not snap the viewport back. */\n private hasAutoFitted = false;\n /** True once the person zooms or pans — remounts restore this viewport instead of fitting. */\n private viewportOwnedByUser = false;\n private applyingProgrammaticViewport = false;\n protected selectedNodeIDs: string[] = [];\n protected selectedConnectionIDs: string[] = [];\n protected panMode = false;\n\n /** Trigger function for canvas panning — only allows panning in pan mode */\n protected canvasMoveTriggerFn = (_event: MouseEvent | TouchEvent): boolean => {\n return this.panMode;\n };\n\n /* Context menu state */\n protected contextMenuVisible = false;\n protected contextMenuX = 0;\n protected contextMenuY = 0;\n protected contextMenuTargetType: FlowContextMenuTarget = 'node';\n protected contextMenuNode: FlowNode | null = null;\n protected contextMenuConnection: FlowConnection | null = null;\n protected contextMenuItems: FlowContextMenuItem[] = [];\n\n private destroy$ = new Subject<void>();\n private initialized = false;\n private lastConnectionClickTime = 0;\n\n /** How many click-placed nodes are cascaded before the offset wraps back to the viewport centre. */\n private static readonly CLICK_CASCADE_STEPS = 6;\n /** Pixels (canvas units) each cascaded click-placed node is offset by. */\n private static readonly CLICK_CASCADE_OFFSET = 40;\n private clickPlacementIndex = 0;\n\n constructor(\n private cdr: ChangeDetectorRef,\n private stateService: FlowStateService,\n private layoutService: FlowLayoutService\n ) {}\n\n // ── Lifecycle ───────────────────────────────────────────────\n\n ngOnInit(): void {\n this.initialized = true;\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // ── Public Methods ──────────────────────────────────────────\n\n /** Fit all nodes within the viewport */\n ZoomToFit(): void {\n this.applyingProgrammaticViewport = true;\n this.fCanvas?.fitToScreen({ x: 150, y: 150 }, true);\n this.hasAutoFitted = true;\n queueMicrotask(() => { this.applyingProgrammaticViewport = false; });\n }\n\n /** Zoom in one step */\n ZoomIn(): void {\n this.viewportOwnedByUser = true;\n if (this.fZoom) {\n this.fZoom.zoomIn();\n } else {\n const newScale = Math.min(this.canvasScale + 0.15, 3);\n this.fCanvas?.setScale(newScale);\n this.updateZoomLevel(newScale);\n }\n }\n\n /** Zoom out one step */\n ZoomOut(): void {\n this.viewportOwnedByUser = true;\n if (this.fZoom) {\n this.fZoom.zoomOut();\n } else {\n const newScale = Math.max(this.canvasScale - 0.15, 0.1);\n this.fCanvas?.setScale(newScale);\n this.updateZoomLevel(newScale);\n }\n }\n\n /** Run auto-layout using dagre */\n AutoArrange(direction?: FlowLayoutDirection): void {\n const dir = direction ?? this.AutoLayoutDirection;\n this.pushUndoState();\n const result = this.layoutService.CalculateLayout(this.Nodes, this.Connections, dir);\n for (const node of this.Nodes) {\n const newPos = result.Positions.get(node.ID);\n if (newPos) {\n node.Position = { ...newPos };\n }\n }\n this.NodesChanged.emit(this.Nodes);\n this.cdr.detectChanges();\n // Fit to screen after layout\n setTimeout(() => this.ZoomToFit(), 100);\n }\n\n /** Center the canvas on a specific node */\n CenterOnNode(nodeId: string): void {\n this.fCanvas?.centerGroupOrNode(nodeId, true);\n }\n\n /** Programmatically select a node */\n SelectNode(nodeId: string): void {\n this.fFlow?.select([nodeId], []);\n const node = this.Nodes.find(n => UUIDsEqual(n.ID, nodeId)) ?? null;\n this.NodeSelected.emit(node);\n }\n\n /** Clear all selection */\n ClearSelection(): void {\n this.fFlow?.clearSelection();\n this.selectedNodeIDs = [];\n this.selectedConnectionIDs = [];\n this.NodeSelected.emit(null);\n this.ConnectionSelected.emit(null);\n }\n\n /** Update a node's visual status */\n SetNodeStatus(nodeId: string, status: FlowNode['Status'], message?: string): void {\n const node = this.Nodes.find(n => UUIDsEqual(n.ID, nodeId));\n if (node) {\n node.Status = status;\n node.StatusMessage = message;\n this.cdr.detectChanges();\n }\n }\n\n /** Update a node's visual properties and push a new object reference so\n * OnPush child components (FlowNodeComponent) detect the change. */\n UpdateNode(nodeId: string, changes: Partial<Pick<FlowNode, 'Label' | 'Subtitle' | 'Icon' | 'Status' | 'StatusMessage' | 'IsStartNode' | 'Badges' | 'Data'>>): void {\n const idx = this.Nodes.findIndex(n => UUIDsEqual(n.ID, nodeId));\n if (idx === -1) return;\n // Create a new object reference so the OnPush FlowNodeComponent picks up the change\n this.Nodes[idx] = { ...this.Nodes[idx], ...changes };\n this.cdr.detectChanges();\n }\n\n /** Update a connection's visual properties in-place (label, color, style, etc.) */\n UpdateConnection(connId: string, changes: Partial<Pick<FlowConnection, 'Label' | 'LabelIcon' | 'LabelIconColor' | 'LabelDetail' | 'Color' | 'StrokeWidth' | 'Style' | 'Animated'>>): void {\n const conn = this.Connections.find(c => UUIDsEqual(c.ID, connId));\n if (!conn) return;\n Object.assign(conn, changes);\n this.cdr.detectChanges();\n }\n\n /** Highlight a sequence of nodes (e.g., execution path) */\n HighlightPath(nodeIds: string[]): void {\n for (const node of this.Nodes) {\n if (nodeIds.some(id => UUIDsEqual(id, node.ID))) {\n node.Status = 'running';\n }\n }\n // Highlight connections along the path\n for (const conn of this.Connections) {\n const srcIdx = nodeIds.findIndex(id => UUIDsEqual(id, conn.SourceNodeID));\n const tgtIdx = nodeIds.findIndex(id => UUIDsEqual(id, conn.TargetNodeID));\n if (srcIdx >= 0 && tgtIdx >= 0 && tgtIdx === srcIdx + 1) {\n conn.Animated = true;\n }\n }\n this.cdr.detectChanges();\n }\n\n /** Clear all node status highlights */\n ClearHighlights(): void {\n for (const node of this.Nodes) {\n node.Status = 'default';\n node.StatusMessage = undefined;\n }\n for (const conn of this.Connections) {\n conn.Animated = false;\n }\n this.cdr.detectChanges();\n }\n\n /** Undo the last operation */\n Undo(): void {\n const snapshot = this.stateService.Undo(this.Nodes, this.Connections);\n if (snapshot) {\n this.Nodes = snapshot.Nodes;\n this.Connections = snapshot.Connections;\n this.NodesChanged.emit(this.Nodes);\n this.ConnectionsChanged.emit(this.Connections);\n this.cdr.detectChanges();\n }\n }\n\n /** Redo the last undone operation */\n Redo(): void {\n const snapshot = this.stateService.Redo(this.Nodes, this.Connections);\n if (snapshot) {\n this.Nodes = snapshot.Nodes;\n this.Connections = snapshot.Connections;\n this.NodesChanged.emit(this.Nodes);\n this.ConnectionsChanged.emit(this.Connections);\n this.cdr.detectChanges();\n }\n }\n\n get CanUndo(): boolean {\n return this.stateService.CanUndo;\n }\n\n get CanRedo(): boolean {\n return this.stateService.CanRedo;\n }\n\n /** Delete the currently selected nodes and connections */\n DeleteSelected(): void {\n if (this.ReadOnly || (this.selectedNodeIDs.length === 0 && this.selectedConnectionIDs.length === 0)) {\n return;\n }\n this.pushUndoState();\n this.removeSelectedItems();\n this.ClearSelection();\n }\n\n // ── Foblex Event Handlers ──────────────────────────────────\n\n /** Called when Foblex flow finishes loading */\n protected onFlowLoaded(): void {\n if (this.Nodes.length === 0) return;\n if (this.viewportOwnedByUser || this.hasAutoFitted) {\n this.restoreViewport();\n return;\n }\n this.hasAutoFitted = true;\n setTimeout(() => this.ZoomToFit(), 200);\n }\n\n /** Canvas zoom/pan changed */\n protected onCanvasChange(event: FCanvasChangeEvent): void {\n this.canvasPosition = event.position;\n this.canvasScale = event.scale;\n this.updateZoomLevel(event.scale);\n if (!this.applyingProgrammaticViewport) this.viewportOwnedByUser = true;\n }\n\n private restoreViewport(): void {\n if (!this.fCanvas) return;\n this.applyingProgrammaticViewport = true;\n this.fCanvas.setScale(this.canvasScale);\n queueMicrotask(() => { this.applyingProgrammaticViewport = false; });\n }\n\n /** User drew a new connection */\n protected onCreateConnection(event: FCreateConnectionEvent): void {\n if (!event.fInputId || this.ReadOnly) return;\n this.pushUndoState();\n\n // Derive node IDs from port IDs (ports are named nodeID-input / nodeID-output)\n const sourceNodeID = this.findNodeByPortId(event.fOutputId);\n const targetNodeID = this.findNodeByPortId(event.fInputId);\n\n if (!sourceNodeID || !targetNodeID) return;\n\n // Resolve actual port IDs — when fConnectOnNode is enabled, Foblex may\n // send the node ID itself instead of a port ID. Map to the correct port.\n const sourcePortID = this.resolvePortId(event.fOutputId, sourceNodeID, 'output');\n const targetPortID = this.resolvePortId(event.fInputId, targetNodeID, 'input');\n\n // Prevent duplicate connections\n const exists = this.Connections.some(\n c => UUIDsEqual(c.SourcePortID, sourcePortID) && UUIDsEqual(c.TargetPortID, targetPortID)\n );\n if (exists) return;\n\n this.ConnectionCreated.emit({\n SourceNodeID: sourceNodeID,\n SourcePortID: sourcePortID,\n TargetNodeID: targetNodeID,\n TargetPortID: targetPortID\n });\n }\n\n /** User reassigned (dragged) an existing connection endpoint to a new node */\n protected onReassignConnection(event: FReassignConnectionEvent): void {\n if (this.ReadOnly) return;\n\n const conn = this.Connections.find(c => UUIDsEqual(c.ID, event.connectionId));\n if (!conn) return;\n\n // If dropped on empty space (no new target/source), discard the reassignment\n if (event.isTargetReassign && !event.newTargetId) return;\n if (event.isSourceReassign && !event.newSourceId) return;\n\n this.pushUndoState();\n\n const oldSourceNodeID = conn.SourceNodeID;\n const oldSourcePortID = conn.SourcePortID;\n const oldTargetNodeID = conn.TargetNodeID;\n const oldTargetPortID = conn.TargetPortID;\n\n // Resolve new endpoints\n let newSourceNodeID = oldSourceNodeID;\n let newSourcePortID = oldSourcePortID;\n let newTargetNodeID = oldTargetNodeID;\n let newTargetPortID = oldTargetPortID;\n\n if (event.isSourceReassign && event.newSourceId) {\n newSourceNodeID = this.findNodeByPortId(event.newSourceId) ?? oldSourceNodeID;\n newSourcePortID = this.resolvePortId(event.newSourceId, newSourceNodeID, 'output');\n }\n\n if (event.isTargetReassign && event.newTargetId) {\n newTargetNodeID = this.findNodeByPortId(event.newTargetId) ?? oldTargetNodeID;\n newTargetPortID = this.resolvePortId(event.newTargetId, newTargetNodeID, 'input');\n }\n\n // Prevent self-connections\n if (newSourceNodeID === newTargetNodeID) return;\n\n // Prevent duplicates\n const duplicate = this.Connections.some(\n c => !UUIDsEqual(c.ID, conn.ID) &&\n UUIDsEqual(c.SourcePortID, newSourcePortID) &&\n UUIDsEqual(c.TargetPortID, newTargetPortID)\n );\n if (duplicate) return;\n\n // Update the connection in-place\n conn.SourceNodeID = newSourceNodeID;\n conn.SourcePortID = newSourcePortID;\n conn.TargetNodeID = newTargetNodeID;\n conn.TargetPortID = newTargetPortID;\n\n this.ConnectionReassigned.emit({\n ConnectionID: conn.ID,\n OldSourceNodeID: oldSourceNodeID,\n OldSourcePortID: oldSourcePortID,\n OldTargetNodeID: oldTargetNodeID,\n OldTargetPortID: oldTargetPortID,\n NewSourceNodeID: newSourceNodeID,\n NewSourcePortID: newSourcePortID,\n NewTargetNodeID: newTargetNodeID,\n NewTargetPortID: newTargetPortID\n });\n\n this.ConnectionsChanged.emit(this.Connections);\n this.cdr.detectChanges();\n }\n\n /** External item dropped from palette */\n protected onCreateNode(event: FCreateNodeEvent): void {\n const config = this.NodeTypes.find(nt => nt.Type === (event.data as string));\n if (!config) return;\n\n // event.rect is already normalized to canvas coordinates by Foblex's\n // GetNormalizedElementRectExecution (via RoundedRect.fromCenter).\n // Do NOT pass it through getPositionInFlow() again — that double-normalizes\n // and places the node far from the actual drop point.\n // Use the center of the preview rect (≈ cursor position at drop time).\n this.addNodeFromPalette(config, {\n X: event.rect.x + event.rect.width / 2,\n Y: event.rect.y + event.rect.height / 2\n });\n }\n\n /**\n * A palette entry was clicked (or activated from the keyboard) rather than dragged.\n *\n * Deliberately routed into the SAME `addNodeFromPalette` the drop path uses. A separate\n * click-only creation path would be a second way for a node to come into existence, and the two\n * would drift — which is exactly the failure this fixes, one level up.\n */\n protected onPaletteNodeTypeActivated(config: FlowNodeTypeConfig): void {\n this.addNodeFromPalette(config, this.nextClickDropPosition());\n }\n\n /** The one place a palette-originated node is created and announced. */\n private addNodeFromPalette(config: FlowNodeTypeConfig, dropPosition: FlowPosition): void {\n if (this.ReadOnly) return;\n this.pushUndoState();\n const newNode = this.createDefaultNode(config, dropPosition);\n this.NodeAdded.emit({ Node: newNode, DropPosition: dropPosition });\n }\n\n /**\n * Where a clicked step lands: the middle of what the author is currently looking at, cascaded so\n * consecutive clicks don't bury each other under one box.\n *\n * A click carries no coordinates, so *some* position has to be invented. The viewport centre is\n * the only choice that is guaranteed on screen at any zoom or pan — placing at the canvas origin\n * would drop steps off-screen the moment the author has scrolled anywhere.\n */\n private nextClickDropPosition(): FlowPosition {\n const rect = this.canvasArea?.nativeElement.getBoundingClientRect();\n const scale = this.canvasScale || 1;\n const centerX = ((rect?.width ?? 800) / 2 - this.canvasPosition.x) / scale;\n const centerY = ((rect?.height ?? 600) / 2 - this.canvasPosition.y) / scale;\n\n const step = (this.clickPlacementIndex++ % FlowEditorComponent.CLICK_CASCADE_STEPS) * FlowEditorComponent.CLICK_CASCADE_OFFSET;\n return { X: Math.round(centerX + step), Y: Math.round(centerY + step) };\n }\n\n /** Selection changed in Foblex */\n protected onSelectionChange(event: FSelectionChangeEvent): void {\n const timeSinceClick = Date.now() - this.lastConnectionClickTime;\n\n // If a direct connection click just fired, skip this Foblex callback\n // to avoid double-processing / overwriting the direct click result.\n if (timeSinceClick < 200) {\n return;\n }\n\n this.selectedNodeIDs = event.fNodeIds ?? [];\n this.selectedConnectionIDs = event.fConnectionIds ?? [];\n\n this.SelectionChanged.emit({\n SelectedNodeIDs: this.selectedNodeIDs,\n SelectedConnectionIDs: this.selectedConnectionIDs\n });\n\n // Emit specific node/connection selection events.\n // IMPORTANT: When selecting a connection, emit NodeSelected(null) FIRST so\n // that consumers clear their node state before the connection event opens\n // the connection properties panel.\n if (this.selectedNodeIDs.length === 1) {\n const node = this.Nodes.find(n => UUIDsEqual(n.ID, this.selectedNodeIDs[0]));\n this.ConnectionSelected.emit(null);\n this.NodeSelected.emit(node ?? null);\n } else if (this.selectedConnectionIDs.length === 1) {\n const conn = this.Connections.find(c => UUIDsEqual(c.ID, this.selectedConnectionIDs[0]));\n this.NodeSelected.emit(null);\n this.ConnectionSelected.emit(conn ?? null);\n } else if (this.selectedNodeIDs.length === 0 && this.selectedConnectionIDs.length === 0) {\n this.NodeSelected.emit(null);\n this.ConnectionSelected.emit(null);\n }\n }\n\n /** Nodes moved on canvas */\n protected onNodesMoved(event: FMoveNodesEvent): void {\n if (this.ReadOnly || !event.fNodes || event.fNodes.length === 0) return;\n this.pushUndoState();\n\n for (const moved of event.fNodes) {\n const node = this.Nodes.find(n => UUIDsEqual(n.ID, moved.id));\n if (node) {\n const oldPosition = { ...node.Position };\n node.Position = { X: moved.position.x, Y: moved.position.y };\n this.NodeMoved.emit({\n NodeID: node.ID,\n OldPosition: oldPosition,\n NewPosition: node.Position\n });\n }\n }\n this.NodesChanged.emit(this.Nodes);\n }\n\n // ── Toolbar Event Handlers ─────────────────────────────────\n\n protected onGridToggled(show: boolean): void {\n this.ShowGrid = show;\n this.GridToggled.emit(show);\n this.cdr.detectChanges();\n }\n\n protected onMinimapToggled(show: boolean): void {\n this.ShowMinimap = show;\n this.MinimapToggled.emit(show);\n this.cdr.detectChanges();\n }\n\n protected onLegendToggled(show: boolean): void {\n this.ShowLegend = show;\n this.LegendToggled.emit(show);\n this.cdr.detectChanges();\n }\n\n protected onPanModeToggled(enabled: boolean): void {\n this.panMode = enabled;\n this.cdr.detectChanges();\n }\n\n // ── Context Menu ───────────────────────────────────────────\n\n protected onNodeContextMenu(event: MouseEvent, node: FlowNode): void {\n event.preventDefault();\n event.stopPropagation();\n this.openContextMenu(event, 'node', node, null);\n }\n\n /** Direct click on a connection — ensures ConnectionSelected fires reliably */\n protected onConnectionClicked(event: MouseEvent, conn: FlowConnection): void {\n // Do NOT stopPropagation — let Foblex handle its own visual selection.\n // Record the time so onSelectionChange can skip double-processing.\n this.lastConnectionClickTime = Date.now();\n this.selectedConnectionIDs = [conn.ID];\n this.selectedNodeIDs = [];\n this.NodeSelected.emit(null);\n this.ConnectionSelected.emit(conn);\n this.cdr.detectChanges();\n }\n\n protected onConnectionContextMenu(event: MouseEvent, conn: FlowConnection): void {\n event.preventDefault();\n event.stopPropagation();\n this.openContextMenu(event, 'connection', null, conn);\n }\n\n protected onContextMenuAction(action: FlowContextMenuAction): void {\n // Capture the target BEFORE closing: hideContextMenu() nulls contextMenuNode and\n // contextMenuConnection, so reading them afterwards found nothing and every branch below fell\n // through — the menu closed and neither Remove nor Edit did anything, for nodes or connections.\n const targetType = this.contextMenuTargetType;\n const node = this.contextMenuNode;\n const connection = this.contextMenuConnection;\n\n this.hideContextMenu();\n\n if (!this.ReadOnly && action === 'edit') {\n if (targetType === 'node' && node) {\n this.NodeEditRequested.emit(node);\n } else if (targetType === 'connection' && connection) {\n this.ConnectionEditRequested.emit(connection);\n }\n } else if (!this.ReadOnly && action === 'remove') {\n if (targetType === 'node' && node) {\n this.pushUndoState();\n this.removeNodeById(node.ID);\n } else if (targetType === 'connection' && connection) {\n this.pushUndoState();\n this.removeConnectionById(connection.ID);\n }\n }\n\n this.AfterContextMenuAction.emit(\n new FlowAfterContextMenuActionEventArgs(action, targetType, node, connection),\n );\n }\n\n @HostListener('document:click')\n protected onDocumentClick(): void {\n if (this.contextMenuVisible) {\n this.hideContextMenu();\n }\n }\n\n private openContextMenu(\n event: MouseEvent,\n targetType: FlowContextMenuTarget,\n node: FlowNode | null,\n connection: FlowConnection | null\n ): void {\n const defaults = this.ReadOnly ? [] : defaultContextMenuItems(targetType);\n const before = new FlowBeforeContextMenuEventArgs(targetType, node, connection, event, defaults);\n this.BeforeContextMenu.emit(before);\n if (before.Cancel || before.Items.length === 0) return;\n\n this.contextMenuTargetType = targetType;\n this.contextMenuNode = node;\n this.contextMenuConnection = connection;\n this.contextMenuItems = before.Items;\n this.contextMenuX = event.clientX;\n this.contextMenuY = event.clientY;\n this.contextMenuVisible = true;\n this.cdr.detectChanges();\n }\n\n private hideContextMenu(): void {\n this.contextMenuVisible = false;\n this.contextMenuNode = null;\n this.contextMenuConnection = null;\n this.cdr.detectChanges();\n }\n\n private removeNodeById(nodeId: string): void {\n const node = this.Nodes.find(n => UUIDsEqual(n.ID, nodeId));\n if (!node) return;\n\n this.Nodes = this.Nodes.filter(n => !UUIDsEqual(n.ID, nodeId));\n\n /* Remove connections attached to this node */\n const orphaned = this.Connections.filter(\n c => UUIDsEqual(c.SourceNodeID, nodeId) || UUIDsEqual(c.TargetNodeID, nodeId)\n );\n this.Connections = this.Connections.filter(\n c => !UUIDsEqual(c.SourceNodeID, nodeId) && !UUIDsEqual(c.TargetNodeID, nodeId)\n );\n for (const conn of orphaned) {\n this.ConnectionRemoved.emit(conn);\n }\n this.NodeRemoved.emit(node);\n this.NodesChanged.emit(this.Nodes);\n this.ConnectionsChanged.emit(this.Connections);\n this.cdr.detectChanges();\n }\n\n private removeConnectionById(connId: string): void {\n const conn = this.Connections.find(c => UUIDsEqual(c.ID, connId));\n if (!conn) return;\n\n this.Connections = this.Connections.filter(c => !UUIDsEqual(c.ID, connId));\n this.ConnectionRemoved.emit(conn);\n this.ConnectionsChanged.emit(this.Connections);\n this.cdr.detectChanges();\n }\n\n // ── Keyboard Shortcuts ─────────────────────────────────────\n\n @HostListener('keydown', ['$event'])\n protected onKeyDown(event: KeyboardEvent): void {\n if (this.ReadOnly) return;\n\n const isCtrlOrMeta = event.ctrlKey || event.metaKey;\n\n if (event.key === 'Delete' || event.key === 'Backspace') {\n // Don't delete if user is typing in an input\n const target = event.target as HTMLElement;\n if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.tagName === 'SELECT') {\n return;\n }\n event.preventDefault();\n this.DeleteSelected();\n } else if (isCtrlOrMeta && event.key === 'z' && !event.shiftKey) {\n event.preventDefault();\n this.Undo();\n } else if (isCtrlOrMeta && (event.key === 'y' || (event.key === 'z' && event.shiftKey))) {\n event.preventDefault();\n this.Redo();\n } else if (isCtrlOrMeta && event.key === 'a') {\n event.preventDefault();\n this.fFlow?.selectAll();\n }\n }\n\n // ── TrackBy Functions ───────────────────────────────────────\n\n protected trackNodeById(_index: number, node: FlowNode): string {\n return node.ID;\n }\n\n protected trackConnectionById(_index: number, conn: FlowConnection): string {\n return conn.ID;\n }\n\n // ── Helper Methods ─────────────────────────────────────────\n\n GetTypeConfig(type: string): FlowNodeTypeConfig | null {\n return this.NodeTypes.find(nt => nt.Type === type) ?? null;\n }\n\n /** Get the connectable side string for Foblex based on port side */\n GetConnectableSide(side: string | undefined): string {\n switch (side) {\n case 'left': return 'left';\n case 'right': return 'right';\n case 'top': return 'top';\n case 'bottom': return 'bottom';\n default: return 'auto';\n }\n }\n\n get selectedCount(): number {\n return this.selectedNodeIDs.length + this.selectedConnectionIDs.length;\n }\n\n private pushUndoState(): void {\n this.stateService.PushState(this.Nodes, this.Connections);\n }\n\n private updateZoomLevel(scale: number): void {\n this.zoomLevel = Math.round(scale * 100);\n this.cdr.detectChanges();\n }\n\n private findNodeByPortId(portId: string): string | null {\n for (const node of this.Nodes) {\n for (const port of node.Ports) {\n if (UUIDsEqual(port.ID, portId)) {\n return node.ID;\n }\n }\n }\n // When fConnectOnNode is enabled, Foblex may send the node ID itself\n // instead of a port ID. Check for a direct node ID match as fallback.\n const directMatch = this.Nodes.find(n => UUIDsEqual(n.ID, portId));\n if (directMatch) {\n return directMatch.ID;\n }\n return null;\n }\n\n /**\n * When fConnectOnNode is enabled, Foblex may send a node ID instead of a port ID.\n * This resolves the raw ID to the correct port ID for the given direction.\n */\n private resolvePortId(rawId: string, nodeId: string, direction: 'input' | 'output'): string {\n const node = this.Nodes.find(n => UUIDsEqual(n.ID, nodeId));\n if (!node) return rawId;\n\n // If the rawId already matches a port on this node, use it as-is\n const exactPort = node.Ports.find(p => UUIDsEqual(p.ID, rawId));\n if (exactPort) return rawId;\n\n // Otherwise, find the first port matching the expected direction\n const dirPort = node.Ports.find(p => p.Direction === direction);\n return dirPort ? dirPort.ID : rawId;\n }\n\n private createDefaultNode(config: FlowNodeTypeConfig, position: FlowPosition): FlowNode {\n const id = this.generateId();\n const defaultPorts = config.DefaultPorts ?? [\n { ID: `${id}-input`, Direction: 'input' as const, Side: 'top' as const, Multiple: true },\n { ID: `${id}-output`, Direction: 'output' as const, Side: 'bottom' as const, Multiple: true }\n ];\n\n return {\n ID: id,\n Type: config.Type,\n Label: config.Label,\n Icon: config.Icon,\n Status: 'default',\n Position: position,\n Ports: defaultPorts.map(p => ({\n ...p,\n ID: p.ID.startsWith(id) ? p.ID : `${id}-${p.ID}`\n }))\n };\n }\n\n private removeSelectedItems(): void {\n // Remove selected connections\n const removedConnections = this.Connections.filter(c => this.selectedConnectionIDs.some(id => UUIDsEqual(id, c.ID)));\n this.Connections = this.Connections.filter(c => !this.selectedConnectionIDs.some(id => UUIDsEqual(id, c.ID)));\n for (const conn of removedConnections) {\n this.ConnectionRemoved.emit(conn);\n }\n\n // Remove selected nodes and their connections\n const removedNodes = this.Nodes.filter(n => this.selectedNodeIDs.some(id => UUIDsEqual(id, n.ID)));\n this.Nodes = this.Nodes.filter(n => !this.selectedNodeIDs.some(id => UUIDsEqual(id, n.ID)));\n\n // Also remove connections attached to deleted nodes\n const deletedNodeIDs = new Set(this.selectedNodeIDs.map(id => NormalizeUUID(id)));\n const orphanedConnections = this.Connections.filter(\n c => deletedNodeIDs.has(NormalizeUUID(c.SourceNodeID)) || deletedNodeIDs.has(NormalizeUUID(c.TargetNodeID))\n );\n this.Connections = this.Connections.filter(\n c => !deletedNodeIDs.has(NormalizeUUID(c.SourceNodeID)) && !deletedNodeIDs.has(NormalizeUUID(c.TargetNodeID))\n );\n\n for (const conn of orphanedConnections) {\n this.ConnectionRemoved.emit(conn);\n }\n for (const node of removedNodes) {\n this.NodeRemoved.emit(node);\n }\n\n this.NodesChanged.emit(this.Nodes);\n this.ConnectionsChanged.emit(this.Connections);\n this.cdr.detectChanges();\n }\n\n private generateId(): string {\n return 'flow-' + Math.random().toString(36).substring(2, 11);\n }\n}\n\nfunction defaultContextMenuItems(target: FlowContextMenuTarget): FlowContextMenuItem[] {\n const noun = target === 'node' ? 'Node' : 'Connection';\n return [\n { ID: 'edit', Label: `Edit ${noun}`, Icon: 'fa-pen-to-square' },\n { ID: 'remove', Label: `Remove ${noun}`, Icon: 'fa-trash-can', Danger: true },\n ];\n}\n","<div class=\"mj-flow-editor\" [class.mj-flow-editor--readonly]=\"ReadOnly\" tabindex=\"0\">\n\n <!-- Canvas Toolbar — shown / minimized / hidden (recover tab). Align is left/center/right. -->\n @if (ShowToolbar && EffectiveToolbarVisibility === 'shown') {\n <div class=\"mj-flow-editor-toolbar-area\" [attr.data-align]=\"ToolbarAlign\">\n <mj-flow-toolbar\n [ZoomLevel]=\"zoomLevel\"\n [ShowGrid]=\"ShowGrid\"\n [ShowMinimap]=\"ShowMinimap\"\n [ShowLegend]=\"ShowLegend\"\n [ReadOnly]=\"ReadOnly\"\n [PanMode]=\"panMode\"\n (ZoomInClicked)=\"ZoomIn()\"\n (ZoomOutClicked)=\"ZoomOut()\"\n (FitToScreenClicked)=\"ZoomToFit()\"\n (AutoLayoutClicked)=\"AutoArrange()\"\n (GridToggled)=\"onGridToggled($event)\"\n (MinimapToggled)=\"onMinimapToggled($event)\"\n (LegendToggled)=\"onLegendToggled($event)\"\n (PanModeToggled)=\"onPanModeToggled($event)\"\n (MinimizeClicked)=\"SetToolbarVisibility('minimized')\"\n (HideClicked)=\"SetToolbarVisibility('hidden')\">\n </mj-flow-toolbar>\n </div>\n } @else if (ShowToolbar && EffectiveToolbarVisibility === 'minimized') {\n <button type=\"button\" class=\"mj-flow-editor-toolbar-chip\" [attr.data-align]=\"ToolbarAlign\"\n (click)=\"SetToolbarVisibility('shown')\"\n title=\"Show canvas tools\" aria-label=\"Show canvas tools\">\n <i class=\"fa-solid fa-wrench\" aria-hidden=\"true\"></i>\n </button>\n } @else if (ShowToolbar && EffectiveToolbarVisibility === 'hidden') {\n <button type=\"button\" class=\"mj-flow-editor-toolbar-tab\" [attr.data-align]=\"ToolbarAlign\"\n (click)=\"SetToolbarVisibility('shown')\"\n title=\"Show canvas tools\" aria-label=\"Show canvas tools\">\n <i class=\"fa-solid fa-ellipsis\" aria-hidden=\"true\"></i>\n </button>\n }\n\n <!-- Main Canvas Area -->\n <div class=\"mj-flow-editor-canvas-area\">\n\n <!-- Palette Sidebar -->\n @if (ShowPalette && !ReadOnly) {\n <mj-flow-palette\n [NodeTypes]=\"NodeTypes\"\n (NodeTypeActivated)=\"onPaletteNodeTypeActivated($event)\">\n </mj-flow-palette>\n }\n\n <!-- Foblex Canvas -->\n <div class=\"mj-flow-editor-canvas\" #canvasArea\n [class.mj-flow-editor-canvas--pan-mode]=\"panMode\">\n <f-flow fDraggable\n [fDraggableDisabled]=\"false\"\n [fCanvasMoveTrigger]=\"canvasMoveTriggerFn\"\n [vCellSize]=\"GridSize\"\n [hCellSize]=\"GridSize\"\n [fCellSizeWhileDragging]=\"ShowGrid\"\n (fLoaded)=\"onFlowLoaded()\"\n (fCreateConnection)=\"onCreateConnection($event)\"\n (fReassignConnection)=\"onReassignConnection($event)\"\n (fCreateNode)=\"onCreateNode($event)\"\n (fSelectionChange)=\"onSelectionChange($event)\"\n (fMoveNodes)=\"onNodesMoved($event)\">\n\n <!-- Background grid — MUST be direct child of f-flow (Foblex content projection requires it) -->\n @if (ShowGrid) {\n <f-background>\n <f-circle-pattern [color]=\"'#94a3b8'\" [radius]=\"24\"></f-circle-pattern>\n </f-background>\n }\n\n <!-- Alignment snap lines — direct child of f-flow -->\n @if (!ReadOnly) {\n <f-line-alignment [fAlignThreshold]=\"10\"></f-line-alignment>\n }\n\n <f-canvas fZoom #fZoomRef=\"fComponent\"\n [fZoomMinimum]=\"0.15\"\n [fZoomMaximum]=\"3\"\n [fZoomStep]=\"0.1\"\n [position]=\"canvasPosition\"\n [scale]=\"canvasScale\"\n (fCanvasChange)=\"onCanvasChange($event)\">\n\n <!-- Interactive connection drawing -->\n @if (!ReadOnly) {\n <f-connection-for-create\n fType=\"bezier\"\n [fRadius]=\"8\"\n [fOffset]=\"12\">\n <svg viewBox=\"0 0 10 10\" fMarker type=\"end\"\n orient=\"auto\" [refX]=\"9\" [refY]=\"5\" [height]=\"10\" [width]=\"10\">\n <path d=\"M0 0L10 5L0 10Z\" fill=\"#94a3b8\"/>\n </svg>\n </f-connection-for-create>\n }\n\n <!-- Connections -->\n @for (conn of Connections; track trackConnectionById($index, conn)) {\n <f-connection\n [fConnectionId]=\"conn.ID\"\n [fOutputId]=\"conn.SourcePortID\"\n [fInputId]=\"conn.TargetPortID\"\n fType=\"bezier\"\n fBehavior=\"fixed\"\n [fRadius]=\"8\"\n [fOffset]=\"12\"\n [fSelectionDisabled]=\"false\"\n [fReassignDisabled]=\"ReadOnly\"\n [style.--connection-color]=\"conn.Color || '#94a3b8'\"\n [style.--connection-width.px]=\"conn.StrokeWidth || 2\"\n [class.mj-flow-connection-colored]=\"!!conn.Color\"\n [class.mj-flow-connection-dashed]=\"conn.Style === 'dashed'\"\n [class.mj-flow-connection-dotted]=\"conn.Style === 'dotted'\"\n [class.mj-flow-connection-animated]=\"!!conn.Animated\"\n (click)=\"onConnectionClicked($event, conn)\"\n (contextmenu)=\"onConnectionContextMenu($event, conn)\">\n <!-- Arrow marker -->\n <svg viewBox=\"0 0 10 10\" fMarker type=\"end\"\n orient=\"auto\" [refX]=\"9\" [refY]=\"5\"\n [height]=\"conn.Animated ? 16 : 10\"\n [width]=\"conn.Animated ? 16 : 10\">\n <path d=\"M0 0L10 5L0 10Z\" [attr.fill]=\"conn.Color || '#94a3b8'\"/>\n </svg>\n <!-- Connection label -->\n @if (conn.Label) {\n <div fConnectionContent [position]=\"0.5\"\n class=\"mj-flow-connection-label\"\n [style.backgroundColor]=\"ConnectionLabelBackground\"\n [style.borderColor]=\"ConnectionLabelBorderColor\"\n [style.color]=\"ConnectionLabelTextColor\"\n [title]=\"conn.LabelDetail || conn.Label || ''\">\n @if (conn.LabelIcon) {\n <i\n class=\"fa-solid mj-flow-connection-label-icon\"\n [ngClass]=\"conn.LabelIcon\"\n [style.color]=\"conn.LabelIconColor || 'inherit'\"></i>\n }\n {{ conn.Label }}\n </div>\n }\n </f-connection>\n }\n\n <!-- Nodes -->\n @for (node of Nodes; track trackNodeById($index, node)) {\n <mj-flow-node\n fNode\n fDragHandle\n [fNodeId]=\"node.ID\"\n [fNodePosition]=\"{ x: node.Position.X, y: node.Position.Y }\"\n [fNodeDraggingDisabled]=\"ReadOnly || panMode || node.Locked === true\"\n [fNodeSelectionDisabled]=\"panMode\"\n [fConnectOnNode]=\"!ReadOnly && !panMode\"\n [Node]=\"node\"\n [TypeConfig]=\"GetTypeConfig(node.Type)\"\n [ReadOnly]=\"ReadOnly\"\n (contextmenu)=\"onNodeContextMenu($event, node)\">\n </mj-flow-node>\n }\n\n </f-canvas>\n\n <!-- Rubber-band selection — direct child of f-flow -->\n @if (!ReadOnly) {\n <f-selection-area></f-selection-area>\n }\n\n <!-- Minimap -->\n @if (ShowMinimap) {\n <div class=\"mj-flow-editor-minimap\" fDragBlocker>\n <f-minimap [fMinSize]=\"1500\"></f-minimap>\n </div>\n }\n </f-flow>\n\n <!-- Legend -->\n @if (ShowLegend && Nodes.length > 0) {\n <div class=\"mj-flow-editor-legend\">\n <div class=\"mj-flow-editor-legend-title\">Legend</div>\n <div class=\"mj-flow-editor-legend-section\">\n <div class=\"mj-flow-editor-legend-heading\">Connections</div>\n <div class=\"mj-flow-editor-legend-item\">\n <svg class=\"mj-flow-editor-legend-line-svg\" width=\"28\" height=\"10\"><line x1=\"0\" y1=\"5\" x2=\"28\" y2=\"5\" stroke=\"#64748b\" stroke-width=\"2\"/></svg>\n <span>Only exit path</span>\n </div>\n <div class=\"mj-flow-editor-legend-item\">\n <svg class=\"mj-flow-editor-legend-line-svg\" width=\"28\" height=\"10\"><line x1=\"0\" y1=\"5\" x2=\"28\" y2=\"5\" stroke=\"#16a34a\" stroke-width=\"2\"/></svg>\n <i class=\"fa-solid fa-circle-check\" style=\"color:#16a34a;font-size:10px;\"></i>\n <span>Default (fallback)</span>\n </div>\n <div class=\"mj-flow-editor-legend-item\">\n <svg class=\"mj-flow-editor-legend-line-svg\" width=\"28\" height=\"10\"><line x1=\"0\" y1=\"5\" x2=\"28\" y2=\"5\" stroke=\"#f59e0b\" stroke-width=\"2\" stroke-dasharray=\"5 3\"/></svg>\n <span>Conditional</span>\n </div>\n <div class=\"mj-flow-editor-legend-item\">\n <svg class=\"mj-flow-editor-legend-line-svg\" width=\"28\" height=\"10\"><line x1=\"0\" y1=\"5\" x2=\"28\" y2=\"5\" stroke=\"#ef4444\" stroke-width=\"2\"/></svg>\n <i class=\"fa-solid fa-triangle-exclamation\" style=\"color:#ef4444;font-size:10px;\"></i>\n <span>Duplicate defaults</span>\n </div>\n </div>\n <div class=\"mj-flow-editor-legend-section\">\n <div class=\"mj-flow-editor-legend-heading\">Step Types</div>\n <div class=\"mj-flow-editor-legend-item\">\n <span class=\"mj-flow-editor-legend-swatch\" style=\"background:#3B82F6\"></span>\n <span>Action</span>\n </div>\n <div class=\"mj-flow-editor-legend-item\">\n <span class=\"mj-flow-editor-legend-swatch\" style=\"background:#8B5CF6\"></span>\n <span>Prompt</span>\n </div>\n <div class=\"mj-flow-editor-legend-item\">\n <span class=\"mj-flow-editor-legend-swatch\" style=\"background:#10B981\"></span>\n <span>Sub-Agent</span>\n </div>\n <div class=\"mj-flow-editor-legend-item\">\n <span class=\"mj-flow-editor-legend-swatch\" style=\"background:#F59E0B\"></span>\n <span>For Each</span>\n </div>\n <div class=\"mj-flow-editor-legend-item\">\n <span class=\"mj-flow-editor-legend-swatch\" style=\"background:#F97316\"></span>\n <span>While</span>\n </div>\n </div>\n <div class=\"mj-flow-editor-legend-section\">\n <div class=\"mj-flow-editor-legend-heading\">Borders</div>\n <div class=\"mj-flow-editor-legend-item\">\n <span class=\"mj-flow-editor-legend-box\" style=\"border-color:#16a34a;background:#f0fdf4;\"></span>\n <span>Start node</span>\n </div>\n <div class=\"mj-flow-editor-legend-item\">\n <span class=\"mj-flow-editor-legend-box\" style=\"border-color:#ef4444;background:#fef2f2;\"></span>\n <i class=\"fa-solid fa-triangle-exclamation\" style=\"color:#ea580c;font-size:10px;\"></i>\n <span>Missing config</span>\n </div>\n </div>\n </div>\n }\n\n <!-- Empty state overlay -->\n @if (Nodes.length === 0) {\n <div class=\"mj-flow-editor-empty\">\n <mj-empty-state\n Icon=\"fa-solid fa-diagram-project\"\n [Title]=\"EmptyStateTitle\">\n @if (!ReadOnly) {\n <p class=\"mj-flow-editor-empty-subtitle\">\n Or use auto-layout after adding steps to arrange them automatically\n </p>\n }\n </mj-empty-state>\n </div>\n }\n </div>\n </div>\n\n <!-- Context Menu -->\n @if (contextMenuVisible) {\n <div\n class=\"mj-flow-context-menu\"\n [style.left.px]=\"contextMenuX\"\n [style.top.px]=\"contextMenuY\"\n (click)=\"$event.stopPropagation()\">\n @for (item of contextMenuItems; track item.ID; let last = $last) {\n <button type=\"button\" class=\"mj-flow-context-menu-item\"\n [class.mj-flow-context-menu-item--danger]=\"item.Danger\"\n [disabled]=\"item.Disabled\"\n (click)=\"onContextMenuAction(item.ID)\">\n @if (item.Icon) {\n <i class=\"fa-solid\" [ngClass]=\"item.Icon\"></i>\n }\n <span>{{ item.Label }}</span>\n @if (item.Shortcut) {\n <kbd class=\"mj-flow-context-menu-shortcut\">{{ item.Shortcut }}</kbd>\n }\n </button>\n @if (!last && item.Danger !== contextMenuItems[$index + 1]?.Danger) {\n <div class=\"mj-flow-context-menu-divider\"></div>\n }\n }\n </div>\n }\n\n <!-- Status Bar -->\n @if (ShowStatusBar) {\n <mj-flow-status-bar\n [NodeCount]=\"Nodes.length\"\n [ConnectionCount]=\"Connections.length\"\n [SelectedCount]=\"selectedCount\"\n [ZoomLevel]=\"zoomLevel\">\n </mj-flow-status-bar>\n }\n</div>\n"]}
1
+ {"version":3,"file":"flow-editor.component.js","sourceRoot":"","sources":["../../../src/lib/components/flow-editor.component.ts","../../../src/lib/components/flow-editor.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component, Input, Output, EventEmitter, ViewChild, OnInit, OnDestroy,\n ChangeDetectorRef, ElementRef, ViewEncapsulation, ChangeDetectionStrategy, HostListener\n} from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { FFlowComponent, FCanvasComponent, FZoomDirective, FCreateConnectionEvent,\n FCreateNodeEvent, FSelectionChangeEvent, FCanvasChangeEvent, FMoveNodesEvent,\n FReassignConnectionEvent } from '@foblex/flow';\nimport {\n FlowNode, FlowConnection, FlowNodeTypeConfig, FlowNodeAddedEvent,\n FlowNodeMovedEvent, FlowConnectionCreatedEvent, FlowConnectionReassignedEvent,\n FlowSelectionChangedEvent,\n FlowCanvasClickEvent, FlowPosition, FlowLayoutDirection,\n FlowContextMenuTarget, FlowContextMenuAction, FlowContextMenuItem,\n FlowBeforeContextMenuEventArgs, FlowAfterContextMenuActionEventArgs,\n FlowToolbarAlign, FlowToolbarVisibility,\n} from '../interfaces/flow-types';\nimport { FlowStateService } from '../services/flow-state.service';\nimport { FlowLayoutService } from '../services/flow-layout.service';\nimport { UUIDsEqual, NormalizeUUID } from '@memberjunction/global';\n\n/**\n * Generic, entity-agnostic visual flow editor component.\n * Wraps Foblex Flow to provide a clean MJ-style API.\n *\n * Usage:\n * ```html\n * <mj-flow-editor\n * [Nodes]=\"myNodes\"\n * [Connections]=\"myConnections\"\n * [NodeTypes]=\"myNodeTypes\"\n * (NodeSelected)=\"onNodeSelected($event)\"\n * (ConnectionCreated)=\"onConnectionCreated($event)\">\n * </mj-flow-editor>\n * ```\n */\n@Component({\n standalone: false,\n selector: 'mj-flow-editor',\n templateUrl: './flow-editor.component.html',\n styleUrls: ['./flow-editor.component.css'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.Default,\n providers: [FlowStateService, FlowLayoutService]\n})\nexport class FlowEditorComponent implements OnInit, OnDestroy {\n // ── Inputs ──────────────────────────────────────────────────\n @Input() Nodes: FlowNode[] = [];\n @Input() Connections: FlowConnection[] = [];\n @Input() NodeTypes: FlowNodeTypeConfig[] = [];\n @Input() ReadOnly = false;\n @Input() ShowMinimap = true;\n @Input() ShowPalette = true;\n @Input() ShowGrid = true;\n @Input() ShowStatusBar = true;\n /**\n * Legacy on/off. `false` forces the toolbar fully off (no recover tab). Prefer\n * `ToolbarVisibility` when the host wants shown / minimized / hidden with a way back.\n */\n @Input() ShowToolbar = true;\n /** Full bar, a restore chip, or a recover tab. Ignored when `ShowToolbar` is false. */\n @Input() ToolbarVisibility: FlowToolbarVisibility = 'shown';\n /** Left / center / right along the top of the canvas. */\n @Input() ToolbarAlign: FlowToolbarAlign = 'center';\n @Input() ShowLegend = true;\n @Input() GridSize = 20;\n @Input() AutoLayoutDirection: FlowLayoutDirection = 'vertical';\n /** Background color for connection labels */\n // Design tokens, not literals — the canvas renders on both themes, and a near-white pill on a\n // dark canvas made the least important element the most visually dominant thing on screen.\n @Input() ConnectionLabelBackground = 'var(--mj-bg-surface)';\n /** Border color for connection labels */\n @Input() ConnectionLabelBorderColor = 'var(--mj-border-default)';\n /** Text color for connection labels */\n @Input() ConnectionLabelTextColor = 'var(--mj-text-secondary)';\n\n /** Title for the canvas empty-state overlay — depends on read-only mode. */\n public get EmptyStateTitle(): string {\n return this.ReadOnly\n ? 'No steps defined for this flow'\n : 'Click a step in the palette — or drag one onto the canvas — to start building your flow';\n }\n\n // ── Outputs ─────────────────────────────────────────────────\n @Output() NodeSelected = new EventEmitter<FlowNode | null>();\n @Output() NodeAdded = new EventEmitter<FlowNodeAddedEvent>();\n @Output() NodeRemoved = new EventEmitter<FlowNode>();\n @Output() NodeMoved = new EventEmitter<FlowNodeMovedEvent>();\n @Output() ConnectionCreated = new EventEmitter<FlowConnectionCreatedEvent>();\n @Output() ConnectionRemoved = new EventEmitter<FlowConnection>();\n @Output() ConnectionReassigned = new EventEmitter<FlowConnectionReassignedEvent>();\n @Output() ConnectionSelected = new EventEmitter<FlowConnection | null>();\n @Output() SelectionChanged = new EventEmitter<FlowSelectionChangedEvent>();\n @Output() CanvasClicked = new EventEmitter<FlowCanvasClickEvent>();\n @Output() NodesChanged = new EventEmitter<FlowNode[]>();\n @Output() ConnectionsChanged = new EventEmitter<FlowConnection[]>();\n @Output() NodeEditRequested = new EventEmitter<FlowNode>();\n @Output() ConnectionEditRequested = new EventEmitter<FlowConnection>();\n /** Host may replace `Items` or `Cancel` the menu. Debug attaches here — the canvas stays blind. */\n @Output() BeforeContextMenu = new EventEmitter<FlowBeforeContextMenuEventArgs>();\n @Output() AfterContextMenuAction = new EventEmitter<FlowAfterContextMenuActionEventArgs>();\n @Output() GridToggled = new EventEmitter<boolean>();\n @Output() MinimapToggled = new EventEmitter<boolean>();\n @Output() LegendToggled = new EventEmitter<boolean>();\n /** The person changed shown / minimized / hidden from the canvas chrome. */\n @Output() ToolbarVisibilityChanged = new EventEmitter<FlowToolbarVisibility>();\n\n /** What the template actually paints — `ShowToolbar === false` is a hard hide. */\n public get EffectiveToolbarVisibility(): FlowToolbarVisibility {\n return this.ShowToolbar ? this.ToolbarVisibility : 'hidden';\n }\n\n public SetToolbarVisibility(next: FlowToolbarVisibility): void {\n if (!this.ShowToolbar) return;\n if (this.ToolbarVisibility === next) return;\n this.ToolbarVisibility = next;\n this.ToolbarVisibilityChanged.emit(next);\n }\n\n // ── View Children ───────────────────────────────────────────\n @ViewChild(FFlowComponent) protected fFlow: FFlowComponent | undefined;\n @ViewChild(FCanvasComponent) protected fCanvas: FCanvasComponent | undefined;\n @ViewChild('fZoomRef') protected fZoom: FZoomDirective | undefined;\n @ViewChild('canvasArea') protected canvasArea: ElementRef<HTMLElement> | undefined;\n\n // ── Internal State ──────────────────────────────────────────\n protected zoomLevel = 100;\n protected canvasPosition = { x: 0, y: 0 };\n protected canvasScale = 1;\n /** After the first auto-fit, later fLoaded events must not snap the viewport back. */\n private hasAutoFitted = false;\n /** True once the person zooms or pans — remounts restore this viewport instead of fitting. */\n private viewportOwnedByUser = false;\n private applyingProgrammaticViewport = false;\n protected selectedNodeIDs: string[] = [];\n protected selectedConnectionIDs: string[] = [];\n protected panMode = false;\n\n /** Trigger function for canvas panning — only allows panning in pan mode */\n protected canvasMoveTriggerFn = (_event: MouseEvent | TouchEvent): boolean => {\n return this.panMode;\n };\n\n /* Context menu state */\n protected contextMenuVisible = false;\n protected contextMenuX = 0;\n protected contextMenuY = 0;\n protected contextMenuTargetType: FlowContextMenuTarget = 'node';\n protected contextMenuNode: FlowNode | null = null;\n protected contextMenuConnection: FlowConnection | null = null;\n protected contextMenuItems: FlowContextMenuItem[] = [];\n\n private destroy$ = new Subject<void>();\n private initialized = false;\n private lastConnectionClickTime = 0;\n\n /** How many click-placed nodes are cascaded before the offset wraps back to the viewport centre. */\n private static readonly CLICK_CASCADE_STEPS = 6;\n /** Pixels (canvas units) each cascaded click-placed node is offset by. */\n private static readonly CLICK_CASCADE_OFFSET = 40;\n private clickPlacementIndex = 0;\n\n constructor(\n private cdr: ChangeDetectorRef,\n private stateService: FlowStateService,\n private layoutService: FlowLayoutService\n ) {}\n\n // ── Lifecycle ───────────────────────────────────────────────\n\n ngOnInit(): void {\n this.initialized = true;\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // ── Public Methods ──────────────────────────────────────────\n\n /** Fit all nodes within the viewport */\n ZoomToFit(): void {\n this.applyingProgrammaticViewport = true;\n this.fCanvas?.fitToScreen({ x: 150, y: 150 }, true);\n this.hasAutoFitted = true;\n queueMicrotask(() => { this.applyingProgrammaticViewport = false; });\n }\n\n /** Zoom in one step */\n ZoomIn(): void {\n this.viewportOwnedByUser = true;\n if (this.fZoom) {\n this.fZoom.zoomIn();\n } else {\n const newScale = Math.min(this.canvasScale + 0.15, 3);\n this.fCanvas?.setScale(newScale);\n this.updateZoomLevel(newScale);\n }\n }\n\n /** Zoom out one step */\n ZoomOut(): void {\n this.viewportOwnedByUser = true;\n if (this.fZoom) {\n this.fZoom.zoomOut();\n } else {\n const newScale = Math.max(this.canvasScale - 0.15, 0.1);\n this.fCanvas?.setScale(newScale);\n this.updateZoomLevel(newScale);\n }\n }\n\n /** Run auto-layout using dagre */\n AutoArrange(direction?: FlowLayoutDirection): void {\n const dir = direction ?? this.AutoLayoutDirection;\n this.pushUndoState();\n const result = this.layoutService.CalculateLayout(this.Nodes, this.Connections, dir);\n for (const node of this.Nodes) {\n const newPos = result.Positions.get(node.ID);\n if (newPos) {\n node.Position = { ...newPos };\n }\n }\n this.NodesChanged.emit(this.Nodes);\n this.cdr.detectChanges();\n // Fit to screen after layout\n setTimeout(() => this.ZoomToFit(), 100);\n }\n\n /** Center the canvas on a specific node */\n CenterOnNode(nodeId: string): void {\n this.fCanvas?.centerGroupOrNode(nodeId, true);\n }\n\n /** Programmatically select a node */\n SelectNode(nodeId: string): void {\n this.fFlow?.select([nodeId], []);\n const node = this.Nodes.find(n => UUIDsEqual(n.ID, nodeId)) ?? null;\n this.NodeSelected.emit(node);\n }\n\n /** Clear all selection */\n ClearSelection(): void {\n this.fFlow?.clearSelection();\n this.selectedNodeIDs = [];\n this.selectedConnectionIDs = [];\n this.NodeSelected.emit(null);\n this.ConnectionSelected.emit(null);\n }\n\n /** Update a node's visual status */\n SetNodeStatus(nodeId: string, status: FlowNode['Status'], message?: string): void {\n const node = this.Nodes.find(n => UUIDsEqual(n.ID, nodeId));\n if (node) {\n node.Status = status;\n node.StatusMessage = message;\n this.cdr.detectChanges();\n }\n }\n\n /** Update a node's visual properties and push a new object reference so\n * OnPush child components (FlowNodeComponent) detect the change. */\n UpdateNode(nodeId: string, changes: Partial<Pick<FlowNode, 'Label' | 'Subtitle' | 'Icon' | 'Status' | 'StatusMessage' | 'IsStartNode' | 'Badges' | 'Data'>>): void {\n const idx = this.Nodes.findIndex(n => UUIDsEqual(n.ID, nodeId));\n if (idx === -1) return;\n // Create a new object reference so the OnPush FlowNodeComponent picks up the change\n this.Nodes[idx] = { ...this.Nodes[idx], ...changes };\n this.cdr.detectChanges();\n }\n\n /** Update a connection's visual properties in-place (label, color, style, etc.) */\n UpdateConnection(connId: string, changes: Partial<Pick<FlowConnection, 'Label' | 'LabelIcon' | 'LabelIconColor' | 'LabelDetail' | 'Color' | 'StrokeWidth' | 'Style' | 'Animated'>>): void {\n const conn = this.Connections.find(c => UUIDsEqual(c.ID, connId));\n if (!conn) return;\n Object.assign(conn, changes);\n this.cdr.detectChanges();\n }\n\n /** Highlight a sequence of nodes (e.g., execution path) */\n HighlightPath(nodeIds: string[]): void {\n for (const node of this.Nodes) {\n if (nodeIds.some(id => UUIDsEqual(id, node.ID))) {\n node.Status = 'running';\n }\n }\n // Highlight connections along the path\n for (const conn of this.Connections) {\n const srcIdx = nodeIds.findIndex(id => UUIDsEqual(id, conn.SourceNodeID));\n const tgtIdx = nodeIds.findIndex(id => UUIDsEqual(id, conn.TargetNodeID));\n if (srcIdx >= 0 && tgtIdx >= 0 && tgtIdx === srcIdx + 1) {\n conn.Animated = true;\n }\n }\n this.cdr.detectChanges();\n }\n\n /** Clear all node status highlights */\n ClearHighlights(): void {\n for (const node of this.Nodes) {\n node.Status = 'default';\n node.StatusMessage = undefined;\n }\n for (const conn of this.Connections) {\n conn.Animated = false;\n }\n this.cdr.detectChanges();\n }\n\n /** Undo the last operation */\n Undo(): void {\n const snapshot = this.stateService.Undo(this.Nodes, this.Connections);\n if (snapshot) {\n this.Nodes = snapshot.Nodes;\n this.Connections = snapshot.Connections;\n this.NodesChanged.emit(this.Nodes);\n this.ConnectionsChanged.emit(this.Connections);\n this.cdr.detectChanges();\n }\n }\n\n /** Redo the last undone operation */\n Redo(): void {\n const snapshot = this.stateService.Redo(this.Nodes, this.Connections);\n if (snapshot) {\n this.Nodes = snapshot.Nodes;\n this.Connections = snapshot.Connections;\n this.NodesChanged.emit(this.Nodes);\n this.ConnectionsChanged.emit(this.Connections);\n this.cdr.detectChanges();\n }\n }\n\n get CanUndo(): boolean {\n return this.stateService.CanUndo;\n }\n\n get CanRedo(): boolean {\n return this.stateService.CanRedo;\n }\n\n /** Delete the currently selected nodes and connections */\n DeleteSelected(): void {\n if (this.ReadOnly || (this.selectedNodeIDs.length === 0 && this.selectedConnectionIDs.length === 0)) {\n return;\n }\n this.pushUndoState();\n this.removeSelectedItems();\n this.ClearSelection();\n }\n\n // ── Foblex Event Handlers ──────────────────────────────────\n\n /** Called when Foblex flow finishes loading */\n protected onFlowLoaded(): void {\n if (this.Nodes.length === 0) return;\n if (this.viewportOwnedByUser || this.hasAutoFitted) {\n this.restoreViewport();\n return;\n }\n this.hasAutoFitted = true;\n setTimeout(() => this.ZoomToFit(), 200);\n }\n\n /** Canvas zoom/pan changed */\n protected onCanvasChange(event: FCanvasChangeEvent): void {\n this.canvasPosition = event.position;\n this.canvasScale = event.scale;\n this.updateZoomLevel(event.scale);\n if (!this.applyingProgrammaticViewport) this.viewportOwnedByUser = true;\n }\n\n private restoreViewport(): void {\n if (!this.fCanvas) return;\n this.applyingProgrammaticViewport = true;\n this.fCanvas.setScale(this.canvasScale);\n queueMicrotask(() => { this.applyingProgrammaticViewport = false; });\n }\n\n /** User drew a new connection */\n protected onCreateConnection(event: FCreateConnectionEvent): void {\n if (!event.fInputId || this.ReadOnly) return;\n this.pushUndoState();\n\n // Derive node IDs from port IDs (ports are named nodeID-input / nodeID-output)\n const sourceNodeID = this.findNodeByPortId(event.fOutputId);\n const targetNodeID = this.findNodeByPortId(event.fInputId);\n\n if (!sourceNodeID || !targetNodeID) return;\n\n // Resolve actual port IDs — when fConnectOnNode is enabled, Foblex may\n // send the node ID itself instead of a port ID. Map to the correct port.\n const sourcePortID = this.resolvePortId(event.fOutputId, sourceNodeID, 'output');\n const targetPortID = this.resolvePortId(event.fInputId, targetNodeID, 'input');\n\n // Prevent duplicate connections\n const exists = this.Connections.some(\n c => UUIDsEqual(c.SourcePortID, sourcePortID) && UUIDsEqual(c.TargetPortID, targetPortID)\n );\n if (exists) return;\n\n this.ConnectionCreated.emit({\n SourceNodeID: sourceNodeID,\n SourcePortID: sourcePortID,\n TargetNodeID: targetNodeID,\n TargetPortID: targetPortID\n });\n }\n\n /** User reassigned (dragged) an existing connection endpoint to a new node */\n protected onReassignConnection(event: FReassignConnectionEvent): void {\n if (this.ReadOnly) return;\n\n const conn = this.Connections.find(c => UUIDsEqual(c.ID, event.connectionId));\n if (!conn) return;\n\n // If dropped on empty space (no new target/source), discard the reassignment\n if (event.isTargetReassign && !event.newTargetId) return;\n if (event.isSourceReassign && !event.newSourceId) return;\n\n this.pushUndoState();\n\n const oldSourceNodeID = conn.SourceNodeID;\n const oldSourcePortID = conn.SourcePortID;\n const oldTargetNodeID = conn.TargetNodeID;\n const oldTargetPortID = conn.TargetPortID;\n\n // Resolve new endpoints\n let newSourceNodeID = oldSourceNodeID;\n let newSourcePortID = oldSourcePortID;\n let newTargetNodeID = oldTargetNodeID;\n let newTargetPortID = oldTargetPortID;\n\n if (event.isSourceReassign && event.newSourceId) {\n newSourceNodeID = this.findNodeByPortId(event.newSourceId) ?? oldSourceNodeID;\n newSourcePortID = this.resolvePortId(event.newSourceId, newSourceNodeID, 'output');\n }\n\n if (event.isTargetReassign && event.newTargetId) {\n newTargetNodeID = this.findNodeByPortId(event.newTargetId) ?? oldTargetNodeID;\n newTargetPortID = this.resolvePortId(event.newTargetId, newTargetNodeID, 'input');\n }\n\n // Prevent self-connections\n if (newSourceNodeID === newTargetNodeID) return;\n\n // Prevent duplicates\n const duplicate = this.Connections.some(\n c => !UUIDsEqual(c.ID, conn.ID) &&\n UUIDsEqual(c.SourcePortID, newSourcePortID) &&\n UUIDsEqual(c.TargetPortID, newTargetPortID)\n );\n if (duplicate) return;\n\n // Update the connection in-place\n conn.SourceNodeID = newSourceNodeID;\n conn.SourcePortID = newSourcePortID;\n conn.TargetNodeID = newTargetNodeID;\n conn.TargetPortID = newTargetPortID;\n\n this.ConnectionReassigned.emit({\n ConnectionID: conn.ID,\n OldSourceNodeID: oldSourceNodeID,\n OldSourcePortID: oldSourcePortID,\n OldTargetNodeID: oldTargetNodeID,\n OldTargetPortID: oldTargetPortID,\n NewSourceNodeID: newSourceNodeID,\n NewSourcePortID: newSourcePortID,\n NewTargetNodeID: newTargetNodeID,\n NewTargetPortID: newTargetPortID\n });\n\n this.ConnectionsChanged.emit(this.Connections);\n this.cdr.detectChanges();\n }\n\n /** External item dropped from palette */\n protected onCreateNode(event: FCreateNodeEvent): void {\n const config = this.NodeTypes.find(nt => nt.Type === (event.data as string));\n if (!config) return;\n\n // event.rect is already normalized to canvas coordinates by Foblex's\n // GetNormalizedElementRectExecution (via RoundedRect.fromCenter).\n // Do NOT pass it through getPositionInFlow() again — that double-normalizes\n // and places the node far from the actual drop point.\n // Use the center of the preview rect (≈ cursor position at drop time).\n this.addNodeFromPalette(config, {\n X: event.rect.x + event.rect.width / 2,\n Y: event.rect.y + event.rect.height / 2\n });\n }\n\n /**\n * A palette entry was clicked (or activated from the keyboard) rather than dragged.\n *\n * Deliberately routed into the SAME `addNodeFromPalette` the drop path uses. A separate\n * click-only creation path would be a second way for a node to come into existence, and the two\n * would drift — which is exactly the failure this fixes, one level up.\n */\n protected onPaletteNodeTypeActivated(config: FlowNodeTypeConfig): void {\n this.addNodeFromPalette(config, this.nextClickDropPosition());\n }\n\n /** The one place a palette-originated node is created and announced. */\n private addNodeFromPalette(config: FlowNodeTypeConfig, dropPosition: FlowPosition): void {\n if (this.ReadOnly) return;\n this.pushUndoState();\n const newNode = this.createDefaultNode(config, dropPosition);\n this.NodeAdded.emit({ Node: newNode, DropPosition: dropPosition });\n }\n\n /**\n * Where a clicked step lands: the middle of what the author is currently looking at, cascaded so\n * consecutive clicks don't bury each other under one box.\n *\n * A click carries no coordinates, so *some* position has to be invented. The viewport centre is\n * the only choice that is guaranteed on screen at any zoom or pan — placing at the canvas origin\n * would drop steps off-screen the moment the author has scrolled anywhere.\n */\n private nextClickDropPosition(): FlowPosition {\n const rect = this.canvasArea?.nativeElement.getBoundingClientRect();\n const scale = this.canvasScale || 1;\n const centerX = ((rect?.width ?? 800) / 2 - this.canvasPosition.x) / scale;\n const centerY = ((rect?.height ?? 600) / 2 - this.canvasPosition.y) / scale;\n\n const step = (this.clickPlacementIndex++ % FlowEditorComponent.CLICK_CASCADE_STEPS) * FlowEditorComponent.CLICK_CASCADE_OFFSET;\n return { X: Math.round(centerX + step), Y: Math.round(centerY + step) };\n }\n\n /** Selection changed in Foblex */\n protected onSelectionChange(event: FSelectionChangeEvent): void {\n const timeSinceClick = Date.now() - this.lastConnectionClickTime;\n\n // If a direct connection click just fired, skip this Foblex callback\n // to avoid double-processing / overwriting the direct click result.\n if (timeSinceClick < 200) {\n return;\n }\n\n this.selectedNodeIDs = event.fNodeIds ?? [];\n this.selectedConnectionIDs = event.fConnectionIds ?? [];\n\n this.SelectionChanged.emit({\n SelectedNodeIDs: this.selectedNodeIDs,\n SelectedConnectionIDs: this.selectedConnectionIDs\n });\n\n // Emit specific node/connection selection events.\n // IMPORTANT: When selecting a connection, emit NodeSelected(null) FIRST so\n // that consumers clear their node state before the connection event opens\n // the connection properties panel.\n if (this.selectedNodeIDs.length === 1) {\n const node = this.Nodes.find(n => UUIDsEqual(n.ID, this.selectedNodeIDs[0]));\n this.ConnectionSelected.emit(null);\n this.NodeSelected.emit(node ?? null);\n } else if (this.selectedConnectionIDs.length === 1) {\n const conn = this.Connections.find(c => UUIDsEqual(c.ID, this.selectedConnectionIDs[0]));\n this.NodeSelected.emit(null);\n this.ConnectionSelected.emit(conn ?? null);\n } else if (this.selectedNodeIDs.length === 0 && this.selectedConnectionIDs.length === 0) {\n this.NodeSelected.emit(null);\n this.ConnectionSelected.emit(null);\n }\n }\n\n /** Nodes moved on canvas */\n protected onNodesMoved(event: FMoveNodesEvent): void {\n if (this.ReadOnly || !event.fNodes || event.fNodes.length === 0) return;\n this.pushUndoState();\n\n for (const moved of event.fNodes) {\n const node = this.Nodes.find(n => UUIDsEqual(n.ID, moved.id));\n if (node) {\n const oldPosition = { ...node.Position };\n node.Position = { X: moved.position.x, Y: moved.position.y };\n this.NodeMoved.emit({\n NodeID: node.ID,\n OldPosition: oldPosition,\n NewPosition: node.Position\n });\n }\n }\n this.NodesChanged.emit(this.Nodes);\n }\n\n // ── Toolbar Event Handlers ─────────────────────────────────\n\n protected onGridToggled(show: boolean): void {\n this.ShowGrid = show;\n this.GridToggled.emit(show);\n this.cdr.detectChanges();\n }\n\n protected onMinimapToggled(show: boolean): void {\n this.ShowMinimap = show;\n this.MinimapToggled.emit(show);\n this.cdr.detectChanges();\n }\n\n protected onLegendToggled(show: boolean): void {\n this.ShowLegend = show;\n this.LegendToggled.emit(show);\n this.cdr.detectChanges();\n }\n\n protected onPanModeToggled(enabled: boolean): void {\n this.panMode = enabled;\n this.cdr.detectChanges();\n }\n\n // ── Context Menu ───────────────────────────────────────────\n\n protected onNodeContextMenu(event: MouseEvent, node: FlowNode): void {\n event.preventDefault();\n event.stopPropagation();\n this.openContextMenu(event, 'node', node, null);\n }\n\n /** Direct click on a connection — ensures ConnectionSelected fires reliably */\n protected onConnectionClicked(event: MouseEvent, conn: FlowConnection): void {\n // Do NOT stopPropagation — let Foblex handle its own visual selection.\n // Record the time so onSelectionChange can skip double-processing.\n this.lastConnectionClickTime = Date.now();\n this.selectedConnectionIDs = [conn.ID];\n this.selectedNodeIDs = [];\n this.NodeSelected.emit(null);\n this.ConnectionSelected.emit(conn);\n this.cdr.detectChanges();\n }\n\n protected onConnectionContextMenu(event: MouseEvent, conn: FlowConnection): void {\n event.preventDefault();\n event.stopPropagation();\n this.openContextMenu(event, 'connection', null, conn);\n }\n\n protected onContextMenuAction(action: FlowContextMenuAction): void {\n // Capture the target BEFORE closing: hideContextMenu() nulls contextMenuNode and\n // contextMenuConnection, so reading them afterwards found nothing and every branch below fell\n // through — the menu closed and neither Remove nor Edit did anything, for nodes or connections.\n const targetType = this.contextMenuTargetType;\n const node = this.contextMenuNode;\n const connection = this.contextMenuConnection;\n\n this.hideContextMenu();\n\n if (!this.ReadOnly && action === 'edit') {\n if (targetType === 'node' && node) {\n this.NodeEditRequested.emit(node);\n } else if (targetType === 'connection' && connection) {\n this.ConnectionEditRequested.emit(connection);\n }\n } else if (!this.ReadOnly && action === 'remove') {\n if (targetType === 'node' && node) {\n this.pushUndoState();\n this.removeNodeById(node.ID);\n } else if (targetType === 'connection' && connection) {\n this.pushUndoState();\n this.removeConnectionById(connection.ID);\n }\n }\n\n this.AfterContextMenuAction.emit(\n new FlowAfterContextMenuActionEventArgs(action, targetType, node, connection),\n );\n }\n\n @HostListener('document:click')\n protected onDocumentClick(): void {\n if (this.contextMenuVisible) {\n this.hideContextMenu();\n }\n }\n\n private openContextMenu(\n event: MouseEvent,\n targetType: FlowContextMenuTarget,\n node: FlowNode | null,\n connection: FlowConnection | null\n ): void {\n const defaults = this.ReadOnly ? [] : defaultContextMenuItems(targetType);\n const before = new FlowBeforeContextMenuEventArgs(targetType, node, connection, event, defaults);\n this.BeforeContextMenu.emit(before);\n if (before.Cancel || before.Items.length === 0) return;\n\n this.contextMenuTargetType = targetType;\n this.contextMenuNode = node;\n this.contextMenuConnection = connection;\n this.contextMenuItems = before.Items;\n this.contextMenuX = event.clientX;\n this.contextMenuY = event.clientY;\n this.contextMenuVisible = true;\n this.cdr.detectChanges();\n }\n\n private hideContextMenu(): void {\n this.contextMenuVisible = false;\n this.contextMenuNode = null;\n this.contextMenuConnection = null;\n this.cdr.detectChanges();\n }\n\n private removeNodeById(nodeId: string): void {\n const node = this.Nodes.find(n => UUIDsEqual(n.ID, nodeId));\n if (!node) return;\n\n this.Nodes = this.Nodes.filter(n => !UUIDsEqual(n.ID, nodeId));\n\n /* Remove connections attached to this node */\n const orphaned = this.Connections.filter(\n c => UUIDsEqual(c.SourceNodeID, nodeId) || UUIDsEqual(c.TargetNodeID, nodeId)\n );\n this.Connections = this.Connections.filter(\n c => !UUIDsEqual(c.SourceNodeID, nodeId) && !UUIDsEqual(c.TargetNodeID, nodeId)\n );\n for (const conn of orphaned) {\n this.ConnectionRemoved.emit(conn);\n }\n this.NodeRemoved.emit(node);\n this.NodesChanged.emit(this.Nodes);\n this.ConnectionsChanged.emit(this.Connections);\n this.cdr.detectChanges();\n }\n\n private removeConnectionById(connId: string): void {\n const conn = this.Connections.find(c => UUIDsEqual(c.ID, connId));\n if (!conn) return;\n\n this.Connections = this.Connections.filter(c => !UUIDsEqual(c.ID, connId));\n this.ConnectionRemoved.emit(conn);\n this.ConnectionsChanged.emit(this.Connections);\n this.cdr.detectChanges();\n }\n\n // ── Keyboard Shortcuts ─────────────────────────────────────\n\n @HostListener('keydown', ['$event'])\n protected onKeyDown(event: KeyboardEvent): void {\n if (this.ReadOnly) return;\n\n const isCtrlOrMeta = event.ctrlKey || event.metaKey;\n\n if (event.key === 'Delete' || event.key === 'Backspace') {\n // Don't delete if user is typing in an input\n const target = event.target as HTMLElement;\n if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.tagName === 'SELECT') {\n return;\n }\n event.preventDefault();\n this.DeleteSelected();\n } else if (isCtrlOrMeta && event.key === 'z' && !event.shiftKey) {\n event.preventDefault();\n this.Undo();\n } else if (isCtrlOrMeta && (event.key === 'y' || (event.key === 'z' && event.shiftKey))) {\n event.preventDefault();\n this.Redo();\n } else if (isCtrlOrMeta && event.key === 'a') {\n event.preventDefault();\n this.fFlow?.selectAll();\n }\n }\n\n // ── TrackBy Functions ───────────────────────────────────────\n\n protected trackNodeById(_index: number, node: FlowNode): string {\n return node.ID;\n }\n\n protected trackConnectionById(_index: number, conn: FlowConnection): string {\n return conn.ID;\n }\n\n // ── Helper Methods ─────────────────────────────────────────\n\n GetTypeConfig(type: string): FlowNodeTypeConfig | null {\n return this.NodeTypes.find(nt => nt.Type === type) ?? null;\n }\n\n /** Get the connectable side string for Foblex based on port side */\n GetConnectableSide(side: string | undefined): string {\n switch (side) {\n case 'left': return 'left';\n case 'right': return 'right';\n case 'top': return 'top';\n case 'bottom': return 'bottom';\n default: return 'auto';\n }\n }\n\n get selectedCount(): number {\n return this.selectedNodeIDs.length + this.selectedConnectionIDs.length;\n }\n\n private pushUndoState(): void {\n this.stateService.PushState(this.Nodes, this.Connections);\n }\n\n private updateZoomLevel(scale: number): void {\n this.zoomLevel = Math.round(scale * 100);\n this.cdr.detectChanges();\n }\n\n private findNodeByPortId(portId: string): string | null {\n for (const node of this.Nodes) {\n for (const port of node.Ports) {\n if (UUIDsEqual(port.ID, portId)) {\n return node.ID;\n }\n }\n }\n // When fConnectOnNode is enabled, Foblex may send the node ID itself\n // instead of a port ID. Check for a direct node ID match as fallback.\n const directMatch = this.Nodes.find(n => UUIDsEqual(n.ID, portId));\n if (directMatch) {\n return directMatch.ID;\n }\n return null;\n }\n\n /**\n * When fConnectOnNode is enabled, Foblex may send a node ID instead of a port ID.\n * This resolves the raw ID to the correct port ID for the given direction.\n */\n private resolvePortId(rawId: string, nodeId: string, direction: 'input' | 'output'): string {\n const node = this.Nodes.find(n => UUIDsEqual(n.ID, nodeId));\n if (!node) return rawId;\n\n // If the rawId already matches a port on this node, use it as-is\n const exactPort = node.Ports.find(p => UUIDsEqual(p.ID, rawId));\n if (exactPort) return rawId;\n\n // Otherwise, find the first port matching the expected direction\n const dirPort = node.Ports.find(p => p.Direction === direction);\n return dirPort ? dirPort.ID : rawId;\n }\n\n private createDefaultNode(config: FlowNodeTypeConfig, position: FlowPosition): FlowNode {\n const id = this.generateId();\n const defaultPorts = config.DefaultPorts ?? [\n { ID: `${id}-input`, Direction: 'input' as const, Side: 'top' as const, Multiple: true },\n { ID: `${id}-output`, Direction: 'output' as const, Side: 'bottom' as const, Multiple: true }\n ];\n\n return {\n ID: id,\n Type: config.Type,\n Label: config.Label,\n Icon: config.Icon,\n Status: 'default',\n Position: position,\n Ports: defaultPorts.map(p => ({\n ...p,\n ID: p.ID.startsWith(id) ? p.ID : `${id}-${p.ID}`\n }))\n };\n }\n\n private removeSelectedItems(): void {\n // Remove selected connections\n const removedConnections = this.Connections.filter(c => this.selectedConnectionIDs.some(id => UUIDsEqual(id, c.ID)));\n this.Connections = this.Connections.filter(c => !this.selectedConnectionIDs.some(id => UUIDsEqual(id, c.ID)));\n for (const conn of removedConnections) {\n this.ConnectionRemoved.emit(conn);\n }\n\n // Remove selected nodes and their connections\n const removedNodes = this.Nodes.filter(n => this.selectedNodeIDs.some(id => UUIDsEqual(id, n.ID)));\n this.Nodes = this.Nodes.filter(n => !this.selectedNodeIDs.some(id => UUIDsEqual(id, n.ID)));\n\n // Also remove connections attached to deleted nodes\n const deletedNodeIDs = new Set(this.selectedNodeIDs.map(id => NormalizeUUID(id)));\n const orphanedConnections = this.Connections.filter(\n c => deletedNodeIDs.has(NormalizeUUID(c.SourceNodeID)) || deletedNodeIDs.has(NormalizeUUID(c.TargetNodeID))\n );\n this.Connections = this.Connections.filter(\n c => !deletedNodeIDs.has(NormalizeUUID(c.SourceNodeID)) && !deletedNodeIDs.has(NormalizeUUID(c.TargetNodeID))\n );\n\n for (const conn of orphanedConnections) {\n this.ConnectionRemoved.emit(conn);\n }\n for (const node of removedNodes) {\n this.NodeRemoved.emit(node);\n }\n\n this.NodesChanged.emit(this.Nodes);\n this.ConnectionsChanged.emit(this.Connections);\n this.cdr.detectChanges();\n }\n\n private generateId(): string {\n return 'flow-' + Math.random().toString(36).substring(2, 11);\n }\n}\n\nfunction defaultContextMenuItems(target: FlowContextMenuTarget): FlowContextMenuItem[] {\n const noun = target === 'node' ? 'Node' : 'Connection';\n return [\n { ID: 'edit', Label: `Edit ${noun}`, Icon: 'fa-pen-to-square' },\n { ID: 'remove', Label: `Remove ${noun}`, Icon: 'fa-trash-can', Danger: true },\n ];\n}\n","<div class=\"mj-flow-editor\" [class.mj-flow-editor--readonly]=\"ReadOnly\" tabindex=\"0\">\n\n <!-- Canvas Toolbar — shown / minimized / hidden (recover tab). Align is left/center/right. -->\n @if (ShowToolbar && EffectiveToolbarVisibility === 'shown') {\n <div class=\"mj-flow-editor-toolbar-area\" [attr.data-align]=\"ToolbarAlign\">\n <mj-flow-toolbar\n [ZoomLevel]=\"zoomLevel\"\n [ShowGrid]=\"ShowGrid\"\n [ShowMinimap]=\"ShowMinimap\"\n [ShowLegend]=\"ShowLegend\"\n [ReadOnly]=\"ReadOnly\"\n [PanMode]=\"panMode\"\n (ZoomInClicked)=\"ZoomIn()\"\n (ZoomOutClicked)=\"ZoomOut()\"\n (FitToScreenClicked)=\"ZoomToFit()\"\n (AutoLayoutClicked)=\"AutoArrange()\"\n (GridToggled)=\"onGridToggled($event)\"\n (MinimapToggled)=\"onMinimapToggled($event)\"\n (LegendToggled)=\"onLegendToggled($event)\"\n (PanModeToggled)=\"onPanModeToggled($event)\"\n (MinimizeClicked)=\"SetToolbarVisibility('minimized')\"\n (HideClicked)=\"SetToolbarVisibility('hidden')\">\n </mj-flow-toolbar>\n </div>\n } @else if (ShowToolbar && EffectiveToolbarVisibility === 'minimized') {\n <button type=\"button\" class=\"mj-flow-editor-toolbar-chip\" [attr.data-align]=\"ToolbarAlign\"\n (click)=\"SetToolbarVisibility('shown')\"\n title=\"Show canvas tools\" aria-label=\"Show canvas tools\">\n <i class=\"fa-solid fa-wrench\" aria-hidden=\"true\"></i>\n </button>\n } @else if (ShowToolbar && EffectiveToolbarVisibility === 'hidden') {\n <button type=\"button\" class=\"mj-flow-editor-toolbar-tab\" [attr.data-align]=\"ToolbarAlign\"\n (click)=\"SetToolbarVisibility('shown')\"\n title=\"Show canvas tools\" aria-label=\"Show canvas tools\">\n <i class=\"fa-solid fa-ellipsis\" aria-hidden=\"true\"></i>\n </button>\n }\n\n <!-- Main Canvas Area -->\n <div class=\"mj-flow-editor-canvas-area\">\n\n <!-- Palette Sidebar -->\n @if (ShowPalette && !ReadOnly) {\n <mj-flow-palette\n [NodeTypes]=\"NodeTypes\"\n (NodeTypeActivated)=\"onPaletteNodeTypeActivated($event)\">\n </mj-flow-palette>\n }\n\n <!-- Foblex Canvas -->\n <div class=\"mj-flow-editor-canvas\" #canvasArea\n [class.mj-flow-editor-canvas--pan-mode]=\"panMode\">\n <f-flow fDraggable\n [fDraggableDisabled]=\"false\"\n [fCanvasMoveTrigger]=\"canvasMoveTriggerFn\"\n [vCellSize]=\"GridSize\"\n [hCellSize]=\"GridSize\"\n [fCellSizeWhileDragging]=\"ShowGrid\"\n (fLoaded)=\"onFlowLoaded()\"\n (fCreateConnection)=\"onCreateConnection($event)\"\n (fReassignConnection)=\"onReassignConnection($event)\"\n (fCreateNode)=\"onCreateNode($event)\"\n (fSelectionChange)=\"onSelectionChange($event)\"\n (fMoveNodes)=\"onNodesMoved($event)\">\n\n <!-- Background grid — MUST be direct child of f-flow (Foblex content projection requires it) -->\n @if (ShowGrid) {\n <f-background>\n <f-circle-pattern [color]=\"'#94a3b8'\" [radius]=\"24\"></f-circle-pattern>\n </f-background>\n }\n\n <!-- Alignment snap lines — direct child of f-flow -->\n @if (!ReadOnly) {\n <f-line-alignment [fAlignThreshold]=\"10\"></f-line-alignment>\n }\n\n <f-canvas fZoom #fZoomRef=\"fComponent\"\n [fZoomMinimum]=\"0.15\"\n [fZoomMaximum]=\"3\"\n [fZoomStep]=\"0.1\"\n [position]=\"canvasPosition\"\n [scale]=\"canvasScale\"\n (fCanvasChange)=\"onCanvasChange($event)\">\n\n <!-- Interactive connection drawing -->\n @if (!ReadOnly) {\n <f-connection-for-create\n fType=\"bezier\"\n [fRadius]=\"8\"\n [fOffset]=\"12\">\n <svg viewBox=\"0 0 10 10\" fMarker type=\"end\"\n orient=\"auto\" [refX]=\"9\" [refY]=\"5\" [height]=\"10\" [width]=\"10\">\n <path d=\"M0 0L10 5L0 10Z\" fill=\"#94a3b8\"/>\n </svg>\n </f-connection-for-create>\n }\n\n <!-- Connections -->\n @for (conn of Connections; track trackConnectionById($index, conn)) {\n <f-connection\n [fConnectionId]=\"conn.ID\"\n [fOutputId]=\"conn.SourcePortID\"\n [fInputId]=\"conn.TargetPortID\"\n fType=\"bezier\"\n fBehavior=\"fixed\"\n [fRadius]=\"8\"\n [fOffset]=\"12\"\n [fSelectionDisabled]=\"false\"\n [fReassignDisabled]=\"ReadOnly\"\n [style.--connection-color]=\"conn.Color || '#94a3b8'\"\n [style.--connection-width.px]=\"conn.StrokeWidth || 2\"\n [class.mj-flow-connection-colored]=\"!!conn.Color\"\n [class.mj-flow-connection-dashed]=\"conn.Style === 'dashed'\"\n [class.mj-flow-connection-dotted]=\"conn.Style === 'dotted'\"\n [class.mj-flow-connection-animated]=\"!!conn.Animated\"\n (click)=\"onConnectionClicked($event, conn)\"\n (contextmenu)=\"onConnectionContextMenu($event, conn)\">\n <!-- Arrow marker -->\n <svg viewBox=\"0 0 10 10\" fMarker type=\"end\"\n orient=\"auto\" [refX]=\"9\" [refY]=\"5\"\n [height]=\"conn.Animated ? 16 : 10\"\n [width]=\"conn.Animated ? 16 : 10\">\n <path d=\"M0 0L10 5L0 10Z\" [attr.fill]=\"conn.Color || '#94a3b8'\"/>\n </svg>\n <!-- Connection label -->\n @if (conn.Label) {\n <div fConnectionContent [position]=\"0.5\"\n class=\"mj-flow-connection-label\"\n [style.backgroundColor]=\"ConnectionLabelBackground\"\n [style.borderColor]=\"ConnectionLabelBorderColor\"\n [style.color]=\"ConnectionLabelTextColor\"\n [title]=\"conn.LabelDetail || conn.Label || ''\">\n @if (conn.LabelIcon) {\n <i\n class=\"fa-solid mj-flow-connection-label-icon\"\n [ngClass]=\"conn.LabelIcon\"\n [style.color]=\"conn.LabelIconColor || 'inherit'\"></i>\n }\n {{ conn.Label }}\n </div>\n }\n </f-connection>\n }\n\n <!-- Nodes -->\n @for (node of Nodes; track trackNodeById($index, node)) {\n <mj-flow-node\n fNode\n fDragHandle\n [fNodeId]=\"node.ID\"\n [fNodePosition]=\"{ x: node.Position.X, y: node.Position.Y }\"\n [fNodeDraggingDisabled]=\"ReadOnly || panMode || node.Locked === true\"\n [fNodeSelectionDisabled]=\"panMode\"\n [fConnectOnNode]=\"!ReadOnly && !panMode\"\n [Node]=\"node\"\n [TypeConfig]=\"GetTypeConfig(node.Type)\"\n [ReadOnly]=\"ReadOnly\"\n (contextmenu)=\"onNodeContextMenu($event, node)\">\n </mj-flow-node>\n }\n\n </f-canvas>\n\n <!-- Rubber-band selection — direct child of f-flow -->\n @if (!ReadOnly) {\n <f-selection-area></f-selection-area>\n }\n\n <!-- Minimap -->\n @if (ShowMinimap) {\n <div class=\"mj-flow-editor-minimap\" fDragBlocker>\n <f-minimap [fMinSize]=\"1500\"></f-minimap>\n </div>\n }\n </f-flow>\n\n <!-- Legend -->\n @if (ShowLegend && Nodes.length > 0) {\n <div class=\"mj-flow-editor-legend\">\n <div class=\"mj-flow-editor-legend-title\">Legend</div>\n <div class=\"mj-flow-editor-legend-section\">\n <div class=\"mj-flow-editor-legend-heading\">Connections</div>\n <div class=\"mj-flow-editor-legend-item\">\n <svg class=\"mj-flow-editor-legend-line-svg\" width=\"28\" height=\"10\"><line x1=\"0\" y1=\"5\" x2=\"28\" y2=\"5\" stroke=\"#64748b\" stroke-width=\"2\"/></svg>\n <span>Only exit path</span>\n </div>\n <div class=\"mj-flow-editor-legend-item\">\n <svg class=\"mj-flow-editor-legend-line-svg\" width=\"28\" height=\"10\"><line x1=\"0\" y1=\"5\" x2=\"28\" y2=\"5\" stroke=\"#16a34a\" stroke-width=\"2\"/></svg>\n <i class=\"fa-solid fa-circle-check\" style=\"color:#16a34a;font-size:10px;\"></i>\n <span>Default (fallback)</span>\n </div>\n <div class=\"mj-flow-editor-legend-item\">\n <svg class=\"mj-flow-editor-legend-line-svg\" width=\"28\" height=\"10\"><line x1=\"0\" y1=\"5\" x2=\"28\" y2=\"5\" stroke=\"#f59e0b\" stroke-width=\"2\" stroke-dasharray=\"5 3\"/></svg>\n <span>Conditional</span>\n </div>\n <div class=\"mj-flow-editor-legend-item\">\n <svg class=\"mj-flow-editor-legend-line-svg\" width=\"28\" height=\"10\"><line x1=\"0\" y1=\"5\" x2=\"28\" y2=\"5\" stroke=\"#ef4444\" stroke-width=\"2\"/></svg>\n <i class=\"fa-solid fa-triangle-exclamation\" style=\"color:#ef4444;font-size:10px;\"></i>\n <span>Duplicate defaults</span>\n </div>\n </div>\n <div class=\"mj-flow-editor-legend-section\">\n <div class=\"mj-flow-editor-legend-heading\">Step Types</div>\n <div class=\"mj-flow-editor-legend-item\">\n <span class=\"mj-flow-editor-legend-swatch\" style=\"background:#3B82F6\"></span>\n <span>Action</span>\n </div>\n <div class=\"mj-flow-editor-legend-item\">\n <span class=\"mj-flow-editor-legend-swatch\" style=\"background:#8B5CF6\"></span>\n <span>Prompt</span>\n </div>\n <div class=\"mj-flow-editor-legend-item\">\n <span class=\"mj-flow-editor-legend-swatch\" style=\"background:#10B981\"></span>\n <span>Sub-Agent</span>\n </div>\n <div class=\"mj-flow-editor-legend-item\">\n <span class=\"mj-flow-editor-legend-swatch\" style=\"background:#F59E0B\"></span>\n <span>For Each</span>\n </div>\n <div class=\"mj-flow-editor-legend-item\">\n <span class=\"mj-flow-editor-legend-swatch\" style=\"background:#F97316\"></span>\n <span>While</span>\n </div>\n </div>\n <div class=\"mj-flow-editor-legend-section\">\n <div class=\"mj-flow-editor-legend-heading\">Borders</div>\n <div class=\"mj-flow-editor-legend-item\">\n <span class=\"mj-flow-editor-legend-box\" style=\"border-color:#16a34a;background:#f0fdf4;\"></span>\n <span>Start node</span>\n </div>\n <div class=\"mj-flow-editor-legend-item\">\n <span class=\"mj-flow-editor-legend-box\" style=\"border-color:#ef4444;background:#fef2f2;\"></span>\n <i class=\"fa-solid fa-triangle-exclamation\" style=\"color:#ea580c;font-size:10px;\"></i>\n <span>Missing config</span>\n </div>\n </div>\n </div>\n }\n\n <!-- Empty state overlay -->\n @if (Nodes.length === 0) {\n <div class=\"mj-flow-editor-empty\">\n <mj-empty-state\n Icon=\"fa-solid fa-diagram-project\"\n [Title]=\"EmptyStateTitle\">\n @if (!ReadOnly) {\n <p class=\"mj-flow-editor-empty-subtitle\">\n Or use auto-layout after adding steps to arrange them automatically\n </p>\n }\n </mj-empty-state>\n </div>\n }\n </div>\n </div>\n\n <!-- Context Menu -->\n @if (contextMenuVisible) {\n <div\n class=\"mj-flow-context-menu\"\n [style.left.px]=\"contextMenuX\"\n [style.top.px]=\"contextMenuY\"\n (click)=\"$event.stopPropagation()\">\n @for (item of contextMenuItems; track item.ID; let last = $last) {\n <button type=\"button\" class=\"mj-flow-context-menu-item\"\n [class.mj-flow-context-menu-item--danger]=\"item.Danger\"\n [disabled]=\"item.Disabled\"\n (click)=\"onContextMenuAction(item.ID)\">\n @if (item.Icon) {\n <i class=\"fa-solid\" [ngClass]=\"item.Icon\"></i>\n }\n <span>{{ item.Label }}</span>\n @if (item.Shortcut) {\n <kbd class=\"mj-flow-context-menu-shortcut\">{{ item.Shortcut }}</kbd>\n }\n </button>\n @if (!last && item.Danger !== contextMenuItems[$index + 1]?.Danger) {\n <div class=\"mj-flow-context-menu-divider\"></div>\n }\n }\n </div>\n }\n\n <!-- Status Bar -->\n @if (ShowStatusBar) {\n <mj-flow-status-bar\n [NodeCount]=\"Nodes.length\"\n [ConnectionCount]=\"Connections.length\"\n [SelectedCount]=\"selectedCount\"\n [ZoomLevel]=\"zoomLevel\">\n </mj-flow-status-bar>\n }\n</div>\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memberjunction/ng-flow-editor",
3
- "version": "6.1.0-edge.4",
3
+ "version": "6.1.0-edge.6",
4
4
  "description": "MemberJunction: Generic visual flow editor component powered by Foblex Flow, with an agent-specific Flow Agent Editor",
5
5
  "main": "./dist/public-api.js",
6
6
  "typings": "./dist/public-api.d.ts",
@@ -19,17 +19,17 @@
19
19
  "author": "",
20
20
  "license": "BUSL-1.1",
21
21
  "devDependencies": {
22
- "@angular/compiler": "21.1.3",
23
- "@angular/compiler-cli": "21.1.3",
24
- "@memberjunction/ng-test-utils": "6.1.0-edge.4",
22
+ "@angular/compiler": "21.2.22",
23
+ "@angular/compiler-cli": "21.2.22",
24
+ "@memberjunction/ng-test-utils": "6.1.0-edge.6",
25
25
  "sass": "^1.97.3",
26
26
  "vitest": "^4.0.18"
27
27
  },
28
28
  "peerDependencies": {
29
- "@angular/common": "^21.1.3",
30
- "@angular/core": "^21.1.3",
31
- "@angular/forms": "^21.1.3",
32
- "@angular/platform-browser": "^21.1.3"
29
+ "@angular/common": "^21.2.22",
30
+ "@angular/core": "^21.2.22",
31
+ "@angular/forms": "^21.2.22",
32
+ "@angular/platform-browser": "^21.2.22"
33
33
  },
34
34
  "dependencies": {
35
35
  "@dagrejs/dagre": "^1.1.8",
@@ -38,13 +38,13 @@
38
38
  "@foblex/mediator": "1.1.3",
39
39
  "@foblex/platform": "1.0.4",
40
40
  "@foblex/utils": "1.1.1",
41
- "@memberjunction/core": "6.1.0-edge.4",
42
- "@memberjunction/core-entities": "6.1.0-edge.4",
43
- "@memberjunction/global": "6.1.0-edge.4",
44
- "@memberjunction/ng-base-types": "6.1.0-edge.4",
45
- "@memberjunction/ng-code-editor": "6.1.0-edge.4",
46
- "@memberjunction/ng-shared-generic": "6.1.0-edge.4",
47
- "@memberjunction/ng-ui-components": "6.1.0-edge.4",
41
+ "@memberjunction/core": "6.1.0-edge.6",
42
+ "@memberjunction/core-entities": "6.1.0-edge.6",
43
+ "@memberjunction/global": "6.1.0-edge.6",
44
+ "@memberjunction/ng-base-types": "6.1.0-edge.6",
45
+ "@memberjunction/ng-code-editor": "6.1.0-edge.6",
46
+ "@memberjunction/ng-shared-generic": "6.1.0-edge.6",
47
+ "@memberjunction/ng-ui-components": "6.1.0-edge.6",
48
48
  "rxjs": "^7.8.2",
49
49
  "tslib": "^2.8.1"
50
50
  },