@memberjunction/ng-flow-editor 0.0.1 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/README.md +151 -43
  2. package/dist/lib/agent-editor/agent-flow-transformer.service.d.ts +83 -0
  3. package/dist/lib/agent-editor/agent-flow-transformer.service.d.ts.map +1 -0
  4. package/dist/lib/agent-editor/agent-flow-transformer.service.js +447 -0
  5. package/dist/lib/agent-editor/agent-flow-transformer.service.js.map +1 -0
  6. package/dist/lib/agent-editor/agent-properties-panel.component.d.ts +92 -0
  7. package/dist/lib/agent-editor/agent-properties-panel.component.d.ts.map +1 -0
  8. package/dist/lib/agent-editor/agent-properties-panel.component.js +1139 -0
  9. package/dist/lib/agent-editor/agent-properties-panel.component.js.map +1 -0
  10. package/dist/lib/agent-editor/agent-step-list.component.d.ts +17 -0
  11. package/dist/lib/agent-editor/agent-step-list.component.d.ts.map +1 -0
  12. package/dist/lib/agent-editor/agent-step-list.component.js +278 -0
  13. package/dist/lib/agent-editor/agent-step-list.component.js.map +1 -0
  14. package/dist/lib/agent-editor/flow-agent-editor.component.d.ts +134 -0
  15. package/dist/lib/agent-editor/flow-agent-editor.component.d.ts.map +1 -0
  16. package/dist/lib/agent-editor/flow-agent-editor.component.js +999 -0
  17. package/dist/lib/agent-editor/flow-agent-editor.component.js.map +1 -0
  18. package/dist/lib/components/flow-editor.component.d.ts +169 -0
  19. package/dist/lib/components/flow-editor.component.d.ts.map +1 -0
  20. package/dist/lib/components/flow-editor.component.js +1090 -0
  21. package/dist/lib/components/flow-editor.component.js.map +1 -0
  22. package/dist/lib/components/flow-node.component.d.ts +50 -0
  23. package/dist/lib/components/flow-node.component.d.ts.map +1 -0
  24. package/dist/lib/components/flow-node.component.js +358 -0
  25. package/dist/lib/components/flow-node.component.js.map +1 -0
  26. package/dist/lib/components/flow-palette.component.d.ts +17 -0
  27. package/dist/lib/components/flow-palette.component.d.ts.map +1 -0
  28. package/dist/lib/components/flow-palette.component.js +110 -0
  29. package/dist/lib/components/flow-palette.component.js.map +1 -0
  30. package/dist/lib/components/flow-status-bar.component.d.ts +13 -0
  31. package/dist/lib/components/flow-status-bar.component.d.ts.map +1 -0
  32. package/dist/lib/components/flow-status-bar.component.js +81 -0
  33. package/dist/lib/components/flow-status-bar.component.js.map +1 -0
  34. package/dist/lib/components/flow-toolbar.component.d.ts +25 -0
  35. package/dist/lib/components/flow-toolbar.component.d.ts.map +1 -0
  36. package/dist/lib/components/flow-toolbar.component.js +192 -0
  37. package/dist/lib/components/flow-toolbar.component.js.map +1 -0
  38. package/dist/lib/flow-editor.module.d.ts +19 -0
  39. package/dist/lib/flow-editor.module.d.ts.map +1 -0
  40. package/dist/lib/flow-editor.module.js +84 -0
  41. package/dist/lib/flow-editor.module.js.map +1 -0
  42. package/dist/lib/interfaces/flow-types.d.ts +153 -0
  43. package/dist/lib/interfaces/flow-types.d.ts.map +1 -0
  44. package/dist/lib/interfaces/flow-types.js +6 -0
  45. package/dist/lib/interfaces/flow-types.js.map +1 -0
  46. package/dist/lib/services/flow-layout.service.d.ts +21 -0
  47. package/dist/lib/services/flow-layout.service.d.ts.map +1 -0
  48. package/dist/lib/services/flow-layout.service.js +76 -0
  49. package/dist/lib/services/flow-layout.service.js.map +1 -0
  50. package/dist/lib/services/flow-state.service.d.ts +37 -0
  51. package/dist/lib/services/flow-state.service.d.ts.map +1 -0
  52. package/dist/lib/services/flow-state.service.js +89 -0
  53. package/dist/lib/services/flow-state.service.js.map +1 -0
  54. package/dist/public-api.d.ts +14 -0
  55. package/dist/public-api.d.ts.map +1 -0
  56. package/dist/public-api.js +22 -0
  57. package/dist/public-api.js.map +1 -0
  58. package/package.json +51 -6
@@ -0,0 +1,110 @@
1
+ import { Component, Input, ViewEncapsulation, ChangeDetectionStrategy } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/common";
4
+ import * as i2 from "@foblex/flow";
5
+ function FlowPaletteComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
6
+ i0.ɵɵelementStart(0, "span");
7
+ i0.ɵɵtext(1, "Steps");
8
+ i0.ɵɵelementEnd();
9
+ } }
10
+ function FlowPaletteComponent_Conditional_4_For_2_For_4_Template(rf, ctx) { if (rf & 1) {
11
+ i0.ɵɵelementStart(0, "div", 6)(1, "div", 7);
12
+ i0.ɵɵelement(2, "i", 8);
13
+ i0.ɵɵelementEnd();
14
+ i0.ɵɵelementStart(3, "span", 9);
15
+ i0.ɵɵtext(4);
16
+ i0.ɵɵelementEnd()();
17
+ } if (rf & 2) {
18
+ const nodeType_r1 = ctx.$implicit;
19
+ const ctx_r1 = i0.ɵɵnextContext(3);
20
+ i0.ɵɵproperty("fData", nodeType_r1.Type)("title", nodeType_r1.Label);
21
+ i0.ɵɵadvance();
22
+ i0.ɵɵstyleProp("background-color", ctx_r1.GetBgColor(nodeType_r1.Color, 0.08))("color", nodeType_r1.Color);
23
+ i0.ɵɵadvance();
24
+ i0.ɵɵproperty("ngClass", nodeType_r1.Icon);
25
+ i0.ɵɵadvance(2);
26
+ i0.ɵɵtextInterpolate(nodeType_r1.Label);
27
+ } }
28
+ function FlowPaletteComponent_Conditional_4_For_2_Template(rf, ctx) { if (rf & 1) {
29
+ i0.ɵɵelementStart(0, "div", 4)(1, "div", 5);
30
+ i0.ɵɵtext(2);
31
+ i0.ɵɵelementEnd();
32
+ i0.ɵɵrepeaterCreate(3, FlowPaletteComponent_Conditional_4_For_2_For_4_Template, 5, 8, "div", 6, i0.ɵɵrepeaterTrackByIdentity);
33
+ i0.ɵɵelementEnd();
34
+ } if (rf & 2) {
35
+ const category_r3 = ctx.$implicit;
36
+ const ctx_r1 = i0.ɵɵnextContext(2);
37
+ i0.ɵɵadvance(2);
38
+ i0.ɵɵtextInterpolate(category_r3);
39
+ i0.ɵɵadvance();
40
+ i0.ɵɵrepeater(ctx_r1.GetTypesForCategory(category_r3));
41
+ } }
42
+ function FlowPaletteComponent_Conditional_4_Template(rf, ctx) { if (rf & 1) {
43
+ i0.ɵɵelementStart(0, "div", 3);
44
+ i0.ɵɵrepeaterCreate(1, FlowPaletteComponent_Conditional_4_For_2_Template, 5, 1, "div", 4, i0.ɵɵrepeaterTrackByIdentity);
45
+ i0.ɵɵelementEnd();
46
+ } if (rf & 2) {
47
+ const ctx_r1 = i0.ɵɵnextContext();
48
+ i0.ɵɵadvance();
49
+ i0.ɵɵrepeater(ctx_r1.categories);
50
+ } }
51
+ /**
52
+ * Draggable palette sidebar for creating new nodes.
53
+ * Uses Foblex's fExternalItem directive to enable drag-to-canvas creation.
54
+ */
55
+ export class FlowPaletteComponent {
56
+ NodeTypes = [];
57
+ Collapsed = false;
58
+ get categories() {
59
+ const cats = new Set();
60
+ for (const nt of this.NodeTypes) {
61
+ if (nt.Draggable !== false) {
62
+ cats.add(nt.Category ?? 'General');
63
+ }
64
+ }
65
+ return Array.from(cats);
66
+ }
67
+ GetTypesForCategory(category) {
68
+ return this.NodeTypes.filter(nt => nt.Draggable !== false && (nt.Category ?? 'General') === category);
69
+ }
70
+ /** Converts a hex color to rgba with the given opacity for background tinting */
71
+ GetBgColor(hexColor, opacity) {
72
+ if (!hexColor)
73
+ return 'transparent';
74
+ // Handle standard 6-digit hex colors
75
+ const match = hexColor.match(/^#?([0-9a-fA-F]{6})$/);
76
+ if (match) {
77
+ const r = parseInt(match[1].substring(0, 2), 16);
78
+ const g = parseInt(match[1].substring(2, 4), 16);
79
+ const b = parseInt(match[1].substring(4, 6), 16);
80
+ return `rgba(${r}, ${g}, ${b}, ${opacity})`;
81
+ }
82
+ // Fallback: return the color as-is with opacity via CSS
83
+ return hexColor;
84
+ }
85
+ static ɵfac = function FlowPaletteComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || FlowPaletteComponent)(); };
86
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: FlowPaletteComponent, selectors: [["mj-flow-palette"]], inputs: { NodeTypes: "NodeTypes", Collapsed: "Collapsed" }, standalone: false, decls: 5, vars: 4, consts: [[1, "mj-flow-palette"], [1, "mj-flow-palette-header"], [1, "fa-solid", "fa-puzzle-piece"], [1, "mj-flow-palette-content"], [1, "mj-flow-palette-category"], [1, "mj-flow-palette-category-label"], ["fExternalItem", "", 1, "mj-flow-palette-item", 3, "fData", "title"], [1, "mj-flow-palette-item-icon"], [1, "fa-solid", 3, "ngClass"], [1, "mj-flow-palette-item-label"]], template: function FlowPaletteComponent_Template(rf, ctx) { if (rf & 1) {
87
+ i0.ɵɵelementStart(0, "div", 0)(1, "div", 1);
88
+ i0.ɵɵelement(2, "i", 2);
89
+ i0.ɵɵconditionalCreate(3, FlowPaletteComponent_Conditional_3_Template, 2, 0, "span");
90
+ i0.ɵɵelementEnd();
91
+ i0.ɵɵconditionalCreate(4, FlowPaletteComponent_Conditional_4_Template, 3, 0, "div", 3);
92
+ i0.ɵɵelementEnd();
93
+ } if (rf & 2) {
94
+ i0.ɵɵclassProp("mj-flow-palette--collapsed", ctx.Collapsed);
95
+ i0.ɵɵadvance(3);
96
+ i0.ɵɵconditional(!ctx.Collapsed ? 3 : -1);
97
+ i0.ɵɵadvance();
98
+ i0.ɵɵconditional(!ctx.Collapsed ? 4 : -1);
99
+ } }, dependencies: [i1.NgClass, i2.FExternalItemDirective], styles: ["/* ============================================================\n Flow Palette \u2014 Draggable node type sidebar\n ============================================================ */\n\n.mj-flow-palette {\n width: 180px;\n background: #ffffff;\n border-right: 1px solid #e2e8f0;\n display: flex;\n flex-direction: column;\n overflow-y: auto;\n flex-shrink: 0;\n transition: width 0.2s ease;\n}\n\n.mj-flow-palette--collapsed {\n width: 44px;\n}\n\n.mj-flow-palette--collapsed .mj-flow-palette-header {\n justify-content: center;\n padding: 10px 0;\n}\n\n.mj-flow-palette-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 14px;\n font-size: 12px;\n font-weight: 600;\n color: #64748b;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n border-bottom: 1px solid #f1f5f9;\n}\n\n.mj-flow-palette-header i {\n font-size: 13px;\n}\n\n.mj-flow-palette-content {\n padding: 8px;\n flex: 1;\n}\n\n.mj-flow-palette-category {\n margin-bottom: 12px;\n}\n\n.mj-flow-palette-category-label {\n font-size: 10px;\n font-weight: 600;\n color: #94a3b8;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n padding: 4px 6px;\n margin-bottom: 4px;\n}\n\n.mj-flow-palette-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px 10px;\n border-radius: 8px;\n cursor: grab;\n transition: background-color 0.15s ease, box-shadow 0.15s ease;\n user-select: none;\n}\n\n.mj-flow-palette-item:hover {\n background: #f8fafc;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06);\n}\n\n.mj-flow-palette-item:active {\n cursor: grabbing;\n background: #f1f5f9;\n}\n\n.mj-flow-palette-item-icon {\n width: 32px;\n height: 32px;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 14px;\n flex-shrink: 0;\n}\n\n.mj-flow-palette-item-label {\n font-size: 13px;\n font-weight: 500;\n color: #334155;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n"], encapsulation: 2, changeDetection: 0 });
100
+ }
101
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(FlowPaletteComponent, [{
102
+ type: Component,
103
+ args: [{ standalone: false, selector: 'mj-flow-palette', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"mj-flow-palette\" [class.mj-flow-palette--collapsed]=\"Collapsed\">\n <div class=\"mj-flow-palette-header\">\n <i class=\"fa-solid fa-puzzle-piece\"></i>\n @if (!Collapsed) {\n <span>Steps</span>\n }\n </div>\n\n @if (!Collapsed) {\n <div class=\"mj-flow-palette-content\">\n @for (category of categories; track category) {\n <div class=\"mj-flow-palette-category\">\n <div class=\"mj-flow-palette-category-label\">{{ category }}</div>\n @for (nodeType of GetTypesForCategory(category); track nodeType) {\n <div\n class=\"mj-flow-palette-item\"\n fExternalItem\n [fData]=\"nodeType.Type\"\n [title]=\"nodeType.Label\">\n <div class=\"mj-flow-palette-item-icon\" [style.backgroundColor]=\"GetBgColor(nodeType.Color, 0.08)\" [style.color]=\"nodeType.Color\">\n <i class=\"fa-solid\" [ngClass]=\"nodeType.Icon\"></i>\n </div>\n <span class=\"mj-flow-palette-item-label\">{{ nodeType.Label }}</span>\n </div>\n }\n </div>\n }\n </div>\n }\n</div>\n", styles: ["/* ============================================================\n Flow Palette \u2014 Draggable node type sidebar\n ============================================================ */\n\n.mj-flow-palette {\n width: 180px;\n background: #ffffff;\n border-right: 1px solid #e2e8f0;\n display: flex;\n flex-direction: column;\n overflow-y: auto;\n flex-shrink: 0;\n transition: width 0.2s ease;\n}\n\n.mj-flow-palette--collapsed {\n width: 44px;\n}\n\n.mj-flow-palette--collapsed .mj-flow-palette-header {\n justify-content: center;\n padding: 10px 0;\n}\n\n.mj-flow-palette-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 14px;\n font-size: 12px;\n font-weight: 600;\n color: #64748b;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n border-bottom: 1px solid #f1f5f9;\n}\n\n.mj-flow-palette-header i {\n font-size: 13px;\n}\n\n.mj-flow-palette-content {\n padding: 8px;\n flex: 1;\n}\n\n.mj-flow-palette-category {\n margin-bottom: 12px;\n}\n\n.mj-flow-palette-category-label {\n font-size: 10px;\n font-weight: 600;\n color: #94a3b8;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n padding: 4px 6px;\n margin-bottom: 4px;\n}\n\n.mj-flow-palette-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px 10px;\n border-radius: 8px;\n cursor: grab;\n transition: background-color 0.15s ease, box-shadow 0.15s ease;\n user-select: none;\n}\n\n.mj-flow-palette-item:hover {\n background: #f8fafc;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06);\n}\n\n.mj-flow-palette-item:active {\n cursor: grabbing;\n background: #f1f5f9;\n}\n\n.mj-flow-palette-item-icon {\n width: 32px;\n height: 32px;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 14px;\n flex-shrink: 0;\n}\n\n.mj-flow-palette-item-label {\n font-size: 13px;\n font-weight: 500;\n color: #334155;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n"] }]
104
+ }], null, { NodeTypes: [{
105
+ type: Input
106
+ }], Collapsed: [{
107
+ type: Input
108
+ }] }); })();
109
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(FlowPaletteComponent, { className: "FlowPaletteComponent", filePath: "src/lib/components/flow-palette.component.ts", lineNumber: 16 }); })();
110
+ //# sourceMappingURL=flow-palette.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow-palette.component.js","sourceRoot":"","sources":["../../../src/lib/components/flow-palette.component.ts","../../../src/lib/components/flow-palette.component.html"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import * as i0 from "@angular/core";
2
+ /**
3
+ * Status bar at the bottom of the flow editor showing counts and state.
4
+ */
5
+ export declare class FlowStatusBarComponent {
6
+ NodeCount: number;
7
+ ConnectionCount: number;
8
+ SelectedCount: number;
9
+ ZoomLevel: number;
10
+ static ɵfac: i0.ɵɵFactoryDeclaration<FlowStatusBarComponent, never>;
11
+ static ɵcmp: i0.ɵɵComponentDeclaration<FlowStatusBarComponent, "mj-flow-status-bar", never, { "NodeCount": { "alias": "NodeCount"; "required": false; }; "ConnectionCount": { "alias": "ConnectionCount"; "required": false; }; "SelectedCount": { "alias": "SelectedCount"; "required": false; }; "ZoomLevel": { "alias": "ZoomLevel"; "required": false; }; }, {}, never, never, false, never>;
12
+ }
13
+ //# sourceMappingURL=flow-status-bar.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow-status-bar.component.d.ts","sourceRoot":"","sources":["../../../src/lib/components/flow-status-bar.component.ts"],"names":[],"mappings":";AAEA;;GAEG;AACH,qBAsDa,sBAAsB;IACxB,SAAS,SAAK;IACd,eAAe,SAAK;IACpB,aAAa,SAAK;IAClB,SAAS,SAAO;yCAJd,sBAAsB;2CAAtB,sBAAsB;CAKlC"}
@@ -0,0 +1,81 @@
1
+ import { Component, Input, ViewEncapsulation, ChangeDetectionStrategy } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ function FlowStatusBarComponent_Conditional_7_Template(rf, ctx) { if (rf & 1) {
4
+ i0.ɵɵelementStart(0, "span", 1);
5
+ i0.ɵɵelement(1, "i", 6);
6
+ i0.ɵɵtext(2);
7
+ i0.ɵɵelementEnd();
8
+ } if (rf & 2) {
9
+ const ctx_r0 = i0.ɵɵnextContext();
10
+ i0.ɵɵadvance(2);
11
+ i0.ɵɵtextInterpolate1(" ", ctx_r0.SelectedCount, " selected ");
12
+ } }
13
+ /**
14
+ * Status bar at the bottom of the flow editor showing counts and state.
15
+ */
16
+ export class FlowStatusBarComponent {
17
+ NodeCount = 0;
18
+ ConnectionCount = 0;
19
+ SelectedCount = 0;
20
+ ZoomLevel = 100;
21
+ static ɵfac = function FlowStatusBarComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || FlowStatusBarComponent)(); };
22
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: FlowStatusBarComponent, selectors: [["mj-flow-status-bar"]], inputs: { NodeCount: "NodeCount", ConnectionCount: "ConnectionCount", SelectedCount: "SelectedCount", ZoomLevel: "ZoomLevel" }, standalone: false, decls: 11, vars: 6, consts: [[1, "mj-flow-status-bar"], [1, "mj-flow-status-item"], [1, "fa-solid", "fa-circle-nodes"], [1, "fa-solid", "fa-link"], [1, "mj-flow-status-item", "mj-flow-status-item--right"], [1, "fa-solid", "fa-magnifying-glass"], [1, "fa-solid", "fa-check-square"]], template: function FlowStatusBarComponent_Template(rf, ctx) { if (rf & 1) {
23
+ i0.ɵɵelementStart(0, "div", 0)(1, "span", 1);
24
+ i0.ɵɵelement(2, "i", 2);
25
+ i0.ɵɵtext(3);
26
+ i0.ɵɵelementEnd();
27
+ i0.ɵɵelementStart(4, "span", 1);
28
+ i0.ɵɵelement(5, "i", 3);
29
+ i0.ɵɵtext(6);
30
+ i0.ɵɵelementEnd();
31
+ i0.ɵɵconditionalCreate(7, FlowStatusBarComponent_Conditional_7_Template, 3, 1, "span", 1);
32
+ i0.ɵɵelementStart(8, "span", 4);
33
+ i0.ɵɵelement(9, "i", 5);
34
+ i0.ɵɵtext(10);
35
+ i0.ɵɵelementEnd()();
36
+ } if (rf & 2) {
37
+ i0.ɵɵadvance(3);
38
+ i0.ɵɵtextInterpolate2(" ", ctx.NodeCount, " ", ctx.NodeCount === 1 ? "node" : "nodes", " ");
39
+ i0.ɵɵadvance(3);
40
+ i0.ɵɵtextInterpolate2(" ", ctx.ConnectionCount, " ", ctx.ConnectionCount === 1 ? "connection" : "connections", " ");
41
+ i0.ɵɵadvance();
42
+ i0.ɵɵconditional(ctx.SelectedCount > 0 ? 7 : -1);
43
+ i0.ɵɵadvance(3);
44
+ i0.ɵɵtextInterpolate1(" ", ctx.ZoomLevel, "% ");
45
+ } }, styles: ["\n .mj-flow-status-bar {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 4px 14px;\n background: #f8fafc;\n border-top: 1px solid #e2e8f0;\n font-size: 11px;\n color: #64748b;\n flex-shrink: 0;\n min-height: 28px;\n }\n\n .mj-flow-status-item {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n\n i { font-size: 10px; }\n\n &--right {\n margin-left: auto;\n }\n }\n "], encapsulation: 2, changeDetection: 0 });
46
+ }
47
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(FlowStatusBarComponent, [{
48
+ type: Component,
49
+ args: [{ standalone: false, selector: 'mj-flow-status-bar', template: `
50
+ <div class="mj-flow-status-bar">
51
+ <span class="mj-flow-status-item">
52
+ <i class="fa-solid fa-circle-nodes"></i>
53
+ {{ NodeCount }} {{ NodeCount === 1 ? 'node' : 'nodes' }}
54
+ </span>
55
+ <span class="mj-flow-status-item">
56
+ <i class="fa-solid fa-link"></i>
57
+ {{ ConnectionCount }} {{ ConnectionCount === 1 ? 'connection' : 'connections' }}
58
+ </span>
59
+ @if (SelectedCount > 0) {
60
+ <span class="mj-flow-status-item">
61
+ <i class="fa-solid fa-check-square"></i>
62
+ {{ SelectedCount }} selected
63
+ </span>
64
+ }
65
+ <span class="mj-flow-status-item mj-flow-status-item--right">
66
+ <i class="fa-solid fa-magnifying-glass"></i>
67
+ {{ ZoomLevel }}%
68
+ </span>
69
+ </div>
70
+ `, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, styles: ["\n .mj-flow-status-bar {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 4px 14px;\n background: #f8fafc;\n border-top: 1px solid #e2e8f0;\n font-size: 11px;\n color: #64748b;\n flex-shrink: 0;\n min-height: 28px;\n }\n\n .mj-flow-status-item {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n\n i { font-size: 10px; }\n\n &--right {\n margin-left: auto;\n }\n }\n "] }]
71
+ }], null, { NodeCount: [{
72
+ type: Input
73
+ }], ConnectionCount: [{
74
+ type: Input
75
+ }], SelectedCount: [{
76
+ type: Input
77
+ }], ZoomLevel: [{
78
+ type: Input
79
+ }] }); })();
80
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(FlowStatusBarComponent, { className: "FlowStatusBarComponent", filePath: "src/lib/components/flow-status-bar.component.ts", lineNumber: 60 }); })();
81
+ //# sourceMappingURL=flow-status-bar.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow-status-bar.component.js","sourceRoot":"","sources":["../../../src/lib/components/flow-status-bar.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;;;IAmBrF,+BAAkC;IAChC,uBAAwC;IACxC,YACF;IAAA,iBAAO;;;IADL,eACF;IADE,8DACF;;AApBR;;GAEG;AAuDH,MAAM,OAAO,sBAAsB;IACxB,SAAS,GAAG,CAAC,CAAC;IACd,eAAe,GAAG,CAAC,CAAC;IACpB,aAAa,GAAG,CAAC,CAAC;IAClB,SAAS,GAAG,GAAG,CAAC;gHAJd,sBAAsB;6DAAtB,sBAAsB;YAjD7B,AADF,8BAAgC,cACI;YAChC,uBAAwC;YACxC,YACF;YAAA,iBAAO;YACP,+BAAkC;YAChC,uBAAgC;YAChC,YACF;YAAA,iBAAO;YACP,yFAAyB;YAMzB,+BAA6D;YAC3D,uBAA4C;YAC5C,aACF;YACF,AADE,iBAAO,EACH;;YAhBF,eACF;YADE,2FACF;YAGE,eACF;YADE,mHACF;YACA,cAKC;YALD,gDAKC;YAGC,eACF;YADE,+CACF;;;iFAgCO,sBAAsB;cAtDlC,SAAS;6BACI,KAAK,YACP,oBAAoB,YACpB;;;;;;;;;;;;;;;;;;;;;KAqBP,iBA2BY,iBAAiB,CAAC,IAAI,mBACpB,uBAAuB,CAAC,MAAM;;kBAG9C,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kFAJK,sBAAsB"}
@@ -0,0 +1,25 @@
1
+ import { EventEmitter } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * Internal toolbar for the generic flow editor canvas controls.
5
+ * Provides zoom, fit-to-screen, auto-layout, and grid/minimap toggles.
6
+ */
7
+ export declare class FlowToolbarComponent {
8
+ ZoomLevel: number;
9
+ ShowGrid: boolean;
10
+ ShowMinimap: boolean;
11
+ ShowLegend: boolean;
12
+ ReadOnly: boolean;
13
+ PanMode: boolean;
14
+ ZoomInClicked: EventEmitter<void>;
15
+ ZoomOutClicked: EventEmitter<void>;
16
+ FitToScreenClicked: EventEmitter<void>;
17
+ AutoLayoutClicked: EventEmitter<void>;
18
+ GridToggled: EventEmitter<boolean>;
19
+ MinimapToggled: EventEmitter<boolean>;
20
+ LegendToggled: EventEmitter<boolean>;
21
+ PanModeToggled: EventEmitter<boolean>;
22
+ static ɵfac: i0.ɵɵFactoryDeclaration<FlowToolbarComponent, never>;
23
+ static ɵcmp: i0.ɵɵComponentDeclaration<FlowToolbarComponent, "mj-flow-toolbar", never, { "ZoomLevel": { "alias": "ZoomLevel"; "required": false; }; "ShowGrid": { "alias": "ShowGrid"; "required": false; }; "ShowMinimap": { "alias": "ShowMinimap"; "required": false; }; "ShowLegend": { "alias": "ShowLegend"; "required": false; }; "ReadOnly": { "alias": "ReadOnly"; "required": false; }; "PanMode": { "alias": "PanMode"; "required": false; }; }, { "ZoomInClicked": "ZoomInClicked"; "ZoomOutClicked": "ZoomOutClicked"; "FitToScreenClicked": "FitToScreenClicked"; "AutoLayoutClicked": "AutoLayoutClicked"; "GridToggled": "GridToggled"; "MinimapToggled": "MinimapToggled"; "LegendToggled": "LegendToggled"; "PanModeToggled": "PanModeToggled"; }, never, never, false, never>;
24
+ }
25
+ //# sourceMappingURL=flow-toolbar.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow-toolbar.component.d.ts","sourceRoot":"","sources":["../../../src/lib/components/flow-toolbar.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAA8C,MAAM,eAAe,CAAC;;AAEnH;;;GAGG;AACH,qBA0Ia,oBAAoB;IACtB,SAAS,SAAO;IAChB,QAAQ,UAAQ;IAChB,WAAW,UAAQ;IACnB,UAAU,UAAQ;IAClB,QAAQ,UAAS;IACjB,OAAO,UAAS;IAEf,aAAa,qBAA4B;IACzC,cAAc,qBAA4B;IAC1C,kBAAkB,qBAA4B;IAC9C,iBAAiB,qBAA4B;IAC7C,WAAW,wBAA+B;IAC1C,cAAc,wBAA+B;IAC7C,aAAa,wBAA+B;IAC5C,cAAc,wBAA+B;yCAf5C,oBAAoB;2CAApB,oBAAoB;CAgBhC"}
@@ -0,0 +1,192 @@
1
+ import { Component, Input, Output, EventEmitter, ViewEncapsulation, ChangeDetectionStrategy } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ function FlowToolbarComponent_Conditional_16_Template(rf, ctx) { if (rf & 1) {
4
+ i0.ɵɵelement(0, "div", 9);
5
+ } }
6
+ function FlowToolbarComponent_Conditional_17_Template(rf, ctx) { if (rf & 1) {
7
+ const _r1 = i0.ɵɵgetCurrentView();
8
+ i0.ɵɵelementStart(0, "div", 1)(1, "button", 20);
9
+ i0.ɵɵlistener("click", function FlowToolbarComponent_Conditional_17_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.AutoLayoutClicked.emit()); });
10
+ i0.ɵɵelement(2, "i", 21);
11
+ i0.ɵɵelementEnd()();
12
+ } }
13
+ /**
14
+ * Internal toolbar for the generic flow editor canvas controls.
15
+ * Provides zoom, fit-to-screen, auto-layout, and grid/minimap toggles.
16
+ */
17
+ export class FlowToolbarComponent {
18
+ ZoomLevel = 100;
19
+ ShowGrid = true;
20
+ ShowMinimap = true;
21
+ ShowLegend = true;
22
+ ReadOnly = false;
23
+ PanMode = false;
24
+ ZoomInClicked = new EventEmitter();
25
+ ZoomOutClicked = new EventEmitter();
26
+ FitToScreenClicked = new EventEmitter();
27
+ AutoLayoutClicked = new EventEmitter();
28
+ GridToggled = new EventEmitter();
29
+ MinimapToggled = new EventEmitter();
30
+ LegendToggled = new EventEmitter();
31
+ PanModeToggled = new EventEmitter();
32
+ static ɵfac = function FlowToolbarComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || FlowToolbarComponent)(); };
33
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: FlowToolbarComponent, selectors: [["mj-flow-toolbar"]], inputs: { ZoomLevel: "ZoomLevel", ShowGrid: "ShowGrid", ShowMinimap: "ShowMinimap", ShowLegend: "ShowLegend", ReadOnly: "ReadOnly", PanMode: "PanMode" }, outputs: { ZoomInClicked: "ZoomInClicked", ZoomOutClicked: "ZoomOutClicked", FitToScreenClicked: "FitToScreenClicked", AutoLayoutClicked: "AutoLayoutClicked", GridToggled: "GridToggled", MinimapToggled: "MinimapToggled", LegendToggled: "LegendToggled", PanModeToggled: "PanModeToggled" }, standalone: false, decls: 26, vars: 13, consts: [[1, "mj-flow-toolbar"], [1, "mj-flow-toolbar-group"], ["title", "Zoom In", 1, "mj-flow-toolbar-btn", 3, "click"], [1, "fa-solid", "fa-magnifying-glass-plus"], [1, "mj-flow-toolbar-zoom"], ["title", "Zoom Out", 1, "mj-flow-toolbar-btn", 3, "click"], [1, "fa-solid", "fa-magnifying-glass-minus"], ["title", "Fit to Screen", 1, "mj-flow-toolbar-btn", 3, "click"], [1, "fa-solid", "fa-expand"], [1, "mj-flow-toolbar-divider"], ["title", "Select Mode (pointer)", 1, "mj-flow-toolbar-btn", 3, "click"], [1, "fa-solid", "fa-arrow-pointer"], ["title", "Pan Mode (drag to move canvas)", 1, "mj-flow-toolbar-btn", 3, "click"], [1, "fa-solid", "fa-hand"], ["title", "Toggle Grid", 1, "mj-flow-toolbar-btn", 3, "click"], [1, "fa-solid", "fa-border-all"], ["title", "Toggle Minimap", 1, "mj-flow-toolbar-btn", 3, "click"], [1, "fa-solid", "fa-map"], ["title", "Toggle Legend", 1, "mj-flow-toolbar-btn", 3, "click"], [1, "fa-solid", "fa-list-check"], ["title", "Auto Arrange", 1, "mj-flow-toolbar-btn", 3, "click"], [1, "fa-solid", "fa-diagram-project"]], template: function FlowToolbarComponent_Template(rf, ctx) { if (rf & 1) {
34
+ i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "button", 2);
35
+ i0.ɵɵlistener("click", function FlowToolbarComponent_Template_button_click_2_listener() { return ctx.ZoomInClicked.emit(); });
36
+ i0.ɵɵelement(3, "i", 3);
37
+ i0.ɵɵelementEnd();
38
+ i0.ɵɵelementStart(4, "span", 4);
39
+ i0.ɵɵtext(5);
40
+ i0.ɵɵelementEnd();
41
+ i0.ɵɵelementStart(6, "button", 5);
42
+ i0.ɵɵlistener("click", function FlowToolbarComponent_Template_button_click_6_listener() { return ctx.ZoomOutClicked.emit(); });
43
+ i0.ɵɵelement(7, "i", 6);
44
+ i0.ɵɵelementEnd();
45
+ i0.ɵɵelementStart(8, "button", 7);
46
+ i0.ɵɵlistener("click", function FlowToolbarComponent_Template_button_click_8_listener() { return ctx.FitToScreenClicked.emit(); });
47
+ i0.ɵɵelement(9, "i", 8);
48
+ i0.ɵɵelementEnd()();
49
+ i0.ɵɵelement(10, "div", 9);
50
+ i0.ɵɵelementStart(11, "div", 1)(12, "button", 10);
51
+ i0.ɵɵlistener("click", function FlowToolbarComponent_Template_button_click_12_listener() { return ctx.PanModeToggled.emit(false); });
52
+ i0.ɵɵelement(13, "i", 11);
53
+ i0.ɵɵelementEnd();
54
+ i0.ɵɵelementStart(14, "button", 12);
55
+ i0.ɵɵlistener("click", function FlowToolbarComponent_Template_button_click_14_listener() { return ctx.PanModeToggled.emit(true); });
56
+ i0.ɵɵelement(15, "i", 13);
57
+ i0.ɵɵelementEnd()();
58
+ i0.ɵɵconditionalCreate(16, FlowToolbarComponent_Conditional_16_Template, 1, 0, "div", 9);
59
+ i0.ɵɵconditionalCreate(17, FlowToolbarComponent_Conditional_17_Template, 3, 0, "div", 1);
60
+ i0.ɵɵelement(18, "div", 9);
61
+ i0.ɵɵelementStart(19, "div", 1)(20, "button", 14);
62
+ i0.ɵɵlistener("click", function FlowToolbarComponent_Template_button_click_20_listener() { return ctx.GridToggled.emit(!ctx.ShowGrid); });
63
+ i0.ɵɵelement(21, "i", 15);
64
+ i0.ɵɵelementEnd();
65
+ i0.ɵɵelementStart(22, "button", 16);
66
+ i0.ɵɵlistener("click", function FlowToolbarComponent_Template_button_click_22_listener() { return ctx.MinimapToggled.emit(!ctx.ShowMinimap); });
67
+ i0.ɵɵelement(23, "i", 17);
68
+ i0.ɵɵelementEnd();
69
+ i0.ɵɵelementStart(24, "button", 18);
70
+ i0.ɵɵlistener("click", function FlowToolbarComponent_Template_button_click_24_listener() { return ctx.LegendToggled.emit(!ctx.ShowLegend); });
71
+ i0.ɵɵelement(25, "i", 19);
72
+ i0.ɵɵelementEnd()()();
73
+ } if (rf & 2) {
74
+ i0.ɵɵadvance(5);
75
+ i0.ɵɵtextInterpolate1("", ctx.ZoomLevel, "%");
76
+ i0.ɵɵadvance(7);
77
+ i0.ɵɵclassProp("mj-flow-toolbar-btn--active", !ctx.PanMode);
78
+ i0.ɵɵadvance(2);
79
+ i0.ɵɵclassProp("mj-flow-toolbar-btn--active", ctx.PanMode);
80
+ i0.ɵɵadvance(2);
81
+ i0.ɵɵconditional(!ctx.ReadOnly ? 16 : -1);
82
+ i0.ɵɵadvance();
83
+ i0.ɵɵconditional(!ctx.ReadOnly ? 17 : -1);
84
+ i0.ɵɵadvance(3);
85
+ i0.ɵɵclassProp("mj-flow-toolbar-btn--active", ctx.ShowGrid);
86
+ i0.ɵɵadvance(2);
87
+ i0.ɵɵclassProp("mj-flow-toolbar-btn--active", ctx.ShowMinimap);
88
+ i0.ɵɵadvance(2);
89
+ i0.ɵɵclassProp("mj-flow-toolbar-btn--active", ctx.ShowLegend);
90
+ } }, styles: ["\n .mj-flow-toolbar {\n display: flex;\n align-items: center;\n gap: 2px;\n padding: 4px 8px;\n background: #ffffff;\n border: 1px solid #e2e8f0;\n border-radius: 8px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06);\n }\n\n .mj-flow-toolbar-group {\n display: flex;\n align-items: center;\n gap: 2px;\n }\n\n .mj-flow-toolbar-divider {\n width: 1px;\n height: 20px;\n background: #e2e8f0;\n margin: 0 4px;\n }\n\n .mj-flow-toolbar-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n border: none;\n border-radius: 6px;\n background: transparent;\n color: #64748b;\n cursor: pointer;\n transition: all 0.15s ease;\n font-size: 13px;\n }\n\n .mj-flow-toolbar-btn:hover {\n background: #f1f5f9;\n color: #334155;\n }\n\n .mj-flow-toolbar-btn--active {\n background: #eff6ff;\n color: #3b82f6;\n }\n\n .mj-flow-toolbar-btn--active:hover {\n background: #dbeafe;\n color: #2563eb;\n }\n\n .mj-flow-toolbar-zoom {\n font-size: 11px;\n font-weight: 500;\n color: #64748b;\n min-width: 38px;\n text-align: center;\n user-select: none;\n }\n "], encapsulation: 2, changeDetection: 0 });
91
+ }
92
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(FlowToolbarComponent, [{
93
+ type: Component,
94
+ args: [{ standalone: false, selector: 'mj-flow-toolbar', template: `
95
+ <div class="mj-flow-toolbar">
96
+ <div class="mj-flow-toolbar-group">
97
+ <button class="mj-flow-toolbar-btn" (click)="ZoomInClicked.emit()" title="Zoom In">
98
+ <i class="fa-solid fa-magnifying-glass-plus"></i>
99
+ </button>
100
+ <span class="mj-flow-toolbar-zoom">{{ ZoomLevel }}%</span>
101
+ <button class="mj-flow-toolbar-btn" (click)="ZoomOutClicked.emit()" title="Zoom Out">
102
+ <i class="fa-solid fa-magnifying-glass-minus"></i>
103
+ </button>
104
+ <button class="mj-flow-toolbar-btn" (click)="FitToScreenClicked.emit()" title="Fit to Screen">
105
+ <i class="fa-solid fa-expand"></i>
106
+ </button>
107
+ </div>
108
+
109
+ <div class="mj-flow-toolbar-divider"></div>
110
+
111
+ <div class="mj-flow-toolbar-group">
112
+ <button class="mj-flow-toolbar-btn"
113
+ [class.mj-flow-toolbar-btn--active]="!PanMode"
114
+ (click)="PanModeToggled.emit(false)"
115
+ title="Select Mode (pointer)">
116
+ <i class="fa-solid fa-arrow-pointer"></i>
117
+ </button>
118
+ <button class="mj-flow-toolbar-btn"
119
+ [class.mj-flow-toolbar-btn--active]="PanMode"
120
+ (click)="PanModeToggled.emit(true)"
121
+ title="Pan Mode (drag to move canvas)">
122
+ <i class="fa-solid fa-hand"></i>
123
+ </button>
124
+ </div>
125
+
126
+ @if (!ReadOnly) {
127
+ <div class="mj-flow-toolbar-divider"></div>
128
+ }
129
+
130
+ @if (!ReadOnly) {
131
+ <div class="mj-flow-toolbar-group">
132
+ <button class="mj-flow-toolbar-btn" (click)="AutoLayoutClicked.emit()" title="Auto Arrange">
133
+ <i class="fa-solid fa-diagram-project"></i>
134
+ </button>
135
+ </div>
136
+ }
137
+
138
+ <div class="mj-flow-toolbar-divider"></div>
139
+
140
+ <div class="mj-flow-toolbar-group">
141
+ <button class="mj-flow-toolbar-btn"
142
+ [class.mj-flow-toolbar-btn--active]="ShowGrid"
143
+ (click)="GridToggled.emit(!ShowGrid)"
144
+ title="Toggle Grid">
145
+ <i class="fa-solid fa-border-all"></i>
146
+ </button>
147
+ <button class="mj-flow-toolbar-btn"
148
+ [class.mj-flow-toolbar-btn--active]="ShowMinimap"
149
+ (click)="MinimapToggled.emit(!ShowMinimap)"
150
+ title="Toggle Minimap">
151
+ <i class="fa-solid fa-map"></i>
152
+ </button>
153
+ <button class="mj-flow-toolbar-btn"
154
+ [class.mj-flow-toolbar-btn--active]="ShowLegend"
155
+ (click)="LegendToggled.emit(!ShowLegend)"
156
+ title="Toggle Legend">
157
+ <i class="fa-solid fa-list-check"></i>
158
+ </button>
159
+ </div>
160
+ </div>
161
+ `, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, styles: ["\n .mj-flow-toolbar {\n display: flex;\n align-items: center;\n gap: 2px;\n padding: 4px 8px;\n background: #ffffff;\n border: 1px solid #e2e8f0;\n border-radius: 8px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06);\n }\n\n .mj-flow-toolbar-group {\n display: flex;\n align-items: center;\n gap: 2px;\n }\n\n .mj-flow-toolbar-divider {\n width: 1px;\n height: 20px;\n background: #e2e8f0;\n margin: 0 4px;\n }\n\n .mj-flow-toolbar-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n border: none;\n border-radius: 6px;\n background: transparent;\n color: #64748b;\n cursor: pointer;\n transition: all 0.15s ease;\n font-size: 13px;\n }\n\n .mj-flow-toolbar-btn:hover {\n background: #f1f5f9;\n color: #334155;\n }\n\n .mj-flow-toolbar-btn--active {\n background: #eff6ff;\n color: #3b82f6;\n }\n\n .mj-flow-toolbar-btn--active:hover {\n background: #dbeafe;\n color: #2563eb;\n }\n\n .mj-flow-toolbar-zoom {\n font-size: 11px;\n font-weight: 500;\n color: #64748b;\n min-width: 38px;\n text-align: center;\n user-select: none;\n }\n "] }]
162
+ }], null, { ZoomLevel: [{
163
+ type: Input
164
+ }], ShowGrid: [{
165
+ type: Input
166
+ }], ShowMinimap: [{
167
+ type: Input
168
+ }], ShowLegend: [{
169
+ type: Input
170
+ }], ReadOnly: [{
171
+ type: Input
172
+ }], PanMode: [{
173
+ type: Input
174
+ }], ZoomInClicked: [{
175
+ type: Output
176
+ }], ZoomOutClicked: [{
177
+ type: Output
178
+ }], FitToScreenClicked: [{
179
+ type: Output
180
+ }], AutoLayoutClicked: [{
181
+ type: Output
182
+ }], GridToggled: [{
183
+ type: Output
184
+ }], MinimapToggled: [{
185
+ type: Output
186
+ }], LegendToggled: [{
187
+ type: Output
188
+ }], PanModeToggled: [{
189
+ type: Output
190
+ }] }); })();
191
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(FlowToolbarComponent, { className: "FlowToolbarComponent", filePath: "src/lib/components/flow-toolbar.component.ts", lineNumber: 145 }); })();
192
+ //# sourceMappingURL=flow-toolbar.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow-toolbar.component.js","sourceRoot":"","sources":["../../../src/lib/components/flow-toolbar.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;;;IA0C3G,yBAA2C;;;;IAKzC,AADF,8BAAmC,iBAC2D;IAAxD,yLAAS,+BAAwB,KAAC;IACpE,wBAA2C;IAE/C,AADE,iBAAS,EACL;;AAhDd;;;GAGG;AA2IH,MAAM,OAAO,oBAAoB;IACtB,SAAS,GAAG,GAAG,CAAC;IAChB,QAAQ,GAAG,IAAI,CAAC;IAChB,WAAW,GAAG,IAAI,CAAC;IACnB,UAAU,GAAG,IAAI,CAAC;IAClB,QAAQ,GAAG,KAAK,CAAC;IACjB,OAAO,GAAG,KAAK,CAAC;IAEf,aAAa,GAAG,IAAI,YAAY,EAAQ,CAAC;IACzC,cAAc,GAAG,IAAI,YAAY,EAAQ,CAAC;IAC1C,kBAAkB,GAAG,IAAI,YAAY,EAAQ,CAAC;IAC9C,iBAAiB,GAAG,IAAI,YAAY,EAAQ,CAAC;IAC7C,WAAW,GAAG,IAAI,YAAY,EAAW,CAAC;IAC1C,cAAc,GAAG,IAAI,YAAY,EAAW,CAAC;IAC7C,aAAa,GAAG,IAAI,YAAY,EAAW,CAAC;IAC5C,cAAc,GAAG,IAAI,YAAY,EAAW,CAAC;8GAf5C,oBAAoB;6DAApB,oBAAoB;YApIzB,AADF,AADF,8BAA6B,aACQ,gBACkD;YAA/C,iGAAS,wBAAoB,IAAC;YAChE,uBAAiD;YACnD,iBAAS;YACT,+BAAmC;YAAA,YAAgB;YAAA,iBAAO;YAC1D,iCAAqF;YAAjD,iGAAS,yBAAqB,IAAC;YACjE,uBAAkD;YACpD,iBAAS;YACT,iCAA8F;YAA1D,iGAAS,6BAAyB,IAAC;YACrE,uBAAkC;YAEtC,AADE,iBAAS,EACL;YAEN,0BAA2C;YAGzC,AADF,+BAAmC,kBAID;YAD9B,kGAAS,wBAAoB,KAAK,CAAC,IAAC;YAEpC,yBAAyC;YAC3C,iBAAS;YACT,mCAGyC;YADvC,kGAAS,wBAAoB,IAAI,CAAC,IAAC;YAEnC,yBAAgC;YAEpC,AADE,iBAAS,EACL;YAEN,wFAAiB;YAIjB,wFAAiB;YAQjB,0BAA2C;YAGzC,AADF,+BAAmC,kBAIX;YADpB,kGAAS,mCAA2B,IAAC;YAErC,yBAAsC;YACxC,iBAAS;YACT,mCAGyB;YADvB,kGAAS,yCAAiC,IAAC;YAE3C,yBAA+B;YACjC,iBAAS;YACT,mCAGwB;YADtB,kGAAS,uCAA+B,IAAC;YAEzC,yBAAsC;YAG5C,AADE,AADE,iBAAS,EACL,EACF;;YA5DiC,eAAgB;YAAhB,6CAAgB;YAajD,eAA8C;YAA9C,2DAA8C;YAM9C,eAA6C;YAA7C,0DAA6C;YAOjD,eAEC;YAFD,yCAEC;YAED,cAMC;YAND,yCAMC;YAMG,eAA8C;YAA9C,2DAA8C;YAM9C,eAAiD;YAAjD,8DAAiD;YAMjD,eAAgD;YAAhD,6DAAgD;;;iFA2E7C,oBAAoB;cA1IhC,SAAS;6BACI,KAAK,YACP,iBAAiB,YACjB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAmEP,iBAiEY,iBAAiB,CAAC,IAAI,mBACpB,uBAAuB,CAAC,MAAM;;kBAG9C,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBAEL,MAAM;;kBACN,MAAM;;kBACN,MAAM;;kBACN,MAAM;;kBACN,MAAM;;kBACN,MAAM;;kBACN,MAAM;;kBACN,MAAM;;kFAfI,oBAAoB"}
@@ -0,0 +1,19 @@
1
+ import * as i0 from "@angular/core";
2
+ import * as i1 from "./components/flow-editor.component";
3
+ import * as i2 from "./components/flow-node.component";
4
+ import * as i3 from "./components/flow-palette.component";
5
+ import * as i4 from "./components/flow-toolbar.component";
6
+ import * as i5 from "./components/flow-status-bar.component";
7
+ import * as i6 from "./agent-editor/flow-agent-editor.component";
8
+ import * as i7 from "./agent-editor/agent-properties-panel.component";
9
+ import * as i8 from "./agent-editor/agent-step-list.component";
10
+ import * as i9 from "@angular/common";
11
+ import * as i10 from "@angular/forms";
12
+ import * as i11 from "@foblex/flow";
13
+ import * as i12 from "@memberjunction/ng-code-editor";
14
+ export declare class FlowEditorModule {
15
+ static ɵfac: i0.ɵɵFactoryDeclaration<FlowEditorModule, never>;
16
+ static ɵmod: i0.ɵɵNgModuleDeclaration<FlowEditorModule, [typeof i1.FlowEditorComponent, typeof i2.FlowNodeComponent, typeof i3.FlowPaletteComponent, typeof i4.FlowToolbarComponent, typeof i5.FlowStatusBarComponent, typeof i6.FlowAgentEditorComponent, typeof i7.AgentPropertiesPanelComponent, typeof i8.AgentStepListComponent], [typeof i9.CommonModule, typeof i10.FormsModule, typeof i11.FFlowModule, typeof i12.CodeEditorModule], [typeof i1.FlowEditorComponent, typeof i2.FlowNodeComponent, typeof i3.FlowPaletteComponent, typeof i4.FlowToolbarComponent, typeof i5.FlowStatusBarComponent, typeof i6.FlowAgentEditorComponent, typeof i7.AgentPropertiesPanelComponent, typeof i8.AgentStepListComponent]>;
17
+ static ɵinj: i0.ɵɵInjectorDeclaration<FlowEditorModule>;
18
+ }
19
+ //# sourceMappingURL=flow-editor.module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow-editor.module.d.ts","sourceRoot":"","sources":["../../src/lib/flow-editor.module.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAkBA,qBAgCa,gBAAgB;yCAAhB,gBAAgB;0CAAhB,gBAAgB;0CAAhB,gBAAgB;CAAI"}
@@ -0,0 +1,84 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { FormsModule } from '@angular/forms';
4
+ import { FFlowModule } from '@foblex/flow';
5
+ import { CodeEditorModule } from '@memberjunction/ng-code-editor';
6
+ // Generic components
7
+ import { FlowEditorComponent } from './components/flow-editor.component';
8
+ import { FlowNodeComponent } from './components/flow-node.component';
9
+ import { FlowPaletteComponent } from './components/flow-palette.component';
10
+ import { FlowToolbarComponent } from './components/flow-toolbar.component';
11
+ import { FlowStatusBarComponent } from './components/flow-status-bar.component';
12
+ // Agent-specific components
13
+ import { FlowAgentEditorComponent } from './agent-editor/flow-agent-editor.component';
14
+ import { AgentPropertiesPanelComponent } from './agent-editor/agent-properties-panel.component';
15
+ import { AgentStepListComponent } from './agent-editor/agent-step-list.component';
16
+ import * as i0 from "@angular/core";
17
+ export class FlowEditorModule {
18
+ static ɵfac = function FlowEditorModule_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || FlowEditorModule)(); };
19
+ static ɵmod = /*@__PURE__*/ i0.ɵɵdefineNgModule({ type: FlowEditorModule });
20
+ static ɵinj = /*@__PURE__*/ i0.ɵɵdefineInjector({ imports: [CommonModule,
21
+ FormsModule,
22
+ FFlowModule,
23
+ CodeEditorModule] });
24
+ }
25
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(FlowEditorModule, [{
26
+ type: NgModule,
27
+ args: [{
28
+ declarations: [
29
+ // Generic
30
+ FlowEditorComponent,
31
+ FlowNodeComponent,
32
+ FlowPaletteComponent,
33
+ FlowToolbarComponent,
34
+ FlowStatusBarComponent,
35
+ // Agent-specific
36
+ FlowAgentEditorComponent,
37
+ AgentPropertiesPanelComponent,
38
+ AgentStepListComponent
39
+ ],
40
+ imports: [
41
+ CommonModule,
42
+ FormsModule,
43
+ FFlowModule,
44
+ CodeEditorModule
45
+ ],
46
+ exports: [
47
+ // Generic — for any consumer
48
+ FlowEditorComponent,
49
+ FlowNodeComponent,
50
+ FlowPaletteComponent,
51
+ FlowToolbarComponent,
52
+ FlowStatusBarComponent,
53
+ // Agent-specific
54
+ FlowAgentEditorComponent,
55
+ AgentPropertiesPanelComponent,
56
+ AgentStepListComponent
57
+ ]
58
+ }]
59
+ }], null, null); })();
60
+ (function () { (typeof ngJitMode === "undefined" || ngJitMode) && i0.ɵɵsetNgModuleScope(FlowEditorModule, { declarations: [
61
+ // Generic
62
+ FlowEditorComponent,
63
+ FlowNodeComponent,
64
+ FlowPaletteComponent,
65
+ FlowToolbarComponent,
66
+ FlowStatusBarComponent,
67
+ // Agent-specific
68
+ FlowAgentEditorComponent,
69
+ AgentPropertiesPanelComponent,
70
+ AgentStepListComponent], imports: [CommonModule,
71
+ FormsModule,
72
+ FFlowModule,
73
+ CodeEditorModule], exports: [
74
+ // Generic — for any consumer
75
+ FlowEditorComponent,
76
+ FlowNodeComponent,
77
+ FlowPaletteComponent,
78
+ FlowToolbarComponent,
79
+ FlowStatusBarComponent,
80
+ // Agent-specific
81
+ FlowAgentEditorComponent,
82
+ AgentPropertiesPanelComponent,
83
+ AgentStepListComponent] }); })();
84
+ //# sourceMappingURL=flow-editor.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow-editor.module.js","sourceRoot":"","sources":["../../src/lib/flow-editor.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAElE,qBAAqB;AACrB,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AAEhF,4BAA4B;AAC5B,OAAO,EAAE,wBAAwB,EAAE,MAAM,4CAA4C,CAAC;AACtF,OAAO,EAAE,6BAA6B,EAAE,MAAM,iDAAiD,CAAC;AAChG,OAAO,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAC;;AAkClF,MAAM,OAAO,gBAAgB;0GAAhB,gBAAgB;4DAAhB,gBAAgB;gEAlBzB,YAAY;YACZ,WAAW;YACX,WAAW;YACX,gBAAgB;;iFAeP,gBAAgB;cAhC5B,QAAQ;eAAC;gBACR,YAAY,EAAE;oBACZ,UAAU;oBACV,mBAAmB;oBACnB,iBAAiB;oBACjB,oBAAoB;oBACpB,oBAAoB;oBACpB,sBAAsB;oBACtB,iBAAiB;oBACjB,wBAAwB;oBACxB,6BAA6B;oBAC7B,sBAAsB;iBACvB;gBACD,OAAO,EAAE;oBACP,YAAY;oBACZ,WAAW;oBACX,WAAW;oBACX,gBAAgB;iBACjB;gBACD,OAAO,EAAE;oBACP,6BAA6B;oBAC7B,mBAAmB;oBACnB,iBAAiB;oBACjB,oBAAoB;oBACpB,oBAAoB;oBACpB,sBAAsB;oBACtB,iBAAiB;oBACjB,wBAAwB;oBACxB,6BAA6B;oBAC7B,sBAAsB;iBACvB;aACF;;wFACY,gBAAgB;QA9BzB,UAAU;QACV,mBAAmB;QACnB,iBAAiB;QACjB,oBAAoB;QACpB,oBAAoB;QACpB,sBAAsB;QACtB,iBAAiB;QACjB,wBAAwB;QACxB,6BAA6B;QAC7B,sBAAsB,aAGtB,YAAY;QACZ,WAAW;QACX,WAAW;QACX,gBAAgB;QAGhB,6BAA6B;QAC7B,mBAAmB;QACnB,iBAAiB;QACjB,oBAAoB;QACpB,oBAAoB;QACpB,sBAAsB;QACtB,iBAAiB;QACjB,wBAAwB;QACxB,6BAA6B;QAC7B,sBAAsB"}