ngx-vflow 0.1.6 → 0.1.8

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.
@@ -43,19 +43,46 @@ export class VflowComponent {
43
43
  this.nodesChangeService = inject(NodesChangeService);
44
44
  this.edgesChangeService = inject(EdgeChangesService);
45
45
  this.injector = inject(Injector);
46
+ /**
47
+ * Minimum zoom value
48
+ */
46
49
  this.minZoom = 0.5;
50
+ /**
51
+ * Maximum zoom value
52
+ */
47
53
  this.maxZoom = 3;
54
+ /**
55
+ * Background color for flow
56
+ */
48
57
  this.background = '#FFFFFF';
49
58
  // #endregion
50
59
  // #region SIGNAL_API
60
+ /**
61
+ * Signal for reading viewport change
62
+ */
51
63
  this.viewport = this.viewportService.readableViewport.asReadonly();
64
+ /**
65
+ * Signal for reading nodes change
66
+ */
52
67
  this.nodesChange = toSignal(this.nodesChangeService.changes$, { initialValue: [] });
68
+ /**
69
+ * Signal to reading edges change
70
+ */
53
71
  this.edgesChange = toSignal(this.edgesChangeService.changes$, { initialValue: [] });
54
72
  // #endregion
55
73
  // #region RX_API
56
- this.viewportChanges$ = toObservable(this.viewportService.readableViewport)
74
+ /**
75
+ * Observable with viewport change
76
+ */
77
+ this.viewportChange$ = toObservable(this.viewportService.readableViewport)
57
78
  .pipe(skip(1)); // skip default value that set by signal
79
+ /**
80
+ * Observable with nodes change
81
+ */
58
82
  this.nodesChange$ = this.nodesChangeService.changes$;
83
+ /**
84
+ * Observable with nodes change
85
+ */
59
86
  this.edgesChange$ = this.edgesChangeService.changes$;
60
87
  // #endregion
61
88
  // TODO: probably better to make it injectable
@@ -74,13 +101,29 @@ export class VflowComponent {
74
101
  set view(view) {
75
102
  this.flowModel.view.set(view);
76
103
  }
104
+ /**
105
+ * Object that controls flow direction.
106
+ *
107
+ * @example if you want to archieve right to left direction
108
+ * then you need to pass these positions { source: 'left', target: 'right' }
109
+ *
110
+ * ! Be carefult using this field, it may depricate in future releases !
111
+ */
77
112
  set handlePositions(handlePositions) {
78
113
  this.flowModel.handlePositions.set(handlePositions);
79
114
  }
115
+ /**
116
+ * Settings for connection (it renders when user tries to create edge between nodes)
117
+ *
118
+ * @see `ConnectionSettings`
119
+ */
80
120
  set connection(connection) { this.flowEntitiesService.connection.set(connection); }
81
121
  get connection() { return this.flowEntitiesService.connection(); }
82
122
  // #endregion
83
123
  // #region MAIN_INPUTS
124
+ /**
125
+ * Data for rendered nodes
126
+ */
84
127
  set nodes(newNodes) {
85
128
  const newModels = runInInjectionContext(this.injector, () => ReferenceKeeper.nodes(newNodes, this.flowEntitiesService.nodes()));
86
129
  // TODO better to solve this by DI
@@ -89,7 +132,13 @@ export class VflowComponent {
89
132
  addNodesToEdges(newModels, this.flowEntitiesService.edges());
90
133
  this.flowEntitiesService.nodes.set(newModels);
91
134
  }
135
+ /**
136
+ * @internal
137
+ */
92
138
  get nodeModels() { return this.flowEntitiesService.nodes(); }
139
+ /**
140
+ * Data for rendered edges
141
+ */
93
142
  set edges(newEdges) {
94
143
  const newModels = ReferenceKeeper.edges(newEdges, this.flowEntitiesService.edges());
95
144
  // quick and dirty binding nodes to edges
@@ -98,15 +147,35 @@ export class VflowComponent {
98
147
  }
99
148
  get edgeModels() { return this.flowEntitiesService.validEdges(); }
100
149
  // #region METHODS_API
150
+ /**
151
+ * Change viewport to specified state
152
+ *
153
+ * @param viewport viewport state
154
+ */
101
155
  viewportTo(viewport) {
102
156
  this.viewportService.writableViewport.set({ changeType: 'absolute', state: viewport });
103
157
  }
158
+ /**
159
+ * Change zoom
160
+ *
161
+ * @param zoom zoom value
162
+ */
104
163
  zoomTo(zoom) {
105
164
  this.viewportService.writableViewport.set({ changeType: 'absolute', state: { zoom } });
106
165
  }
166
+ /**
167
+ * Move to specified coordinate
168
+ *
169
+ * @param point point where to move
170
+ */
107
171
  panTo(point) {
108
172
  this.viewportService.writableViewport.set({ changeType: 'absolute', state: point });
109
173
  }
174
+ /**
175
+ * Get node by id
176
+ *
177
+ * @param id node id
178
+ */
110
179
  getNode(id) {
111
180
  return this.flowEntitiesService.getNode(id)?.node;
112
181
  }
@@ -125,7 +194,7 @@ export class VflowComponent {
125
194
  FlowEntitiesService,
126
195
  NodesChangeService,
127
196
  EdgeChangesService
128
- ], queries: [{ propertyName: "nodeHtmlDirective", first: true, predicate: NodeHtmlTemplateDirective, descendants: true }, { propertyName: "edgeTemplateDirective", first: true, predicate: EdgeTemplateDirective, descendants: true }, { propertyName: "edgeLabelHtmlDirective", first: true, predicate: EdgeLabelHtmlTemplateDirective, descendants: true }, { propertyName: "connectionTemplateDirective", first: true, predicate: ConnectionTemplateDirective, descendants: true }, { propertyName: "handleTemplateDirective", first: true, predicate: HandleTemplateDirective, descendants: true }], viewQueries: [{ propertyName: "mapContext", first: true, predicate: MapContextDirective, descendants: true }], hostDirectives: [{ directive: i1.ConnectionControllerDirective, outputs: ["onConnect", "onConnect"] }, { directive: i2.ChangesControllerDirective, outputs: ["onNodesChange", "onNodesChange", "onEdgesChange", "onEdgesChange"] }], ngImport: i0, template: "<svg:svg\n rootSvgRef\n rootSvgContext\n class=\"root-svg\"\n #flow\n [style.backgroundColor]=\"background\"\n [attr.width]=\"flowModel.flowWidth()\"\n [attr.height]=\"flowModel.flowHeight()\"\n>\n <defs [markers]=\"markers()\" flowDefs />\n\n <svg:g\n mapContext\n spacePointContext\n [minZoom]=\"minZoom\"\n [maxZoom]=\"maxZoom\"\n >\n <!-- Connection -->\n <svg:g\n connection\n [model]=\"connection\"\n [template]=\"connectionTemplateDirective?.templateRef\"\n />\n\n <!-- Edges -->\n <svg:g\n *ngFor=\"let model of edgeModels; trackBy: trackEdges\"\n edge\n [model]=\"model\"\n [edgeTemplate]=\"edgeTemplateDirective?.templateRef\"\n [edgeLabelHtmlTemplate]=\"edgeLabelHtmlDirective?.templateRef\"\n />\n\n <!-- Nodes -->\n <svg:g\n *ngFor=\"let model of nodeModels; trackBy: trackNodes\"\n node\n [nodeModel]=\"model\"\n [nodeHtmlTemplate]=\"nodeHtmlDirective?.templateRef\"\n [handleTemplate]=\"handleTemplateDirective?.templateRef\"\n [attr.transform]=\"model.pointTransform()\"\n />\n </svg:g>\n\n</svg:svg>\n", styles: [":host{display:block;width:100%;height:100%;-webkit-user-select:none;user-select:none}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: i4.NodeComponent, selector: "g[node]", inputs: ["nodeModel", "nodeHtmlTemplate", "handleTemplate"] }, { kind: "component", type: i5.EdgeComponent, selector: "g[edge]", inputs: ["model", "edgeTemplate", "edgeLabelHtmlTemplate"] }, { kind: "component", type: i6.ConnectionComponent, selector: "g[connection]", inputs: ["model", "template"] }, { kind: "component", type: i7.DefsComponent, selector: "defs[flowDefs]", inputs: ["markers"] }, { kind: "directive", type: i8.SpacePointContextDirective, selector: "g[spacePointContext]" }, { kind: "directive", type: i9.MapContextDirective, selector: "g[mapContext]", inputs: ["minZoom", "maxZoom"] }, { kind: "directive", type: i10.RootSvgReferenceDirective, selector: "svg[rootSvgRef]" }, { kind: "directive", type: i11.RootSvgContextDirective, selector: "svg[rootSvgContext]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
197
+ ], queries: [{ propertyName: "nodeHtmlDirective", first: true, predicate: NodeHtmlTemplateDirective, descendants: true }, { propertyName: "edgeTemplateDirective", first: true, predicate: EdgeTemplateDirective, descendants: true }, { propertyName: "edgeLabelHtmlDirective", first: true, predicate: EdgeLabelHtmlTemplateDirective, descendants: true }, { propertyName: "connectionTemplateDirective", first: true, predicate: ConnectionTemplateDirective, descendants: true }, { propertyName: "handleTemplateDirective", first: true, predicate: HandleTemplateDirective, descendants: true }], viewQueries: [{ propertyName: "mapContext", first: true, predicate: MapContextDirective, descendants: true }], hostDirectives: [{ directive: i1.ConnectionControllerDirective, outputs: ["onConnect", "onConnect"] }, { directive: i2.ChangesControllerDirective, outputs: ["onNodesChange", "onNodesChange", "onEdgesChange", "onEdgesChange"] }], ngImport: i0, template: "<svg:svg\n rootSvgRef\n rootSvgContext\n class=\"root-svg\"\n #flow\n [style.backgroundColor]=\"background\"\n [attr.width]=\"flowModel.flowWidth()\"\n [attr.height]=\"flowModel.flowHeight()\"\n>\n <defs [markers]=\"markers()\" flowDefs />\n\n <svg:g\n mapContext\n spacePointContext\n [minZoom]=\"minZoom\"\n [maxZoom]=\"maxZoom\"\n >\n <!-- Connection -->\n <svg:g\n connection\n [model]=\"connection\"\n [template]=\"connectionTemplateDirective?.templateRef\"\n />\n\n <!-- Edges -->\n <svg:g\n *ngFor=\"let model of edgeModels; trackBy: trackEdges\"\n edge\n [model]=\"model\"\n [edgeTemplate]=\"edgeTemplateDirective?.templateRef\"\n [edgeLabelHtmlTemplate]=\"edgeLabelHtmlDirective?.templateRef\"\n />\n\n <!-- Nodes -->\n <svg:g\n *ngFor=\"let model of nodeModels; trackBy: trackNodes\"\n node\n [nodeModel]=\"model\"\n [nodeHtmlTemplate]=\"nodeHtmlDirective?.templateRef\"\n [handleTemplate]=\"handleTemplateDirective?.templateRef\"\n [attr.transform]=\"model.pointTransform()\"\n />\n </svg:g>\n\n</svg:svg>\n", styles: [":host{display:block;width:100%;height:100%;-webkit-user-select:none;user-select:none}:host ::ng-deep *{box-sizing:border-box}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: i4.NodeComponent, selector: "g[node]", inputs: ["nodeModel", "nodeHtmlTemplate", "handleTemplate"] }, { kind: "component", type: i5.EdgeComponent, selector: "g[edge]", inputs: ["model", "edgeTemplate", "edgeLabelHtmlTemplate"] }, { kind: "component", type: i6.ConnectionComponent, selector: "g[connection]", inputs: ["model", "template"] }, { kind: "component", type: i7.DefsComponent, selector: "defs[flowDefs]", inputs: ["markers"] }, { kind: "directive", type: i8.SpacePointContextDirective, selector: "g[spacePointContext]" }, { kind: "directive", type: i9.MapContextDirective, selector: "g[mapContext]", inputs: ["minZoom", "maxZoom"] }, { kind: "directive", type: i10.RootSvgReferenceDirective, selector: "svg[rootSvgRef]" }, { kind: "directive", type: i11.RootSvgContextDirective, selector: "svg[rootSvgContext]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
129
198
  }
130
199
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: VflowComponent, decorators: [{
131
200
  type: Component,
@@ -139,7 +208,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
139
208
  ], hostDirectives: [
140
209
  connectionControllerHostDirective,
141
210
  changesControllerHostDirective
142
- ], template: "<svg:svg\n rootSvgRef\n rootSvgContext\n class=\"root-svg\"\n #flow\n [style.backgroundColor]=\"background\"\n [attr.width]=\"flowModel.flowWidth()\"\n [attr.height]=\"flowModel.flowHeight()\"\n>\n <defs [markers]=\"markers()\" flowDefs />\n\n <svg:g\n mapContext\n spacePointContext\n [minZoom]=\"minZoom\"\n [maxZoom]=\"maxZoom\"\n >\n <!-- Connection -->\n <svg:g\n connection\n [model]=\"connection\"\n [template]=\"connectionTemplateDirective?.templateRef\"\n />\n\n <!-- Edges -->\n <svg:g\n *ngFor=\"let model of edgeModels; trackBy: trackEdges\"\n edge\n [model]=\"model\"\n [edgeTemplate]=\"edgeTemplateDirective?.templateRef\"\n [edgeLabelHtmlTemplate]=\"edgeLabelHtmlDirective?.templateRef\"\n />\n\n <!-- Nodes -->\n <svg:g\n *ngFor=\"let model of nodeModels; trackBy: trackNodes\"\n node\n [nodeModel]=\"model\"\n [nodeHtmlTemplate]=\"nodeHtmlDirective?.templateRef\"\n [handleTemplate]=\"handleTemplateDirective?.templateRef\"\n [attr.transform]=\"model.pointTransform()\"\n />\n </svg:g>\n\n</svg:svg>\n", styles: [":host{display:block;width:100%;height:100%;-webkit-user-select:none;user-select:none}\n"] }]
211
+ ], template: "<svg:svg\n rootSvgRef\n rootSvgContext\n class=\"root-svg\"\n #flow\n [style.backgroundColor]=\"background\"\n [attr.width]=\"flowModel.flowWidth()\"\n [attr.height]=\"flowModel.flowHeight()\"\n>\n <defs [markers]=\"markers()\" flowDefs />\n\n <svg:g\n mapContext\n spacePointContext\n [minZoom]=\"minZoom\"\n [maxZoom]=\"maxZoom\"\n >\n <!-- Connection -->\n <svg:g\n connection\n [model]=\"connection\"\n [template]=\"connectionTemplateDirective?.templateRef\"\n />\n\n <!-- Edges -->\n <svg:g\n *ngFor=\"let model of edgeModels; trackBy: trackEdges\"\n edge\n [model]=\"model\"\n [edgeTemplate]=\"edgeTemplateDirective?.templateRef\"\n [edgeLabelHtmlTemplate]=\"edgeLabelHtmlDirective?.templateRef\"\n />\n\n <!-- Nodes -->\n <svg:g\n *ngFor=\"let model of nodeModels; trackBy: trackNodes\"\n node\n [nodeModel]=\"model\"\n [nodeHtmlTemplate]=\"nodeHtmlDirective?.templateRef\"\n [handleTemplate]=\"handleTemplateDirective?.templateRef\"\n [attr.transform]=\"model.pointTransform()\"\n />\n </svg:g>\n\n</svg:svg>\n", styles: [":host{display:block;width:100%;height:100%;-webkit-user-select:none;user-select:none}:host ::ng-deep *{box-sizing:border-box}\n"] }]
143
212
  }], propDecorators: { view: [{
144
213
  type: Input
145
214
  }], minZoom: [{
@@ -180,4 +249,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
180
249
  function bindFlowToNodes(flow, nodes) {
181
250
  nodes.forEach(n => n.bindFlow(flow));
182
251
  }
183
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmZsb3cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXZmbG93LWxpYi9zcmMvbGliL3ZmbG93L2NvbXBvbmVudHMvdmZsb3cvdmZsb3cuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXZmbG93LWxpYi9zcmMvbGliL3ZmbG93L2NvbXBvbmVudHMvdmZsb3cvdmZsb3cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFvQix1QkFBdUIsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFnQixRQUFRLEVBQUUsS0FBSyxFQUE0QyxTQUFTLEVBQW9CLE1BQU0sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV4TyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUM3RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUVwRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbEUsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUdwRSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsOEJBQThCLEVBQUUscUJBQXFCLEVBQUUsdUJBQXVCLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUU3TCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDakUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3BELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHNUIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDdkUsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sa0RBQWtELENBQUM7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ckNvbnRlbnRJbml0LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBDb250ZW50Q2hpbGQsIEV2ZW50RW1pdHRlciwgSW5qZWN0b3IsIElucHV0LCBPbkNoYW5nZXMsIE91dHB1dCwgU2lnbmFsLCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQsIGNvbXB1dGVkLCBlZmZlY3QsIGluamVjdCwgcnVuSW5JbmplY3Rpb25Db250ZXh0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOb2RlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9ub2RlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBNYXBDb250ZXh0RGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9tYXAtY29udGV4dC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRHJhZ2dhYmxlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RyYWdnYWJsZS5zZXJ2aWNlJztcbmltcG9ydCB7IE5vZGVNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9ub2RlLm1vZGVsJztcbmltcG9ydCB7IFZpZXdwb3J0U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3ZpZXdwb3J0LnNlcnZpY2UnO1xuaW1wb3J0IHsgdG9PYnNlcnZhYmxlLCB0b1NpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IEVkZ2UgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2VkZ2UuaW50ZXJmYWNlJztcbmltcG9ydCB7IEVkZ2VNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9lZGdlLm1vZGVsJztcbmltcG9ydCB7IENvbm5lY3Rpb25UZW1wbGF0ZURpcmVjdGl2ZSwgRWRnZUxhYmVsSHRtbFRlbXBsYXRlRGlyZWN0aXZlLCBFZGdlVGVtcGxhdGVEaXJlY3RpdmUsIEhhbmRsZVRlbXBsYXRlRGlyZWN0aXZlLCBOb2RlSHRtbFRlbXBsYXRlRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy90ZW1wbGF0ZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSGFuZGxlUG9zaXRpb25zIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9oYW5kbGUtcG9zaXRpb25zLmludGVyZmFjZSc7XG5pbXBvcnQgeyBhZGROb2Rlc1RvRWRnZXMgfSBmcm9tICcuLi8uLi91dGlscy9hZGQtbm9kZXMtdG8tZWRnZXMnO1xuaW1wb3J0IHsgRmxvd01vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2Zsb3cubW9kZWwnO1xuaW1wb3J0IHsgc2tpcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgUG9pbnQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3BvaW50LmludGVyZmFjZSc7XG5pbXBvcnQgeyBWaWV3cG9ydFN0YXRlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy92aWV3cG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRmxvd1N0YXR1c1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9mbG93LXN0YXR1cy5zZXJ2aWNlJztcbmltcG9ydCB7IENvbm5lY3Rpb25Db250cm9sbGVyRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9jb25uZWN0aW9uLWNvbnRyb2xsZXIuZGlyZWN0aXZlJztcbmltcG9ydCB7IEZsb3dFbnRpdGllc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9mbG93LWVudGl0aWVzLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29ubmVjdGlvblNldHRpbmdzIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9jb25uZWN0aW9uLXNldHRpbmdzLmludGVyZmFjZSc7XG5pbXBvcnQgeyBDb25uZWN0aW9uTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvY29ubmVjdGlvbi5tb2RlbCc7XG5pbXBvcnQgeyBSZWZlcmVuY2VLZWVwZXIgfSBmcm9tICcuLi8uLi91dGlscy9yZWZlcmVuY2Uta2VlcGVyJztcbmltcG9ydCB7IE5vZGVzQ2hhbmdlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL25vZGUtY2hhbmdlcy5zZXJ2aWNlJztcbmltcG9ydCB7IEVkZ2VDaGFuZ2VzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2VkZ2UtY2hhbmdlcy5zZXJ2aWNlJztcbmltcG9ydCB7IE5vZGVDaGFuZ2UgfSBmcm9tICcuLi8uLi90eXBlcy9ub2RlLWNoYW5nZS50eXBlJztcbmltcG9ydCB7IENoYW5nZXNDb250cm9sbGVyRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9jaGFuZ2VzLWNvbnRyb2xsZXIuZGlyZWN0aXZlJztcbmltcG9ydCB7IEVkZ2VDaGFuZ2UgfSBmcm9tICcuLi8uLi90eXBlcy9lZGdlLWNoYW5nZS50eXBlJztcblxuY29uc3QgY29ubmVjdGlvbkNvbnRyb2xsZXJIb3N0RGlyZWN0aXZlID0ge1xuICBkaXJlY3RpdmU6IENvbm5lY3Rpb25Db250cm9sbGVyRGlyZWN0aXZlLFxuICBvdXRwdXRzOiBbJ29uQ29ubmVjdCddXG59XG5cbmNvbnN0IGNoYW5nZXNDb250cm9sbGVySG9zdERpcmVjdGl2ZSA9IHtcbiAgZGlyZWN0aXZlOiBDaGFuZ2VzQ29udHJvbGxlckRpcmVjdGl2ZSxcbiAgb3V0cHV0czogWydvbk5vZGVzQ2hhbmdlJywgJ29uRWRnZXNDaGFuZ2UnXVxufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2ZmxvdycsXG4gIHRlbXBsYXRlVXJsOiAnLi92Zmxvdy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3ZmbG93LmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBwcm92aWRlcnM6IFtcbiAgICBEcmFnZ2FibGVTZXJ2aWNlLFxuICAgIFZpZXdwb3J0U2VydmljZSxcbiAgICBGbG93U3RhdHVzU2VydmljZSxcbiAgICBGbG93RW50aXRpZXNTZXJ2aWNlLFxuICAgIE5vZGVzQ2hhbmdlU2VydmljZSxcbiAgICBFZGdlQ2hhbmdlc1NlcnZpY2VcbiAgXSxcbiAgaG9zdERpcmVjdGl2ZXM6IFtcbiAgICBjb25uZWN0aW9uQ29udHJvbGxlckhvc3REaXJlY3RpdmUsXG4gICAgY2hhbmdlc0NvbnRyb2xsZXJIb3N0RGlyZWN0aXZlXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgVmZsb3dDb21wb25lbnQge1xuICAvLyAjcmVnaW9uIERJXG4gIHByb3RlY3RlZCB2aWV3cG9ydFNlcnZpY2UgPSBpbmplY3QoVmlld3BvcnRTZXJ2aWNlKVxuICBwcm90ZWN0ZWQgZmxvd0VudGl0aWVzU2VydmljZSA9IGluamVjdChGbG93RW50aXRpZXNTZXJ2aWNlKVxuICBwcm90ZWN0ZWQgbm9kZXNDaGFuZ2VTZXJ2aWNlID0gaW5qZWN0KE5vZGVzQ2hhbmdlU2VydmljZSlcbiAgcHJvdGVjdGVkIGVkZ2VzQ2hhbmdlU2VydmljZSA9IGluamVjdChFZGdlQ2hhbmdlc1NlcnZpY2UpXG4gIHByb3RlY3RlZCBpbmplY3RvciA9IGluamVjdChJbmplY3RvcilcbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8vICNyZWdpb24gU0VUVElOR1NcblxuICAvKipcbiAgICogU2l6ZSBmb3IgZmxvdyB2aWV3XG4gICAqXG4gICAqIGFjY2VwdHNcbiAgICogLSBhYnNvbHV0ZSBzaXplIGluIGZvcm1hdCBbd2lkdGgsIGhlaWdodF0gb3JcbiAgICogLSAnYXV0bycgdG8gY29tcHV0ZSBzaXplIGJhc2VkIG9uIHBhcmVudCBlbGVtZW50IHNpemVcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgdmlldyh2aWV3OiBbbnVtYmVyLCBudW1iZXJdIHwgJ2F1dG8nKSB7XG4gICAgdGhpcy5mbG93TW9kZWwudmlldy5zZXQodmlldylcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBtaW5ab29tID0gMC41XG5cbiAgQElucHV0KClcbiAgcHVibGljIG1heFpvb20gPSAzXG5cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBoYW5kbGVQb3NpdGlvbnMoaGFuZGxlUG9zaXRpb25zOiBIYW5kbGVQb3NpdGlvbnMpIHtcbiAgICB0aGlzLmZsb3dNb2RlbC5oYW5kbGVQb3NpdGlvbnMuc2V0KGhhbmRsZVBvc2l0aW9ucylcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBiYWNrZ3JvdW5kOiBzdHJpbmcgPSAnI0ZGRkZGRidcblxuICBASW5wdXQoeyB0cmFuc2Zvcm06IChzZXR0aW5nczogQ29ubmVjdGlvblNldHRpbmdzKSA9PiBuZXcgQ29ubmVjdGlvbk1vZGVsKHNldHRpbmdzKSB9KVxuICBwdWJsaWMgc2V0IGNvbm5lY3Rpb24oY29ubmVjdGlvbjogQ29ubmVjdGlvbk1vZGVsKSB7IHRoaXMuZmxvd0VudGl0aWVzU2VydmljZS5jb25uZWN0aW9uLnNldChjb25uZWN0aW9uKSB9XG4gIHB1YmxpYyBnZXQgY29ubmVjdGlvbigpIHsgcmV0dXJuIHRoaXMuZmxvd0VudGl0aWVzU2VydmljZS5jb25uZWN0aW9uKCkgfVxuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiBNQUlOX0lOUFVUU1xuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KVxuICBwdWJsaWMgc2V0IG5vZGVzKG5ld05vZGVzOiBOb2RlW10pIHtcbiAgICBjb25zdCBuZXdNb2RlbHMgPSBydW5JbkluamVjdGlvbkNvbnRleHQodGhpcy5pbmplY3RvcixcbiAgICAgICgpID0+IFJlZmVyZW5jZUtlZXBlci5ub2RlcyhuZXdOb2RlcywgdGhpcy5mbG93RW50aXRpZXNTZXJ2aWNlLm5vZGVzKCkpXG4gICAgKVxuXG4gICAgLy8gVE9ETyBiZXR0ZXIgdG8gc29sdmUgdGhpcyBieSBESVxuICAgIGJpbmRGbG93VG9Ob2Rlcyh0aGlzLmZsb3dNb2RlbCwgbmV3TW9kZWxzKVxuXG4gICAgLy8gcXVpY2sgYW5kIGRpcnR5IGJpbmRpbmcgbm9kZXMgdG8gZWRnZXNcbiAgICBhZGROb2Rlc1RvRWRnZXMobmV3TW9kZWxzLCB0aGlzLmZsb3dFbnRpdGllc1NlcnZpY2UuZWRnZXMoKSlcblxuICAgIHRoaXMuZmxvd0VudGl0aWVzU2VydmljZS5ub2Rlcy5zZXQobmV3TW9kZWxzKVxuICB9XG5cbiAgcHVibGljIGdldCBub2RlTW9kZWxzKCkgeyByZXR1cm4gdGhpcy5mbG93RW50aXRpZXNTZXJ2aWNlLm5vZGVzKCkgfVxuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgZWRnZXMobmV3RWRnZXM6IEVkZ2VbXSkge1xuICAgIGNvbnN0IG5ld01vZGVscyA9IFJlZmVyZW5jZUtlZXBlci5lZGdlcyhuZXdFZGdlcywgdGhpcy5mbG93RW50aXRpZXNTZXJ2aWNlLmVkZ2VzKCkpXG5cbiAgICAvLyBxdWljayBhbmQgZGlydHkgYmluZGluZyBub2RlcyB0byBlZGdlc1xuICAgIGFkZE5vZGVzVG9FZGdlcyh0aGlzLm5vZGVNb2RlbHMsIG5ld01vZGVscylcblxuICAgIHRoaXMuZmxvd0VudGl0aWVzU2VydmljZS5lZGdlcy5zZXQobmV3TW9kZWxzKVxuICB9XG5cbiAgcHVibGljIGdldCBlZGdlTW9kZWxzKCkgeyByZXR1cm4gdGhpcy5mbG93RW50aXRpZXNTZXJ2aWNlLnZhbGlkRWRnZXMoKSB9XG4gIC8vICNlbmRyZWdpb25cblxuICAvLyAjcmVnaW9uIFRFTVBMQVRFU1xuICBAQ29udGVudENoaWxkKE5vZGVIdG1sVGVtcGxhdGVEaXJlY3RpdmUpXG4gIHByb3RlY3RlZCBub2RlSHRtbERpcmVjdGl2ZT86IE5vZGVIdG1sVGVtcGxhdGVEaXJlY3RpdmVcblxuICBAQ29udGVudENoaWxkKEVkZ2VUZW1wbGF0ZURpcmVjdGl2ZSlcbiAgcHJvdGVjdGVkIGVkZ2VUZW1wbGF0ZURpcmVjdGl2ZT86IEVkZ2VUZW1wbGF0ZURpcmVjdGl2ZVxuXG4gIEBDb250ZW50Q2hpbGQoRWRnZUxhYmVsSHRtbFRlbXBsYXRlRGlyZWN0aXZlKVxuICBwcm90ZWN0ZWQgZWRnZUxhYmVsSHRtbERpcmVjdGl2ZT86IEVkZ2VMYWJlbEh0bWxUZW1wbGF0ZURpcmVjdGl2ZVxuXG4gIEBDb250ZW50Q2hpbGQoQ29ubmVjdGlvblRlbXBsYXRlRGlyZWN0aXZlKVxuICBwcm90ZWN0ZWQgY29ubmVjdGlvblRlbXBsYXRlRGlyZWN0aXZlPzogQ29ubmVjdGlvblRlbXBsYXRlRGlyZWN0aXZlXG5cbiAgQENvbnRlbnRDaGlsZChIYW5kbGVUZW1wbGF0ZURpcmVjdGl2ZSlcbiAgcHJvdGVjdGVkIGhhbmRsZVRlbXBsYXRlRGlyZWN0aXZlPzogSGFuZGxlVGVtcGxhdGVEaXJlY3RpdmVcbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8vICNyZWdpb24gRElSRUNUSVZFU1xuICBAVmlld0NoaWxkKE1hcENvbnRleHREaXJlY3RpdmUpXG4gIHByb3RlY3RlZCBtYXBDb250ZXh0ITogTWFwQ29udGV4dERpcmVjdGl2ZVxuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiBTSUdOQUxfQVBJXG4gIHB1YmxpYyByZWFkb25seSB2aWV3cG9ydCA9IHRoaXMudmlld3BvcnRTZXJ2aWNlLnJlYWRhYmxlVmlld3BvcnQuYXNSZWFkb25seSgpXG5cbiAgcHVibGljIHJlYWRvbmx5IG5vZGVzQ2hhbmdlID1cbiAgICB0b1NpZ25hbCh0aGlzLm5vZGVzQ2hhbmdlU2VydmljZS5jaGFuZ2VzJCwgeyBpbml0aWFsVmFsdWU6IFtdIGFzIE5vZGVDaGFuZ2VbXSB9KVxuXG4gIHB1YmxpYyByZWFkb25seSBlZGdlc0NoYW5nZSA9XG4gICAgdG9TaWduYWwodGhpcy5lZGdlc0NoYW5nZVNlcnZpY2UuY2hhbmdlcyQsIHsgaW5pdGlhbFZhbHVlOiBbXSBhcyBFZGdlQ2hhbmdlW10gfSlcbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8vICNyZWdpb24gUlhfQVBJXG4gIHB1YmxpYyByZWFkb25seSB2aWV3cG9ydENoYW5nZXMkID0gdG9PYnNlcnZhYmxlKHRoaXMudmlld3BvcnRTZXJ2aWNlLnJlYWRhYmxlVmlld3BvcnQpXG4gICAgLnBpcGUoc2tpcCgxKSkgLy8gc2tpcCBkZWZhdWx0IHZhbHVlIHRoYXQgc2V0IGJ5IHNpZ25hbFxuXG4gIHB1YmxpYyByZWFkb25seSBub2Rlc0NoYW5nZSQgPSB0aGlzLm5vZGVzQ2hhbmdlU2VydmljZS5jaGFuZ2VzJFxuXG4gIHB1YmxpYyByZWFkb25seSBlZGdlc0NoYW5nZSQgPSB0aGlzLmVkZ2VzQ2hhbmdlU2VydmljZS5jaGFuZ2VzJFxuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gVE9ETzogcHJvYmFibHkgYmV0dGVyIHRvIG1ha2UgaXQgaW5qZWN0YWJsZVxuICBwcm90ZWN0ZWQgZmxvd01vZGVsID0gbmV3IEZsb3dNb2RlbCgpXG5cbiAgcHJvdGVjdGVkIG1hcmtlcnMgPSB0aGlzLmZsb3dFbnRpdGllc1NlcnZpY2UubWFya2Vyc1xuXG4gIC8vICNyZWdpb24gTUVUSE9EU19BUElcbiAgcHVibGljIHZpZXdwb3J0VG8odmlld3BvcnQ6IFZpZXdwb3J0U3RhdGUpOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdwb3J0U2VydmljZS53cml0YWJsZVZpZXdwb3J0LnNldCh7IGNoYW5nZVR5cGU6ICdhYnNvbHV0ZScsIHN0YXRlOiB2aWV3cG9ydCB9KVxuICB9XG5cbiAgcHVibGljIHpvb21Ubyh6b29tOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdwb3J0U2VydmljZS53cml0YWJsZVZpZXdwb3J0LnNldCh7IGNoYW5nZVR5cGU6ICdhYnNvbHV0ZScsIHN0YXRlOiB7IHpvb20gfSB9KVxuICB9XG5cbiAgcHVibGljIHBhblRvKHBvaW50OiBQb2ludCk6IHZvaWQge1xuICAgIHRoaXMudmlld3BvcnRTZXJ2aWNlLndyaXRhYmxlVmlld3BvcnQuc2V0KHsgY2hhbmdlVHlwZTogJ2Fic29sdXRlJywgc3RhdGU6IHBvaW50IH0pXG4gIH1cblxuICBwdWJsaWMgZ2V0Tm9kZTxUID0gdW5rbm93bj4oaWQ6IHN0cmluZyk6IE5vZGU8VD4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZsb3dFbnRpdGllc1NlcnZpY2UuZ2V0Tm9kZTxUPihpZCk/Lm5vZGVcbiAgfVxuICAvLyAjZW5kcmVnaW9uXG5cbiAgcHJvdGVjdGVkIHRyYWNrTm9kZXMoaWR4OiBudW1iZXIsIHsgbm9kZSB9OiBOb2RlTW9kZWwpIHtcbiAgICByZXR1cm4gbm9kZS5pZFxuICB9XG5cbiAgcHJvdGVjdGVkIHRyYWNrRWRnZXMoaWR4OiBudW1iZXIsIHsgZWRnZSB9OiBFZGdlTW9kZWwpIHtcbiAgICByZXR1cm4gZWRnZS5pZFxuICB9XG59XG5cbmZ1bmN0aW9uIGJpbmRGbG93VG9Ob2RlcyhmbG93OiBGbG93TW9kZWwsIG5vZGVzOiBOb2RlTW9kZWxbXSkge1xuICBub2Rlcy5mb3JFYWNoKG4gPT4gbi5iaW5kRmxvdyhmbG93KSlcbn1cblxuIiwiPHN2ZzpzdmdcbiAgcm9vdFN2Z1JlZlxuICByb290U3ZnQ29udGV4dFxuICBjbGFzcz1cInJvb3Qtc3ZnXCJcbiAgI2Zsb3dcbiAgW3N0eWxlLmJhY2tncm91bmRDb2xvcl09XCJiYWNrZ3JvdW5kXCJcbiAgW2F0dHIud2lkdGhdPVwiZmxvd01vZGVsLmZsb3dXaWR0aCgpXCJcbiAgW2F0dHIuaGVpZ2h0XT1cImZsb3dNb2RlbC5mbG93SGVpZ2h0KClcIlxuPlxuICA8ZGVmcyBbbWFya2Vyc109XCJtYXJrZXJzKClcIiBmbG93RGVmcyAvPlxuXG4gIDxzdmc6Z1xuICAgIG1hcENvbnRleHRcbiAgICBzcGFjZVBvaW50Q29udGV4dFxuICAgIFttaW5ab29tXT1cIm1pblpvb21cIlxuICAgIFttYXhab29tXT1cIm1heFpvb21cIlxuICA+XG4gICAgPCEtLSBDb25uZWN0aW9uIC0tPlxuICAgIDxzdmc6Z1xuICAgICAgY29ubmVjdGlvblxuICAgICAgW21vZGVsXT1cImNvbm5lY3Rpb25cIlxuICAgICAgW3RlbXBsYXRlXT1cImNvbm5lY3Rpb25UZW1wbGF0ZURpcmVjdGl2ZT8udGVtcGxhdGVSZWZcIlxuICAgIC8+XG5cbiAgICA8IS0tIEVkZ2VzICAtLT5cbiAgICA8c3ZnOmdcbiAgICAgICpuZ0Zvcj1cImxldCBtb2RlbCBvZiBlZGdlTW9kZWxzOyB0cmFja0J5OiB0cmFja0VkZ2VzXCJcbiAgICAgIGVkZ2VcbiAgICAgIFttb2RlbF09XCJtb2RlbFwiXG4gICAgICBbZWRnZVRlbXBsYXRlXT1cImVkZ2VUZW1wbGF0ZURpcmVjdGl2ZT8udGVtcGxhdGVSZWZcIlxuICAgICAgW2VkZ2VMYWJlbEh0bWxUZW1wbGF0ZV09XCJlZGdlTGFiZWxIdG1sRGlyZWN0aXZlPy50ZW1wbGF0ZVJlZlwiXG4gICAgLz5cblxuICAgIDwhLS0gTm9kZXMgLS0+XG4gICAgPHN2ZzpnXG4gICAgICAqbmdGb3I9XCJsZXQgbW9kZWwgb2Ygbm9kZU1vZGVsczsgdHJhY2tCeTogdHJhY2tOb2Rlc1wiXG4gICAgICBub2RlXG4gICAgICBbbm9kZU1vZGVsXT1cIm1vZGVsXCJcbiAgICAgIFtub2RlSHRtbFRlbXBsYXRlXT1cIm5vZGVIdG1sRGlyZWN0aXZlPy50ZW1wbGF0ZVJlZlwiXG4gICAgICBbaGFuZGxlVGVtcGxhdGVdPVwiaGFuZGxlVGVtcGxhdGVEaXJlY3RpdmU/LnRlbXBsYXRlUmVmXCJcbiAgICAgIFthdHRyLnRyYW5zZm9ybV09XCJtb2RlbC5wb2ludFRyYW5zZm9ybSgpXCJcbiAgICAvPlxuICA8L3N2ZzpnPlxuXG48L3N2Zzpzdmc+XG4iXX0=
252
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmZsb3cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXZmbG93LWxpYi9zcmMvbGliL3ZmbG93L2NvbXBvbmVudHMvdmZsb3cvdmZsb3cuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXZmbG93LWxpYi9zcmMvbGliL3ZmbG93L2NvbXBvbmVudHMvdmZsb3cvdmZsb3cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFvQix1QkFBdUIsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFnQixRQUFRLEVBQUUsS0FBSyxFQUE0QyxTQUFTLEVBQW9CLE1BQU0sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV4TyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUM3RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUVwRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbEUsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUdwRSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsOEJBQThCLEVBQUUscUJBQXFCLEVBQUUsdUJBQXVCLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUU3TCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDakUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3BELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHNUIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDdkUsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sa0RBQWtELENBQUM7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QUFDLHVCQUF1QjtnQkFNM0IsVUFBVTtzQkFEbkIsU0FBUzt1QkFBQyxtQkFBbUI7O0FBNkZoQyxTQUFTLGVBQWUsQ0FBQyxJQUFlLEVBQUUsS0FBa0I7SUFDMUQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtBQUN0QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJDb250ZW50SW5pdCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgQ29udGVudENoaWxkLCBFdmVudEVtaXR0ZXIsIEluamVjdG9yLCBJbnB1dCwgT25DaGFuZ2VzLCBPdXRwdXQsIFNpZ25hbCwgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkLCBjb21wdXRlZCwgZWZmZWN0LCBpbmplY3QsIHJ1bkluSW5qZWN0aW9uQ29udGV4dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTm9kZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvbm9kZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTWFwQ29udGV4dERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvbWFwLWNvbnRleHQuZGlyZWN0aXZlJztcbmltcG9ydCB7IERyYWdnYWJsZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kcmFnZ2FibGUuc2VydmljZSc7XG5pbXBvcnQgeyBOb2RlTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvbm9kZS5tb2RlbCc7XG5pbXBvcnQgeyBWaWV3cG9ydFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy92aWV3cG9ydC5zZXJ2aWNlJztcbmltcG9ydCB7IHRvT2JzZXJ2YWJsZSwgdG9TaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBFZGdlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9lZGdlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBFZGdlTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZWRnZS5tb2RlbCc7XG5pbXBvcnQgeyBDb25uZWN0aW9uVGVtcGxhdGVEaXJlY3RpdmUsIEVkZ2VMYWJlbEh0bWxUZW1wbGF0ZURpcmVjdGl2ZSwgRWRnZVRlbXBsYXRlRGlyZWN0aXZlLCBIYW5kbGVUZW1wbGF0ZURpcmVjdGl2ZSwgTm9kZUh0bWxUZW1wbGF0ZURpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvdGVtcGxhdGUuZGlyZWN0aXZlJztcbmltcG9ydCB7IEhhbmRsZVBvc2l0aW9ucyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvaGFuZGxlLXBvc2l0aW9ucy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgYWRkTm9kZXNUb0VkZ2VzIH0gZnJvbSAnLi4vLi4vdXRpbHMvYWRkLW5vZGVzLXRvLWVkZ2VzJztcbmltcG9ydCB7IEZsb3dNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9mbG93Lm1vZGVsJztcbmltcG9ydCB7IHNraXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFBvaW50IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9wb2ludC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgVmlld3BvcnRTdGF0ZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvdmlld3BvcnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IEZsb3dTdGF0dXNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZmxvdy1zdGF0dXMuc2VydmljZSc7XG5pbXBvcnQgeyBDb25uZWN0aW9uQ29udHJvbGxlckRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvY29ubmVjdGlvbi1jb250cm9sbGVyLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBGbG93RW50aXRpZXNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZmxvdy1lbnRpdGllcy5zZXJ2aWNlJztcbmltcG9ydCB7IENvbm5lY3Rpb25TZXR0aW5ncyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvY29ubmVjdGlvbi1zZXR0aW5ncy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQ29ubmVjdGlvbk1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2Nvbm5lY3Rpb24ubW9kZWwnO1xuaW1wb3J0IHsgUmVmZXJlbmNlS2VlcGVyIH0gZnJvbSAnLi4vLi4vdXRpbHMvcmVmZXJlbmNlLWtlZXBlcic7XG5pbXBvcnQgeyBOb2Rlc0NoYW5nZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9ub2RlLWNoYW5nZXMuc2VydmljZSc7XG5pbXBvcnQgeyBFZGdlQ2hhbmdlc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9lZGdlLWNoYW5nZXMuc2VydmljZSc7XG5pbXBvcnQgeyBOb2RlQ2hhbmdlIH0gZnJvbSAnLi4vLi4vdHlwZXMvbm9kZS1jaGFuZ2UudHlwZSc7XG5pbXBvcnQgeyBDaGFuZ2VzQ29udHJvbGxlckRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvY2hhbmdlcy1jb250cm9sbGVyLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBFZGdlQ2hhbmdlIH0gZnJvbSAnLi4vLi4vdHlwZXMvZWRnZS1jaGFuZ2UudHlwZSc7XG5cbmNvbnN0IGNvbm5lY3Rpb25Db250cm9sbGVySG9zdERpcmVjdGl2ZSA9IHtcbiAgZGlyZWN0aXZlOiBDb25uZWN0aW9uQ29udHJvbGxlckRpcmVjdGl2ZSxcbiAgb3V0cHV0czogWydvbkNvbm5lY3QnXVxufVxuXG5jb25zdCBjaGFuZ2VzQ29udHJvbGxlckhvc3REaXJlY3RpdmUgPSB7XG4gIGRpcmVjdGl2ZTogQ2hhbmdlc0NvbnRyb2xsZXJEaXJlY3RpdmUsXG4gIG91dHB1dHM6IFsnb25Ob2Rlc0NoYW5nZScsICdvbkVkZ2VzQ2hhbmdlJ11cbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmZsb3cnLFxuICB0ZW1wbGF0ZVVybDogJy4vdmZsb3cuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi92Zmxvdy5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgcHJvdmlkZXJzOiBbXG4gICAgRHJhZ2dhYmxlU2VydmljZSxcbiAgICBWaWV3cG9ydFNlcnZpY2UsXG4gICAgRmxvd1N0YXR1c1NlcnZpY2UsXG4gICAgRmxvd0VudGl0aWVzU2VydmljZSxcbiAgICBOb2Rlc0NoYW5nZVNlcnZpY2UsXG4gICAgRWRnZUNoYW5nZXNTZXJ2aWNlXG4gIF0sXG4gIGhvc3REaXJlY3RpdmVzOiBbXG4gICAgY29ubmVjdGlvbkNvbnRyb2xsZXJIb3N0RGlyZWN0aXZlLFxuICAgIGNoYW5nZXNDb250cm9sbGVySG9zdERpcmVjdGl2ZVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIFZmbG93Q29tcG9uZW50IHtcbiAgLy8gI3JlZ2lvbiBESVxuICBwcm90ZWN0ZWQgdmlld3BvcnRTZXJ2aWNlID0gaW5qZWN0KFZpZXdwb3J0U2VydmljZSlcbiAgcHJvdGVjdGVkIGZsb3dFbnRpdGllc1NlcnZpY2UgPSBpbmplY3QoRmxvd0VudGl0aWVzU2VydmljZSlcbiAgcHJvdGVjdGVkIG5vZGVzQ2hhbmdlU2VydmljZSA9IGluamVjdChOb2Rlc0NoYW5nZVNlcnZpY2UpXG4gIHByb3RlY3RlZCBlZGdlc0NoYW5nZVNlcnZpY2UgPSBpbmplY3QoRWRnZUNoYW5nZXNTZXJ2aWNlKVxuICBwcm90ZWN0ZWQgaW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpXG4gIC8vICNlbmRyZWdpb25cblxuICAvLyAjcmVnaW9uIFNFVFRJTkdTXG5cbiAgLyoqXG4gICAqIFNpemUgZm9yIGZsb3cgdmlld1xuICAgKlxuICAgKiBhY2NlcHRzXG4gICAqIC0gYWJzb2x1dGUgc2l6ZSBpbiBmb3JtYXQgW3dpZHRoLCBoZWlnaHRdIG9yXG4gICAqIC0gJ2F1dG8nIHRvIGNvbXB1dGUgc2l6ZSBiYXNlZCBvbiBwYXJlbnQgZWxlbWVudCBzaXplXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHZpZXcodmlldzogW251bWJlciwgbnVtYmVyXSB8ICdhdXRvJykge1xuICAgIHRoaXMuZmxvd01vZGVsLnZpZXcuc2V0KHZpZXcpXG4gIH1cblxuICAvKipcbiAgICogTWluaW11bSB6b29tIHZhbHVlXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgbWluWm9vbSA9IDAuNVxuXG4gIC8qKlxuICAgKiBNYXhpbXVtIHpvb20gdmFsdWVcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBtYXhab29tID0gM1xuXG4gIC8qKlxuICAgKiBPYmplY3QgdGhhdCBjb250cm9scyBmbG93IGRpcmVjdGlvbi5cbiAgICpcbiAgICogQGV4YW1wbGUgaWYgeW91IHdhbnQgdG8gYXJjaGlldmUgcmlnaHQgdG8gbGVmdCBkaXJlY3Rpb25cbiAgICogdGhlbiB5b3UgbmVlZCB0byBwYXNzIHRoZXNlIHBvc2l0aW9ucyB7IHNvdXJjZTogJ2xlZnQnLCB0YXJnZXQ6ICdyaWdodCcgfVxuICAgKlxuICAgKiAhIEJlIGNhcmVmdWx0IHVzaW5nIHRoaXMgZmllbGQsIGl0IG1heSBkZXByaWNhdGUgaW4gZnV0dXJlIHJlbGVhc2VzICFcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgaGFuZGxlUG9zaXRpb25zKGhhbmRsZVBvc2l0aW9uczogSGFuZGxlUG9zaXRpb25zKSB7XG4gICAgdGhpcy5mbG93TW9kZWwuaGFuZGxlUG9zaXRpb25zLnNldChoYW5kbGVQb3NpdGlvbnMpXG4gIH1cblxuICAvKipcbiAgICogQmFja2dyb3VuZCBjb2xvciBmb3IgZmxvd1xuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGJhY2tncm91bmQ6IHN0cmluZyA9ICcjRkZGRkZGJ1xuXG4gIC8qKlxuICAgKiBTZXR0aW5ncyBmb3IgY29ubmVjdGlvbiAoaXQgcmVuZGVycyB3aGVuIHVzZXIgdHJpZXMgdG8gY3JlYXRlIGVkZ2UgYmV0d2VlbiBub2RlcylcbiAgICpcbiAgICogQHNlZSBgQ29ubmVjdGlvblNldHRpbmdzYFxuICAgKi9cbiAgQElucHV0KHsgdHJhbnNmb3JtOiAoc2V0dGluZ3M6IENvbm5lY3Rpb25TZXR0aW5ncykgPT4gbmV3IENvbm5lY3Rpb25Nb2RlbChzZXR0aW5ncykgfSlcbiAgcHVibGljIHNldCBjb25uZWN0aW9uKGNvbm5lY3Rpb246IENvbm5lY3Rpb25Nb2RlbCkgeyB0aGlzLmZsb3dFbnRpdGllc1NlcnZpY2UuY29ubmVjdGlvbi5zZXQoY29ubmVjdGlvbikgfVxuXG4gIHB1YmxpYyBnZXQgY29ubmVjdGlvbigpIHsgcmV0dXJuIHRoaXMuZmxvd0VudGl0aWVzU2VydmljZS5jb25uZWN0aW9uKCkgfVxuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiBNQUlOX0lOUFVUU1xuICAvKipcbiAgICogRGF0YSBmb3IgcmVuZGVyZWQgbm9kZXNcbiAgICovXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pXG4gIHB1YmxpYyBzZXQgbm9kZXMobmV3Tm9kZXM6IE5vZGVbXSkge1xuICAgIGNvbnN0IG5ld01vZGVscyA9IHJ1bkluSW5qZWN0aW9uQ29udGV4dCh0aGlzLmluamVjdG9yLFxuICAgICAgKCkgPT4gUmVmZXJlbmNlS2VlcGVyLm5vZGVzKG5ld05vZGVzLCB0aGlzLmZsb3dFbnRpdGllc1NlcnZpY2Uubm9kZXMoKSlcbiAgICApXG5cbiAgICAvLyBUT0RPIGJldHRlciB0byBzb2x2ZSB0aGlzIGJ5IERJXG4gICAgYmluZEZsb3dUb05vZGVzKHRoaXMuZmxvd01vZGVsLCBuZXdNb2RlbHMpXG5cbiAgICAvLyBxdWljayBhbmQgZGlydHkgYmluZGluZyBub2RlcyB0byBlZGdlc1xuICAgIGFkZE5vZGVzVG9FZGdlcyhuZXdNb2RlbHMsIHRoaXMuZmxvd0VudGl0aWVzU2VydmljZS5lZGdlcygpKVxuXG4gICAgdGhpcy5mbG93RW50aXRpZXNTZXJ2aWNlLm5vZGVzLnNldChuZXdNb2RlbHMpXG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IG5vZGVNb2RlbHMoKSB7IHJldHVybiB0aGlzLmZsb3dFbnRpdGllc1NlcnZpY2Uubm9kZXMoKSB9XG5cbiAgLyoqXG4gICAqIERhdGEgZm9yIHJlbmRlcmVkIGVkZ2VzXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGVkZ2VzKG5ld0VkZ2VzOiBFZGdlW10pIHtcbiAgICBjb25zdCBuZXdNb2RlbHMgPSBSZWZlcmVuY2VLZWVwZXIuZWRnZXMobmV3RWRnZXMsIHRoaXMuZmxvd0VudGl0aWVzU2VydmljZS5lZGdlcygpKVxuXG4gICAgLy8gcXVpY2sgYW5kIGRpcnR5IGJpbmRpbmcgbm9kZXMgdG8gZWRnZXNcbiAgICBhZGROb2Rlc1RvRWRnZXModGhpcy5ub2RlTW9kZWxzLCBuZXdNb2RlbHMpXG5cbiAgICB0aGlzLmZsb3dFbnRpdGllc1NlcnZpY2UuZWRnZXMuc2V0KG5ld01vZGVscylcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgZWRnZU1vZGVscygpIHsgcmV0dXJuIHRoaXMuZmxvd0VudGl0aWVzU2VydmljZS52YWxpZEVkZ2VzKCkgfVxuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiBURU1QTEFURVNcbiAgQENvbnRlbnRDaGlsZChOb2RlSHRtbFRlbXBsYXRlRGlyZWN0aXZlKVxuICBwcm90ZWN0ZWQgbm9kZUh0bWxEaXJlY3RpdmU/OiBOb2RlSHRtbFRlbXBsYXRlRGlyZWN0aXZlXG5cbiAgQENvbnRlbnRDaGlsZChFZGdlVGVtcGxhdGVEaXJlY3RpdmUpXG4gIHByb3RlY3RlZCBlZGdlVGVtcGxhdGVEaXJlY3RpdmU/OiBFZGdlVGVtcGxhdGVEaXJlY3RpdmVcblxuICBAQ29udGVudENoaWxkKEVkZ2VMYWJlbEh0bWxUZW1wbGF0ZURpcmVjdGl2ZSlcbiAgcHJvdGVjdGVkIGVkZ2VMYWJlbEh0bWxEaXJlY3RpdmU/OiBFZGdlTGFiZWxIdG1sVGVtcGxhdGVEaXJlY3RpdmVcblxuICBAQ29udGVudENoaWxkKENvbm5lY3Rpb25UZW1wbGF0ZURpcmVjdGl2ZSlcbiAgcHJvdGVjdGVkIGNvbm5lY3Rpb25UZW1wbGF0ZURpcmVjdGl2ZT86IENvbm5lY3Rpb25UZW1wbGF0ZURpcmVjdGl2ZVxuXG4gIEBDb250ZW50Q2hpbGQoSGFuZGxlVGVtcGxhdGVEaXJlY3RpdmUpXG4gIHByb3RlY3RlZCBoYW5kbGVUZW1wbGF0ZURpcmVjdGl2ZT86IEhhbmRsZVRlbXBsYXRlRGlyZWN0aXZlXG4gIC8vICNlbmRyZWdpb25cblxuICAvLyAjcmVnaW9uIERJUkVDVElWRVNcbiAgQFZpZXdDaGlsZChNYXBDb250ZXh0RGlyZWN0aXZlKVxuICBwcm90ZWN0ZWQgbWFwQ29udGV4dCE6IE1hcENvbnRleHREaXJlY3RpdmVcbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8vICNyZWdpb24gU0lHTkFMX0FQSVxuICAvKipcbiAgICogU2lnbmFsIGZvciByZWFkaW5nIHZpZXdwb3J0IGNoYW5nZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHZpZXdwb3J0ID0gdGhpcy52aWV3cG9ydFNlcnZpY2UucmVhZGFibGVWaWV3cG9ydC5hc1JlYWRvbmx5KClcblxuICAvKipcbiAgICogU2lnbmFsIGZvciByZWFkaW5nIG5vZGVzIGNoYW5nZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG5vZGVzQ2hhbmdlID1cbiAgICB0b1NpZ25hbCh0aGlzLm5vZGVzQ2hhbmdlU2VydmljZS5jaGFuZ2VzJCwgeyBpbml0aWFsVmFsdWU6IFtdIGFzIE5vZGVDaGFuZ2VbXSB9KVxuXG4gIC8qKlxuICAgKiBTaWduYWwgdG8gcmVhZGluZyBlZGdlcyBjaGFuZ2VcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBlZGdlc0NoYW5nZSA9XG4gICAgdG9TaWduYWwodGhpcy5lZGdlc0NoYW5nZVNlcnZpY2UuY2hhbmdlcyQsIHsgaW5pdGlhbFZhbHVlOiBbXSBhcyBFZGdlQ2hhbmdlW10gfSlcbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8vICNyZWdpb24gUlhfQVBJXG4gIC8qKlxuICAgKiBPYnNlcnZhYmxlIHdpdGggdmlld3BvcnQgY2hhbmdlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdmlld3BvcnRDaGFuZ2UkID0gdG9PYnNlcnZhYmxlKHRoaXMudmlld3BvcnRTZXJ2aWNlLnJlYWRhYmxlVmlld3BvcnQpXG4gICAgLnBpcGUoc2tpcCgxKSkgLy8gc2tpcCBkZWZhdWx0IHZhbHVlIHRoYXQgc2V0IGJ5IHNpZ25hbFxuXG4gIC8qKlxuICAgKiBPYnNlcnZhYmxlIHdpdGggbm9kZXMgY2hhbmdlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbm9kZXNDaGFuZ2UkID0gdGhpcy5ub2Rlc0NoYW5nZVNlcnZpY2UuY2hhbmdlcyRcblxuICAvKipcbiAgICogT2JzZXJ2YWJsZSB3aXRoIG5vZGVzIGNoYW5nZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGVkZ2VzQ2hhbmdlJCA9IHRoaXMuZWRnZXNDaGFuZ2VTZXJ2aWNlLmNoYW5nZXMkXG4gIC8vICNlbmRyZWdpb25cblxuICAvLyBUT0RPOiBwcm9iYWJseSBiZXR0ZXIgdG8gbWFrZSBpdCBpbmplY3RhYmxlXG4gIHByb3RlY3RlZCBmbG93TW9kZWwgPSBuZXcgRmxvd01vZGVsKClcblxuICBwcm90ZWN0ZWQgbWFya2VycyA9IHRoaXMuZmxvd0VudGl0aWVzU2VydmljZS5tYXJrZXJzXG5cbiAgLy8gI3JlZ2lvbiBNRVRIT0RTX0FQSVxuICAvKipcbiAgICogQ2hhbmdlIHZpZXdwb3J0IHRvIHNwZWNpZmllZCBzdGF0ZVxuICAgKlxuICAgKiBAcGFyYW0gdmlld3BvcnQgdmlld3BvcnQgc3RhdGVcbiAgICovXG4gIHB1YmxpYyB2aWV3cG9ydFRvKHZpZXdwb3J0OiBWaWV3cG9ydFN0YXRlKTogdm9pZCB7XG4gICAgdGhpcy52aWV3cG9ydFNlcnZpY2Uud3JpdGFibGVWaWV3cG9ydC5zZXQoeyBjaGFuZ2VUeXBlOiAnYWJzb2x1dGUnLCBzdGF0ZTogdmlld3BvcnQgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGFuZ2Ugem9vbVxuICAgKlxuICAgKiBAcGFyYW0gem9vbSB6b29tIHZhbHVlXG4gICAqL1xuICBwdWJsaWMgem9vbVRvKHpvb206IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMudmlld3BvcnRTZXJ2aWNlLndyaXRhYmxlVmlld3BvcnQuc2V0KHsgY2hhbmdlVHlwZTogJ2Fic29sdXRlJywgc3RhdGU6IHsgem9vbSB9IH0pXG4gIH1cblxuICAvKipcbiAgICogTW92ZSB0byBzcGVjaWZpZWQgY29vcmRpbmF0ZVxuICAgKlxuICAgKiBAcGFyYW0gcG9pbnQgcG9pbnQgd2hlcmUgdG8gbW92ZVxuICAgKi9cbiAgcHVibGljIHBhblRvKHBvaW50OiBQb2ludCk6IHZvaWQge1xuICAgIHRoaXMudmlld3BvcnRTZXJ2aWNlLndyaXRhYmxlVmlld3BvcnQuc2V0KHsgY2hhbmdlVHlwZTogJ2Fic29sdXRlJywgc3RhdGU6IHBvaW50IH0pXG4gIH1cblxuICAvKipcbiAgICogR2V0IG5vZGUgYnkgaWRcbiAgICpcbiAgICogQHBhcmFtIGlkIG5vZGUgaWRcbiAgICovXG4gIHB1YmxpYyBnZXROb2RlPFQgPSB1bmtub3duPihpZDogc3RyaW5nKTogTm9kZTxUPiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmxvd0VudGl0aWVzU2VydmljZS5nZXROb2RlPFQ+KGlkKT8ubm9kZVxuICB9XG4gIC8vICNlbmRyZWdpb25cblxuICBwcm90ZWN0ZWQgdHJhY2tOb2RlcyhpZHg6IG51bWJlciwgeyBub2RlIH06IE5vZGVNb2RlbCkge1xuICAgIHJldHVybiBub2RlLmlkXG4gIH1cblxuICBwcm90ZWN0ZWQgdHJhY2tFZGdlcyhpZHg6IG51bWJlciwgeyBlZGdlIH06IEVkZ2VNb2RlbCkge1xuICAgIHJldHVybiBlZGdlLmlkXG4gIH1cbn1cblxuZnVuY3Rpb24gYmluZEZsb3dUb05vZGVzKGZsb3c6IEZsb3dNb2RlbCwgbm9kZXM6IE5vZGVNb2RlbFtdKSB7XG4gIG5vZGVzLmZvckVhY2gobiA9PiBuLmJpbmRGbG93KGZsb3cpKVxufVxuXG4iLCI8c3ZnOnN2Z1xuICByb290U3ZnUmVmXG4gIHJvb3RTdmdDb250ZXh0XG4gIGNsYXNzPVwicm9vdC1zdmdcIlxuICAjZmxvd1xuICBbc3R5bGUuYmFja2dyb3VuZENvbG9yXT1cImJhY2tncm91bmRcIlxuICBbYXR0ci53aWR0aF09XCJmbG93TW9kZWwuZmxvd1dpZHRoKClcIlxuICBbYXR0ci5oZWlnaHRdPVwiZmxvd01vZGVsLmZsb3dIZWlnaHQoKVwiXG4+XG4gIDxkZWZzIFttYXJrZXJzXT1cIm1hcmtlcnMoKVwiIGZsb3dEZWZzIC8+XG5cbiAgPHN2ZzpnXG4gICAgbWFwQ29udGV4dFxuICAgIHNwYWNlUG9pbnRDb250ZXh0XG4gICAgW21pblpvb21dPVwibWluWm9vbVwiXG4gICAgW21heFpvb21dPVwibWF4Wm9vbVwiXG4gID5cbiAgICA8IS0tIENvbm5lY3Rpb24gLS0+XG4gICAgPHN2ZzpnXG4gICAgICBjb25uZWN0aW9uXG4gICAgICBbbW9kZWxdPVwiY29ubmVjdGlvblwiXG4gICAgICBbdGVtcGxhdGVdPVwiY29ubmVjdGlvblRlbXBsYXRlRGlyZWN0aXZlPy50ZW1wbGF0ZVJlZlwiXG4gICAgLz5cblxuICAgIDwhLS0gRWRnZXMgIC0tPlxuICAgIDxzdmc6Z1xuICAgICAgKm5nRm9yPVwibGV0IG1vZGVsIG9mIGVkZ2VNb2RlbHM7IHRyYWNrQnk6IHRyYWNrRWRnZXNcIlxuICAgICAgZWRnZVxuICAgICAgW21vZGVsXT1cIm1vZGVsXCJcbiAgICAgIFtlZGdlVGVtcGxhdGVdPVwiZWRnZVRlbXBsYXRlRGlyZWN0aXZlPy50ZW1wbGF0ZVJlZlwiXG4gICAgICBbZWRnZUxhYmVsSHRtbFRlbXBsYXRlXT1cImVkZ2VMYWJlbEh0bWxEaXJlY3RpdmU/LnRlbXBsYXRlUmVmXCJcbiAgICAvPlxuXG4gICAgPCEtLSBOb2RlcyAtLT5cbiAgICA8c3ZnOmdcbiAgICAgICpuZ0Zvcj1cImxldCBtb2RlbCBvZiBub2RlTW9kZWxzOyB0cmFja0J5OiB0cmFja05vZGVzXCJcbiAgICAgIG5vZGVcbiAgICAgIFtub2RlTW9kZWxdPVwibW9kZWxcIlxuICAgICAgW25vZGVIdG1sVGVtcGxhdGVdPVwibm9kZUh0bWxEaXJlY3RpdmU/LnRlbXBsYXRlUmVmXCJcbiAgICAgIFtoYW5kbGVUZW1wbGF0ZV09XCJoYW5kbGVUZW1wbGF0ZURpcmVjdGl2ZT8udGVtcGxhdGVSZWZcIlxuICAgICAgW2F0dHIudHJhbnNmb3JtXT1cIm1vZGVsLnBvaW50VHJhbnNmb3JtKClcIlxuICAgIC8+XG4gIDwvc3ZnOmc+XG5cbjwvc3ZnOnN2Zz5cbiJdfQ==
@@ -1130,19 +1130,46 @@ class VflowComponent {
1130
1130
  this.nodesChangeService = inject(NodesChangeService);
1131
1131
  this.edgesChangeService = inject(EdgeChangesService);
1132
1132
  this.injector = inject(Injector);
1133
+ /**
1134
+ * Minimum zoom value
1135
+ */
1133
1136
  this.minZoom = 0.5;
1137
+ /**
1138
+ * Maximum zoom value
1139
+ */
1134
1140
  this.maxZoom = 3;
1141
+ /**
1142
+ * Background color for flow
1143
+ */
1135
1144
  this.background = '#FFFFFF';
1136
1145
  // #endregion
1137
1146
  // #region SIGNAL_API
1147
+ /**
1148
+ * Signal for reading viewport change
1149
+ */
1138
1150
  this.viewport = this.viewportService.readableViewport.asReadonly();
1151
+ /**
1152
+ * Signal for reading nodes change
1153
+ */
1139
1154
  this.nodesChange = toSignal(this.nodesChangeService.changes$, { initialValue: [] });
1155
+ /**
1156
+ * Signal to reading edges change
1157
+ */
1140
1158
  this.edgesChange = toSignal(this.edgesChangeService.changes$, { initialValue: [] });
1141
1159
  // #endregion
1142
1160
  // #region RX_API
1143
- this.viewportChanges$ = toObservable(this.viewportService.readableViewport)
1161
+ /**
1162
+ * Observable with viewport change
1163
+ */
1164
+ this.viewportChange$ = toObservable(this.viewportService.readableViewport)
1144
1165
  .pipe(skip(1)); // skip default value that set by signal
1166
+ /**
1167
+ * Observable with nodes change
1168
+ */
1145
1169
  this.nodesChange$ = this.nodesChangeService.changes$;
1170
+ /**
1171
+ * Observable with nodes change
1172
+ */
1146
1173
  this.edgesChange$ = this.edgesChangeService.changes$;
1147
1174
  // #endregion
1148
1175
  // TODO: probably better to make it injectable
@@ -1161,13 +1188,29 @@ class VflowComponent {
1161
1188
  set view(view) {
1162
1189
  this.flowModel.view.set(view);
1163
1190
  }
1191
+ /**
1192
+ * Object that controls flow direction.
1193
+ *
1194
+ * @example if you want to archieve right to left direction
1195
+ * then you need to pass these positions { source: 'left', target: 'right' }
1196
+ *
1197
+ * ! Be carefult using this field, it may depricate in future releases !
1198
+ */
1164
1199
  set handlePositions(handlePositions) {
1165
1200
  this.flowModel.handlePositions.set(handlePositions);
1166
1201
  }
1202
+ /**
1203
+ * Settings for connection (it renders when user tries to create edge between nodes)
1204
+ *
1205
+ * @see `ConnectionSettings`
1206
+ */
1167
1207
  set connection(connection) { this.flowEntitiesService.connection.set(connection); }
1168
1208
  get connection() { return this.flowEntitiesService.connection(); }
1169
1209
  // #endregion
1170
1210
  // #region MAIN_INPUTS
1211
+ /**
1212
+ * Data for rendered nodes
1213
+ */
1171
1214
  set nodes(newNodes) {
1172
1215
  const newModels = runInInjectionContext(this.injector, () => ReferenceKeeper.nodes(newNodes, this.flowEntitiesService.nodes()));
1173
1216
  // TODO better to solve this by DI
@@ -1176,7 +1219,13 @@ class VflowComponent {
1176
1219
  addNodesToEdges(newModels, this.flowEntitiesService.edges());
1177
1220
  this.flowEntitiesService.nodes.set(newModels);
1178
1221
  }
1222
+ /**
1223
+ * @internal
1224
+ */
1179
1225
  get nodeModels() { return this.flowEntitiesService.nodes(); }
1226
+ /**
1227
+ * Data for rendered edges
1228
+ */
1180
1229
  set edges(newEdges) {
1181
1230
  const newModels = ReferenceKeeper.edges(newEdges, this.flowEntitiesService.edges());
1182
1231
  // quick and dirty binding nodes to edges
@@ -1185,15 +1234,35 @@ class VflowComponent {
1185
1234
  }
1186
1235
  get edgeModels() { return this.flowEntitiesService.validEdges(); }
1187
1236
  // #region METHODS_API
1237
+ /**
1238
+ * Change viewport to specified state
1239
+ *
1240
+ * @param viewport viewport state
1241
+ */
1188
1242
  viewportTo(viewport) {
1189
1243
  this.viewportService.writableViewport.set({ changeType: 'absolute', state: viewport });
1190
1244
  }
1245
+ /**
1246
+ * Change zoom
1247
+ *
1248
+ * @param zoom zoom value
1249
+ */
1191
1250
  zoomTo(zoom) {
1192
1251
  this.viewportService.writableViewport.set({ changeType: 'absolute', state: { zoom } });
1193
1252
  }
1253
+ /**
1254
+ * Move to specified coordinate
1255
+ *
1256
+ * @param point point where to move
1257
+ */
1194
1258
  panTo(point) {
1195
1259
  this.viewportService.writableViewport.set({ changeType: 'absolute', state: point });
1196
1260
  }
1261
+ /**
1262
+ * Get node by id
1263
+ *
1264
+ * @param id node id
1265
+ */
1197
1266
  getNode(id) {
1198
1267
  return this.flowEntitiesService.getNode(id)?.node;
1199
1268
  }
@@ -1212,7 +1281,7 @@ class VflowComponent {
1212
1281
  FlowEntitiesService,
1213
1282
  NodesChangeService,
1214
1283
  EdgeChangesService
1215
- ], queries: [{ propertyName: "nodeHtmlDirective", first: true, predicate: NodeHtmlTemplateDirective, descendants: true }, { propertyName: "edgeTemplateDirective", first: true, predicate: EdgeTemplateDirective, descendants: true }, { propertyName: "edgeLabelHtmlDirective", first: true, predicate: EdgeLabelHtmlTemplateDirective, descendants: true }, { propertyName: "connectionTemplateDirective", first: true, predicate: ConnectionTemplateDirective, descendants: true }, { propertyName: "handleTemplateDirective", first: true, predicate: HandleTemplateDirective, descendants: true }], viewQueries: [{ propertyName: "mapContext", first: true, predicate: MapContextDirective, descendants: true }], hostDirectives: [{ directive: ConnectionControllerDirective, outputs: ["onConnect", "onConnect"] }, { directive: ChangesControllerDirective, outputs: ["onNodesChange", "onNodesChange", "onEdgesChange", "onEdgesChange"] }], ngImport: i0, template: "<svg:svg\n rootSvgRef\n rootSvgContext\n class=\"root-svg\"\n #flow\n [style.backgroundColor]=\"background\"\n [attr.width]=\"flowModel.flowWidth()\"\n [attr.height]=\"flowModel.flowHeight()\"\n>\n <defs [markers]=\"markers()\" flowDefs />\n\n <svg:g\n mapContext\n spacePointContext\n [minZoom]=\"minZoom\"\n [maxZoom]=\"maxZoom\"\n >\n <!-- Connection -->\n <svg:g\n connection\n [model]=\"connection\"\n [template]=\"connectionTemplateDirective?.templateRef\"\n />\n\n <!-- Edges -->\n <svg:g\n *ngFor=\"let model of edgeModels; trackBy: trackEdges\"\n edge\n [model]=\"model\"\n [edgeTemplate]=\"edgeTemplateDirective?.templateRef\"\n [edgeLabelHtmlTemplate]=\"edgeLabelHtmlDirective?.templateRef\"\n />\n\n <!-- Nodes -->\n <svg:g\n *ngFor=\"let model of nodeModels; trackBy: trackNodes\"\n node\n [nodeModel]=\"model\"\n [nodeHtmlTemplate]=\"nodeHtmlDirective?.templateRef\"\n [handleTemplate]=\"handleTemplateDirective?.templateRef\"\n [attr.transform]=\"model.pointTransform()\"\n />\n </svg:g>\n\n</svg:svg>\n", styles: [":host{display:block;width:100%;height:100%;-webkit-user-select:none;user-select:none}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: NodeComponent, selector: "g[node]", inputs: ["nodeModel", "nodeHtmlTemplate", "handleTemplate"] }, { kind: "component", type: EdgeComponent, selector: "g[edge]", inputs: ["model", "edgeTemplate", "edgeLabelHtmlTemplate"] }, { kind: "component", type: ConnectionComponent, selector: "g[connection]", inputs: ["model", "template"] }, { kind: "component", type: DefsComponent, selector: "defs[flowDefs]", inputs: ["markers"] }, { kind: "directive", type: SpacePointContextDirective, selector: "g[spacePointContext]" }, { kind: "directive", type: MapContextDirective, selector: "g[mapContext]", inputs: ["minZoom", "maxZoom"] }, { kind: "directive", type: RootSvgReferenceDirective, selector: "svg[rootSvgRef]" }, { kind: "directive", type: RootSvgContextDirective, selector: "svg[rootSvgContext]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1284
+ ], queries: [{ propertyName: "nodeHtmlDirective", first: true, predicate: NodeHtmlTemplateDirective, descendants: true }, { propertyName: "edgeTemplateDirective", first: true, predicate: EdgeTemplateDirective, descendants: true }, { propertyName: "edgeLabelHtmlDirective", first: true, predicate: EdgeLabelHtmlTemplateDirective, descendants: true }, { propertyName: "connectionTemplateDirective", first: true, predicate: ConnectionTemplateDirective, descendants: true }, { propertyName: "handleTemplateDirective", first: true, predicate: HandleTemplateDirective, descendants: true }], viewQueries: [{ propertyName: "mapContext", first: true, predicate: MapContextDirective, descendants: true }], hostDirectives: [{ directive: ConnectionControllerDirective, outputs: ["onConnect", "onConnect"] }, { directive: ChangesControllerDirective, outputs: ["onNodesChange", "onNodesChange", "onEdgesChange", "onEdgesChange"] }], ngImport: i0, template: "<svg:svg\n rootSvgRef\n rootSvgContext\n class=\"root-svg\"\n #flow\n [style.backgroundColor]=\"background\"\n [attr.width]=\"flowModel.flowWidth()\"\n [attr.height]=\"flowModel.flowHeight()\"\n>\n <defs [markers]=\"markers()\" flowDefs />\n\n <svg:g\n mapContext\n spacePointContext\n [minZoom]=\"minZoom\"\n [maxZoom]=\"maxZoom\"\n >\n <!-- Connection -->\n <svg:g\n connection\n [model]=\"connection\"\n [template]=\"connectionTemplateDirective?.templateRef\"\n />\n\n <!-- Edges -->\n <svg:g\n *ngFor=\"let model of edgeModels; trackBy: trackEdges\"\n edge\n [model]=\"model\"\n [edgeTemplate]=\"edgeTemplateDirective?.templateRef\"\n [edgeLabelHtmlTemplate]=\"edgeLabelHtmlDirective?.templateRef\"\n />\n\n <!-- Nodes -->\n <svg:g\n *ngFor=\"let model of nodeModels; trackBy: trackNodes\"\n node\n [nodeModel]=\"model\"\n [nodeHtmlTemplate]=\"nodeHtmlDirective?.templateRef\"\n [handleTemplate]=\"handleTemplateDirective?.templateRef\"\n [attr.transform]=\"model.pointTransform()\"\n />\n </svg:g>\n\n</svg:svg>\n", styles: [":host{display:block;width:100%;height:100%;-webkit-user-select:none;user-select:none}:host ::ng-deep *{box-sizing:border-box}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: NodeComponent, selector: "g[node]", inputs: ["nodeModel", "nodeHtmlTemplate", "handleTemplate"] }, { kind: "component", type: EdgeComponent, selector: "g[edge]", inputs: ["model", "edgeTemplate", "edgeLabelHtmlTemplate"] }, { kind: "component", type: ConnectionComponent, selector: "g[connection]", inputs: ["model", "template"] }, { kind: "component", type: DefsComponent, selector: "defs[flowDefs]", inputs: ["markers"] }, { kind: "directive", type: SpacePointContextDirective, selector: "g[spacePointContext]" }, { kind: "directive", type: MapContextDirective, selector: "g[mapContext]", inputs: ["minZoom", "maxZoom"] }, { kind: "directive", type: RootSvgReferenceDirective, selector: "svg[rootSvgRef]" }, { kind: "directive", type: RootSvgContextDirective, selector: "svg[rootSvgContext]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1216
1285
  }
1217
1286
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: VflowComponent, decorators: [{
1218
1287
  type: Component,
@@ -1226,7 +1295,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
1226
1295
  ], hostDirectives: [
1227
1296
  connectionControllerHostDirective,
1228
1297
  changesControllerHostDirective
1229
- ], template: "<svg:svg\n rootSvgRef\n rootSvgContext\n class=\"root-svg\"\n #flow\n [style.backgroundColor]=\"background\"\n [attr.width]=\"flowModel.flowWidth()\"\n [attr.height]=\"flowModel.flowHeight()\"\n>\n <defs [markers]=\"markers()\" flowDefs />\n\n <svg:g\n mapContext\n spacePointContext\n [minZoom]=\"minZoom\"\n [maxZoom]=\"maxZoom\"\n >\n <!-- Connection -->\n <svg:g\n connection\n [model]=\"connection\"\n [template]=\"connectionTemplateDirective?.templateRef\"\n />\n\n <!-- Edges -->\n <svg:g\n *ngFor=\"let model of edgeModels; trackBy: trackEdges\"\n edge\n [model]=\"model\"\n [edgeTemplate]=\"edgeTemplateDirective?.templateRef\"\n [edgeLabelHtmlTemplate]=\"edgeLabelHtmlDirective?.templateRef\"\n />\n\n <!-- Nodes -->\n <svg:g\n *ngFor=\"let model of nodeModels; trackBy: trackNodes\"\n node\n [nodeModel]=\"model\"\n [nodeHtmlTemplate]=\"nodeHtmlDirective?.templateRef\"\n [handleTemplate]=\"handleTemplateDirective?.templateRef\"\n [attr.transform]=\"model.pointTransform()\"\n />\n </svg:g>\n\n</svg:svg>\n", styles: [":host{display:block;width:100%;height:100%;-webkit-user-select:none;user-select:none}\n"] }]
1298
+ ], template: "<svg:svg\n rootSvgRef\n rootSvgContext\n class=\"root-svg\"\n #flow\n [style.backgroundColor]=\"background\"\n [attr.width]=\"flowModel.flowWidth()\"\n [attr.height]=\"flowModel.flowHeight()\"\n>\n <defs [markers]=\"markers()\" flowDefs />\n\n <svg:g\n mapContext\n spacePointContext\n [minZoom]=\"minZoom\"\n [maxZoom]=\"maxZoom\"\n >\n <!-- Connection -->\n <svg:g\n connection\n [model]=\"connection\"\n [template]=\"connectionTemplateDirective?.templateRef\"\n />\n\n <!-- Edges -->\n <svg:g\n *ngFor=\"let model of edgeModels; trackBy: trackEdges\"\n edge\n [model]=\"model\"\n [edgeTemplate]=\"edgeTemplateDirective?.templateRef\"\n [edgeLabelHtmlTemplate]=\"edgeLabelHtmlDirective?.templateRef\"\n />\n\n <!-- Nodes -->\n <svg:g\n *ngFor=\"let model of nodeModels; trackBy: trackNodes\"\n node\n [nodeModel]=\"model\"\n [nodeHtmlTemplate]=\"nodeHtmlDirective?.templateRef\"\n [handleTemplate]=\"handleTemplateDirective?.templateRef\"\n [attr.transform]=\"model.pointTransform()\"\n />\n </svg:g>\n\n</svg:svg>\n", styles: [":host{display:block;width:100%;height:100%;-webkit-user-select:none;user-select:none}:host ::ng-deep *{box-sizing:border-box}\n"] }]
1230
1299
  }], propDecorators: { view: [{
1231
1300
  type: Input
1232
1301
  }], minZoom: [{
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-vflow.mjs","sources":["../../../projects/ngx-vflow-lib/src/lib/vflow/services/viewport.service.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/utils/is-defined.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/directives/reference.directive.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/directives/map-context.directive.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/utils/round.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/services/draggable.service.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/directives/template.directive.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/utils/add-nodes-to-edges.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/models/flow.model.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/services/flow-status.service.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/models/connection.model.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/utils/hash.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/services/flow-entities.service.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/directives/connection-controller.directive.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/models/node.model.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/models/edge-label.model.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/math/point-on-line-by-ratio.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/math/edge-path/straigh-path.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/math/edge-path/bezier-path.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/models/edge.model.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/utils/reference-keeper.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/services/node-changes.service.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/services/edge-changes.service.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/directives/changes-controller.directive.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/components/node/node.component.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/components/node/node.component.html","../../../projects/ngx-vflow-lib/src/lib/vflow/components/edge-label/edge-label.component.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/components/edge-label/edge-label.component.html","../../../projects/ngx-vflow-lib/src/lib/vflow/components/edge/edge.component.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/components/edge/edge.component.html","../../../projects/ngx-vflow-lib/src/lib/vflow/directives/space-point-context.directive.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/components/connection/connection.component.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/components/defs/defs.component.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/components/defs/defs.component.html","../../../projects/ngx-vflow-lib/src/lib/vflow/directives/root-svg-context.directive.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/components/vflow/vflow.component.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/components/vflow/vflow.component.html","../../../projects/ngx-vflow-lib/src/lib/vflow/vflow.module.ts","../../../projects/ngx-vflow-lib/src/public-api.ts","../../../projects/ngx-vflow-lib/src/ngx-vflow.ts"],"sourcesContent":["import { Injectable, Signal, WritableSignal, signal } from '@angular/core';\nimport { Point } from '../interfaces/point.interface';\nimport { ViewportState, WritableViewport } from '../interfaces/viewport.interface';\n\n@Injectable()\nexport class ViewportService {\n /**\n * The default value used by d3, just copy it here\n *\n * @returns default viewport value\n */\n private static getDefaultViewport(): ViewportState { return { zoom: 1, x: 0, y: 0 } }\n\n /**\n * Internal signal that accepts value from user by lib api\n * When this signal changes, lib sets new view state and update readableViewport signal\n */\n public readonly writableViewport: WritableSignal<WritableViewport> = signal({\n changeType: 'initial',\n state: ViewportService.getDefaultViewport()\n })\n\n /**\n * Public signal with viewport state. User can directly read from this signal. It's updated by:\n * - user events on flow\n * - writableViewport signal\n */\n public readonly readableViewport: WritableSignal<ViewportState> = signal(ViewportService.getDefaultViewport())\n\n // TODO: add writableViewportWithConstraints (to apply min zoom/max zoom values)\n}\n","export function isDefined<T>(data: T | undefined): data is T {\n return data !== undefined\n}\n","import { Directive, ElementRef, inject } from '@angular/core';\n\n@Directive({\n selector: 'svg[rootSvgRef]'\n})\nexport class RootSvgReferenceDirective {\n public readonly element = inject<ElementRef<SVGSVGElement>>(ElementRef).nativeElement\n}\n","import { Directive, ElementRef, Injector, Input, OnInit, effect, inject, runInInjectionContext } from '@angular/core';\nimport { select } from 'd3-selection';\nimport { D3ZoomEvent, ZoomBehavior, zoom, zoomIdentity, zoomTransform } from 'd3-zoom';\nimport { ViewportService } from '../services/viewport.service';\nimport { isDefined } from '../utils/is-defined';\nimport { RootSvgReferenceDirective } from './reference.directive';\n\ntype ZoomEvent = D3ZoomEvent<SVGSVGElement, unknown>\n\n@Directive({ selector: 'g[mapContext]' })\nexport class MapContextDirective implements OnInit {\n @Input()\n public minZoom!: number\n\n @Input()\n public maxZoom!: number\n\n protected rootSvg = inject(RootSvgReferenceDirective).element\n protected host = inject<ElementRef<SVGGElement>>(ElementRef).nativeElement\n protected viewportService = inject(ViewportService)\n\n protected rootSvgSelection = select(this.rootSvg)\n protected zoomableSelection = select(this.host)\n\n // under the hood this effect triggers handleZoom, so error throws without this flag\n // TODO: hack with timer fixes wrong node scaling (handle positions not matched with content size)\n protected manualViewportChangeEffect = effect(() => setTimeout(() => {\n const viewport = this.viewportService.writableViewport()\n const state = viewport.state\n\n if (viewport.changeType === 'initial') {\n return\n }\n\n // If only zoom provided\n if (isDefined(state.zoom) && (!isDefined(state.x) && !isDefined(state.y))) {\n this.rootSvgSelection.call(this.zoomBehavior.scaleTo, state.zoom)\n\n return\n }\n\n // If only pan provided\n if ((isDefined(state.x) && isDefined(state.y)) && !isDefined(state.zoom)) {\n this.rootSvgSelection.call(this.zoomBehavior.translateTo, state.x, state.y)\n\n return\n }\n\n // If whole viewort state provided\n if (isDefined(state.x) && isDefined(state.y) && isDefined(state.zoom)) {\n this.rootSvgSelection.call(this.zoomBehavior.transform,\n zoomIdentity.translate(state.x, state.y).scale(state.zoom)\n )\n\n return\n }\n }), { allowSignalWrites: true })\n\n protected zoomBehavior!: ZoomBehavior<SVGSVGElement, unknown>;\n\n public ngOnInit(): void {\n this.zoomBehavior = zoom<SVGSVGElement, unknown>()\n .scaleExtent([this.minZoom, this.maxZoom])\n .on('zoom', this.handleZoom)\n\n this.rootSvgSelection.call(this.zoomBehavior)\n }\n\n private handleZoom = ({ transform }: ZoomEvent) => {\n // update public signal for user to read\n this.viewportService.readableViewport.set({ zoom: transform.k, x: transform.x, y: transform.y })\n\n this.zoomableSelection.attr('transform', transform.toString())\n }\n}\n","export const round = (num: number) => Math.round(num * 100) / 100\n","import { Injectable } from '@angular/core';\nimport { select } from 'd3-selection';\nimport { D3DragEvent, drag } from 'd3-drag';\nimport { NodeModel } from '../models/node.model';\nimport { round } from '../utils/round';\n\ntype DragEvent = D3DragEvent<Element, unknown, unknown>\n\n@Injectable()\nexport class DraggableService {\n /**\n * Enable or disable draggable behavior for element.\n * model contains draggable flag which declares if draggable should be enabled or not\n *\n * @param element target element for toggling draggable\n * @param model model with data for this element\n */\n public toggleDraggable(element: Element, model: NodeModel) {\n const d3Element = select(element)\n\n const behavior = model.draggable\n ? this.getDragBehavior(model)\n : this.getIgnoreDragBehavior()\n\n d3Element.call(behavior)\n }\n\n /**\n * TODO: not shure if this work, need to check\n *\n * @param element\n */\n public destroy(element: Element) {\n select(element).on('.drag', null)\n }\n\n /**\n * Node drag behavior. Updated node's coordinate according to dragging\n *\n * @param model\n * @returns\n */\n private getDragBehavior(model: NodeModel) {\n let deltaX: number\n let deltaY: number\n\n return drag()\n .on('start', (event: DragEvent) => {\n deltaX = model.point().x - event.x\n deltaY = model.point().y - event.y\n })\n\n .on('drag', (event: DragEvent) => {\n model.point.set(\n {\n x: round(event.x + deltaX),\n y: round(event.y + deltaY)\n }\n )\n })\n }\n\n /**\n * Specify ignoring drag behavior. It's responsible for not moving the map when user tries to drag node\n * with disabled drag behavior\n */\n private getIgnoreDragBehavior() {\n return drag()\n .on('drag', (event: DragEvent) => {\n (event.sourceEvent as Event).stopPropagation()\n })\n }\n}\n","import { Directive, TemplateRef, inject } from '@angular/core';\nimport { EdgeContext } from '../interfaces/template-context.interface';\n\n@Directive({ selector: 'ng-template[edge]' })\nexport class EdgeTemplateDirective {\n public templateRef = inject<TemplateRef<EdgeContext>>(TemplateRef)\n}\n\n@Directive({ selector: 'ng-template[connection]' })\nexport class ConnectionTemplateDirective {\n public templateRef = inject(TemplateRef)\n}\n\n@Directive({ selector: 'ng-template[edgeLabelHtml]' })\nexport class EdgeLabelHtmlTemplateDirective {\n public templateRef = inject(TemplateRef)\n}\n\n@Directive({ selector: 'ng-template[nodeHtml]' })\nexport class NodeHtmlTemplateDirective {\n public templateRef = inject(TemplateRef)\n}\n\n@Directive({ selector: 'ng-template[handle]' })\nexport class HandleTemplateDirective {\n public templateRef = inject(TemplateRef)\n}\n","import { EdgeModel } from \"../models/edge.model\"\nimport { NodeModel } from \"../models/node.model\"\n\nexport function addNodesToEdges(nodes: NodeModel[], edges: EdgeModel[]) {\n const nodesById = nodes.reduce((acc, n) => {\n acc[n.node.id] = n\n\n return acc\n }, {} as { [nodeId: string]: NodeModel })\n\n edges.forEach(e => {\n e.source = nodesById[e.edge.source]\n e.target = nodesById[e.edge.target]\n })\n}\n","import { Signal, WritableSignal, computed, signal } from \"@angular/core\";\nimport { HandlePositions } from \"../interfaces/handle-positions.interface\";\n\nexport class FlowModel {\n /**\n * Global setting with handle positions. Nodes derive this value\n */\n public handlePositions: WritableSignal<HandlePositions> = signal({ source: 'right', target: 'left' })\n\n /**\n * @see {VflowComponent.view}\n */\n public view: WritableSignal<[number, number] | 'auto'> = signal([400, 400])\n\n public flowWidth = computed(() => this.view() === 'auto' ? '100%' : this.view()[0])\n\n public flowHeight = computed(() => this.view() === 'auto' ? '100%' : this.view()[1])\n}\n","import { Injectable, signal } from '@angular/core';\nimport { NodeModel } from '../models/node.model';\n\nexport interface FlowStatusIdle {\n state: 'idle',\n payload: null\n}\n\nexport interface FlowStatusConnectionStart {\n state: 'connection-start',\n payload: {\n sourceNode: NodeModel\n }\n}\n\nexport interface FlowStatusConnectionValidation {\n state: 'connection-validation',\n payload: {\n sourceNode: NodeModel\n targetNode: NodeModel\n valid: boolean\n }\n}\n\nexport interface FlowStatusConnectionEnd {\n state: 'connection-end',\n payload: {\n sourceNode: NodeModel\n targetNode: NodeModel\n }\n}\n\nexport type FlowStatus =\n FlowStatusIdle |\n FlowStatusConnectionStart |\n FlowStatusConnectionValidation |\n FlowStatusConnectionEnd\n\n@Injectable()\nexport class FlowStatusService {\n public readonly status = signal<FlowStatus>({ state: 'idle', payload: null })\n\n public setIdleStatus() {\n this.status.set({ state: 'idle', payload: null })\n }\n\n public setConnectionStartStatus(sourceNode: NodeModel) {\n this.status.set({ state: 'connection-start', payload: { sourceNode } })\n }\n\n public setConnectionValidationStatus(sourceNode: NodeModel, targetNode: NodeModel, valid: boolean) {\n this.status.set({ state: 'connection-validation', payload: { sourceNode, targetNode, valid } })\n }\n\n public setConnectionEndStatus(sourceNode: NodeModel, targetNode: NodeModel) {\n this.status.set({ state: 'connection-end', payload: { sourceNode, targetNode } })\n }\n}\n\n/**\n * Batch status changes together to call them one after another\n *\n * @param changes list of set[FlowStatus.state]Status() calls\n */\nexport function batchStatusChanges(...changes: Function[]) {\n if (changes.length) {\n const [firstChange, ...restChanges] = changes\n // first change is sync\n firstChange()\n // without timer, subscribed effects/comuted signals only get latest value\n restChanges.forEach(change => setTimeout(() => change()))\n }\n}\n","import { ConnectionSettings, ConnectionValidatorFn } from \"../interfaces/connection-settings.interface\";\nimport { Curve, EdgeType } from \"../interfaces/edge.interface\";\n\nexport class ConnectionModel {\n public curve: Curve\n public type: EdgeType\n public validator: ConnectionValidatorFn\n\n constructor(public connection: ConnectionSettings) {\n this.curve = connection.curve ?? 'bezier'\n this.type = connection.type ?? 'default'\n this.validator = connection.validator ?? (() => true)\n }\n}\n","export function hashCode(str: string): number {\n return str.split('').reduce((a, b) => {\n a = ((a << 5) - a) + b.charCodeAt(0)\n\n return a & a\n }, 0)\n}\n","import { Injectable, computed, effect, signal, untracked } from '@angular/core';\nimport { NodeModel } from '../models/node.model';\nimport { EdgeModel } from '../models/edge.model';\nimport { ConnectionModel } from '../models/connection.model';\nimport { Marker } from '../interfaces/marker.interface';\nimport { hashCode } from '../utils/hash';\n\n@Injectable()\nexport class FlowEntitiesService {\n public readonly nodes = signal<NodeModel[]>([], {\n // empty arrays considered equal, other arrays may not be equal\n equal: (a, b) => !a.length && !b.length ? true : a === b\n })\n\n public readonly edges = signal<EdgeModel[]>([], {\n // empty arrays considered equal, other arrays may not be equal\n equal: (a, b) => !a.length && !b.length ? true : a === b\n })\n\n public readonly connection = signal<ConnectionModel>(new ConnectionModel({}))\n\n public readonly markers = computed(() => {\n const markersMap = new Map<number, Marker>()\n\n this.validEdges().forEach(e => {\n if (e.edge.markers?.start) {\n const hash = hashCode(JSON.stringify(e.edge.markers.start))\n markersMap.set(hash, e.edge.markers.start)\n }\n\n if (e.edge.markers?.end) {\n const hash = hashCode(JSON.stringify(e.edge.markers.end))\n markersMap.set(hash, e.edge.markers.end)\n }\n })\n\n const connectionMarker = this.connection().connection.marker\n if (connectionMarker) {\n const hash = hashCode(JSON.stringify(connectionMarker))\n markersMap.set(hash, connectionMarker)\n }\n\n return markersMap\n })\n\n public readonly validEdges = computed(() => {\n const nodes = this.nodes()\n\n return this.edges().filter(e => nodes.includes(e.source) && nodes.includes(e.target))\n })\n\n public getNode<T>(id: string) {\n return this.nodes().find(({ node }) => node.id === id) as NodeModel<T> | undefined\n }\n}\n","import { Directive, EventEmitter, Output, effect, inject } from '@angular/core';\nimport { Connection } from '../interfaces/connection.interface';\nimport { FlowStatusService } from '../services/flow-status.service';\n\nimport { FlowEntitiesService } from '../services/flow-entities.service';\n\n@Directive({\n selector: '[connectionController]',\n standalone: true\n})\nexport class ConnectionControllerDirective {\n @Output()\n public onConnect = new EventEmitter<Connection>()\n\n private statusService = inject(FlowStatusService)\n private flowEntitiesService = inject(FlowEntitiesService)\n\n protected connectEffect = effect(() => {\n const status = this.statusService.status()\n\n if (status.state === 'connection-end') {\n const sourceModel = status.payload.sourceNode\n const targetModel = status.payload.targetNode\n\n const source = sourceModel.node.id\n const target = targetModel.node.id\n\n const connection = this.flowEntitiesService.connection()\n\n if (connection.validator({ source, target })) {\n this.onConnect.emit({ source, target })\n }\n }\n }, { allowSignalWrites: true })\n}\n","import { Injector, computed, inject, signal } from '@angular/core'\nimport { Node } from '../interfaces/node.interface'\nimport { FlowModel } from './flow.model'\nimport { isDefined } from '../utils/is-defined'\nimport { toObservable } from '@angular/core/rxjs-interop'\n\nexport class NodeModel<T = unknown> {\n public point = signal({ x: 0, y: 0 })\n\n public point$ = toObservable(this.point)\n\n public size = signal({ width: 0, height: 0 })\n\n public pointTransform = computed(() => `translate(${this.point().x}, ${this.point().y})`)\n\n public sourceOffset = computed(() => {\n const { width, height } = this.size()\n\n switch (this.sourcePosition()) {\n case 'left': return { x: 0, y: height / 2 }\n case 'right': return { x: width, y: height / 2 }\n case 'top': return { x: width / 2, y: 0 }\n case 'bottom': return { x: width / 2, y: height }\n }\n })\n\n public targetOffset = computed(() => {\n const { width, height } = this.size()\n\n switch (this.targetPosition()) {\n case 'left': return { x: 0, y: (height / 2) }\n case 'right': return { x: width, y: height / 2 }\n case 'top': return { x: width / 2, y: 0 }\n case 'bottom': return { x: width / 2, y: height }\n }\n })\n\n public sourcePointAbsolute = computed(() => {\n return {\n x: this.point().x + this.sourceOffset().x + this.sourceHandleOffset().x,\n y: this.point().y + this.sourceOffset().y + this.sourceHandleOffset().y\n }\n })\n\n public targetPointAbsolute = computed(() => {\n return {\n x: this.point().x + this.targetOffset().x + this.targetHandleOffset().x,\n y: this.point().y + this.targetOffset().y + this.targetHandleOffset().y\n }\n })\n\n // Now source and handle positions derived from parent flow\n public sourcePosition = computed(() => this.flow.handlePositions().source)\n public targetPosition = computed(() => this.flow.handlePositions().target)\n\n public sourceHandleSize = signal({ width: 0, height: 0 })\n public targetHandleSize = signal({ width: 0, height: 0 })\n\n public sourceHandleOffset = computed(() => {\n switch (this.sourcePosition()) {\n case 'left': return { x: -(this.sourceHandleSize().width / 2), y: 0 }\n case 'right': return { x: this.sourceHandleSize().width / 2, y: 0 }\n case 'top': return { x: 0, y: -(this.sourceHandleSize().height / 2) }\n case 'bottom': return { x: 0, y: this.sourceHandleSize().height / 2 }\n }\n })\n\n public targetHandleOffset = computed(() => {\n switch (this.targetPosition()) {\n case 'left': return { x: -(this.targetHandleSize().width / 2), y: 0 }\n case 'right': return { x: this.targetHandleSize().width / 2, y: 0 }\n case 'top': return { x: 0, y: -(this.targetHandleSize().height / 2) }\n case 'bottom': return { x: 0, y: this.targetHandleSize().height / 2 }\n }\n })\n\n public sourceOffsetAligned = computed(() => {\n return {\n x: this.sourceOffset().x - (this.sourceHandleSize().width / 2),\n y: this.sourceOffset().y - (this.sourceHandleSize().height / 2),\n }\n })\n\n public targetOffsetAligned = computed(() => {\n return {\n x: this.targetOffset().x - (this.targetHandleSize().width / 2),\n y: this.targetOffset().y - (this.targetHandleSize().height / 2),\n }\n })\n\n public draggable = true\n\n // disabled for configuration for now\n public readonly magnetRadius = 20\n\n private flow!: FlowModel\n\n constructor(\n public node: Node<T>\n ) {\n this.point.set(node.point)\n\n if (isDefined(node.draggable)) this.draggable = node.draggable\n }\n\n /**\n * Bind parent flow model to node\n *\n * @param flow parent flow\n */\n public bindFlow(flow: FlowModel) {\n this.flow = flow\n }\n}\n","import { signal } from \"@angular/core\"\nimport { EdgeLabel } from \"../interfaces/edge-label.interface\"\n\nexport class EdgeLabelModel {\n public size = signal({ width: 0, height: 0 })\n\n constructor(public edgeLabel: EdgeLabel) { }\n}\n","import { Point } from \"../interfaces/point.interface\";\n\n/**\n * Get point on line\n *\n * https://math.stackexchange.com/questions/563566/how-do-i-find-the-middle1-2-1-3-1-4-etc-of-a-line\n */\nexport function getPointOnLineByRatio(start: Point, end: Point, ratio: number): Point {\n return {\n x: (1 - ratio) * start.x + ratio * end.x,\n y: (1 - ratio) * start.y + ratio * end.y,\n };\n}\n","import { PathData } from \"../../interfaces/path-data.interface\";\nimport { Point } from \"../../interfaces/point.interface\";\nimport { path as d3Path } from 'd3-path'\nimport { UsingPoints } from \"../../types/using-points.type\";\nimport { getPointOnLineByRatio } from \"../point-on-line-by-ratio\";\n\nexport function straightPath(\n source: Point,\n target: Point,\n usingPoints: UsingPoints = [false, false, false]\n): PathData {\n const [start, center, end] = usingPoints\n const nullPoint = { x: 0, y: 0 }\n\n const path = d3Path()\n\n path.moveTo(source.x, source.y)\n path.lineTo(target.x, target.y)\n\n return {\n path: path.toString(),\n points: {\n start: start ? getPointOnLineByRatio(source, target, .15) : nullPoint,\n center: center ? getPointOnLineByRatio(source, target, .50) : nullPoint,\n end: end ? getPointOnLineByRatio(source, target, .85) : nullPoint,\n }\n }\n}\n","import { PathData } from '../../interfaces/path-data.interface';\nimport { Point } from '../../interfaces/point.interface';\nimport { Path, path as d3Path } from 'd3-path';\nimport { UsingPoints } from '../../types/using-points.type';\nimport { Position } from '../../types/position.type';\nimport { getPointOnLineByRatio } from '../point-on-line-by-ratio';\n\nexport function bezierPath(\n source: Point,\n target: Point,\n sourcePosition: Position,\n targetPosition: Position,\n usingPoints: UsingPoints = [false, false, false]\n): PathData {\n const path = d3Path();\n\n path.moveTo(source.x, source.y);\n\n const distanceVector = { x: source.x - target.x, y: source.y - target.y };\n\n const firstControl = calcControlPoint(source, sourcePosition, distanceVector);\n const secondControl = calcControlPoint(target, targetPosition, distanceVector);\n\n path.bezierCurveTo(\n firstControl.x,\n firstControl.y,\n secondControl.x,\n secondControl.y,\n target.x,\n target.y\n );\n\n return getPathData(\n path,\n source,\n target,\n firstControl,\n secondControl,\n usingPoints\n );\n}\n\n/**\n * Calculate control point based on provided point\n *\n * @param point relative this point control point is gonna be computed (the source or the target)\n * @param pointPosition position of {point} on block\n * @param distanceVector transmits the distance between the source and the target as x and y coordinates\n */\n\nfunction calcControlPoint(\n point: Point,\n pointPosition: Position,\n distanceVector: Point\n) {\n const factorPoint = { x: 0, y: 0 };\n\n switch (pointPosition) {\n case 'top':\n factorPoint.y = 1;\n break;\n case 'bottom':\n factorPoint.y = -1;\n break;\n case 'right':\n factorPoint.x = 1;\n break;\n case 'left':\n factorPoint.x = -1;\n break;\n }\n\n // TODO: explain name\n const fullDistanceVector = {\n x: distanceVector.x * Math.abs(factorPoint.x),\n y: distanceVector.y * Math.abs(factorPoint.y),\n };\n\n // TODO: probably need to make this configurable\n const curvature = 0.25;\n // thanks colleagues from react/svelte world\n // https://github.com/xyflow/xyflow/blob/f0117939bae934447fa7f232081f937169ee23b5/packages/system/src/utils/edges/bezier-edge.ts#L56\n const controlOffset =\n curvature * 25 * Math.sqrt(Math.abs(fullDistanceVector.x + fullDistanceVector.y));\n\n return {\n x: point.x + factorPoint.x * controlOffset,\n y: point.y - factorPoint.y * controlOffset,\n };\n}\n\nfunction getPathData(\n path: Path,\n source: Point,\n target: Point,\n firstControl: Point,\n secondControl: Point,\n usingPoints: UsingPoints\n): PathData {\n const [start, center, end] = usingPoints;\n\n const nullPoint = { x: 0, y: 0 };\n\n return {\n path: path.toString(),\n points: {\n start: start\n ? getPointOnBezier(source, target, firstControl, secondControl, 0.1)\n : nullPoint,\n center: center\n ? getPointOnBezier(source, target, firstControl, secondControl, 0.5)\n : nullPoint,\n end: end\n ? getPointOnBezier(source, target, firstControl, secondControl, 0.9)\n : nullPoint,\n },\n };\n}\n\n/**\n * Get point on bezier curve by ratio\n */\nfunction getPointOnBezier(\n sourcePoint: Point,\n targetPoint: Point,\n controlPoint1: Point,\n controlPoint2: Point,\n ratio: number\n): Point {\n const fromSourceToFirstControl: Point = getPointOnLineByRatio(\n sourcePoint,\n controlPoint1,\n ratio\n );\n const fromFirstControlToSecond: Point = getPointOnLineByRatio(\n controlPoint1,\n controlPoint2,\n ratio\n );\n const fromSecondControlToTarget: Point = getPointOnLineByRatio(\n controlPoint2,\n targetPoint,\n ratio\n );\n\n return getPointOnLineByRatio(\n getPointOnLineByRatio(fromSourceToFirstControl, fromFirstControlToSecond, ratio),\n getPointOnLineByRatio(fromFirstControlToSecond, fromSecondControlToTarget, ratio),\n ratio\n );\n}\n","import { computed } from \"@angular/core\";\nimport { EdgeLabelPosition } from \"../interfaces/edge-label.interface\";\nimport { Edge, Curve, EdgeType } from \"../interfaces/edge.interface\";\nimport { EdgeLabelModel } from \"./edge-label.model\";\nimport { NodeModel } from \"./node.model\";\nimport { straightPath } from \"../math/edge-path/straigh-path\";\nimport { bezierPath } from \"../math/edge-path/bezier-path\";\nimport { UsingPoints } from \"../types/using-points.type\";\n\nexport class EdgeModel {\n public source!: NodeModel\n public target!: NodeModel\n public curve: Curve\n public type: EdgeType\n\n public path = computed(() => {\n const source = this.source.sourcePointAbsolute()\n const target = this.target.targetPointAbsolute()\n\n switch (this.curve) {\n case 'straight':\n return straightPath(source, target, this.usingPoints)\n case 'bezier':\n return bezierPath(\n source, target,\n this.source.sourcePosition(),\n this.target.targetPosition(),\n this.usingPoints\n )\n }\n })\n\n public edgeLabels: { [position in EdgeLabelPosition]?: EdgeLabelModel } = {}\n\n private usingPoints: UsingPoints\n\n constructor(public edge: Edge) {\n this.type = edge.type ?? 'default'\n this.curve = edge.curve ?? 'bezier'\n\n if (edge.edgeLabels?.start) this.edgeLabels.start = new EdgeLabelModel(edge.edgeLabels.start)\n if (edge.edgeLabels?.center) this.edgeLabels.center = new EdgeLabelModel(edge.edgeLabels.center)\n if (edge.edgeLabels?.end) this.edgeLabels.end = new EdgeLabelModel(edge.edgeLabels.end)\n\n this.usingPoints = [!!this.edgeLabels.start, !!this.edgeLabels.center, !!this.edgeLabels.end]\n }\n}\n","import { NodeModel } from \"../models/node.model\";\nimport { Node } from '../interfaces/node.interface';\nimport { EdgeModel } from \"../models/edge.model\";\nimport { Edge } from \"../interfaces/edge.interface\";\n\nexport class ReferenceKeeper {\n /**\n * Create new models for new node references and keep old models for old node references\n */\n public static nodes(newNodes: Node[], oldNodeModels: NodeModel[]) {\n const oldNodesMap: Map<Node, NodeModel> = new Map()\n oldNodeModels.forEach(model => oldNodesMap.set(model.node, model))\n\n return newNodes.map(newNode => {\n if (oldNodesMap.has(newNode)) return oldNodesMap.get(newNode)!\n else return new NodeModel(newNode)\n })\n }\n\n /**\n * Create new models for new edge references and keep old models for old edge references\n */\n public static edges(newEdges: Edge[], oldEdgeModels: EdgeModel[]) {\n const oldEdgesMap: Map<Edge, EdgeModel> = new Map()\n oldEdgeModels.forEach(model => oldEdgesMap.set(model.edge, model))\n\n return newEdges.map(newEdge => {\n if (oldEdgesMap.has(newEdge)) return oldEdgesMap.get(newEdge)!\n else return new EdgeModel(newEdge)\n })\n }\n}\n","import { Injectable, Signal, inject } from '@angular/core';\nimport { FlowEntitiesService } from './flow-entities.service';\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { Observable, filter, map, merge, of, pairwise, skip, switchMap } from 'rxjs';\nimport { NodeChange } from '../types/node-change.type';\n\n@Injectable()\nexport class NodesChangeService {\n protected entitiesService = inject(FlowEntitiesService)\n\n protected nodesPositionChange$ = toObservable(this.entitiesService.nodes)\n .pipe(\n // Check for nodes list change and watch for specific node from this list change its position\n switchMap((nodes) =>\n merge(\n ...nodes.map(node =>\n node.point$.pipe(\n // skip initial position from signal\n skip(1),\n map(() => node)\n )\n )\n )\n ),\n // For now it's a single node, later this list will also be filled\n // with child node position changes\n map(changedNode => [\n { type: 'position', id: changedNode.node.id, point: changedNode.point() }\n ])\n ) satisfies Observable<NodeChange[]>\n\n protected nodeAddChange$ = toObservable(this.entitiesService.nodes)\n .pipe(\n pairwise(),\n map(([oldList, newList]) =>\n newList.filter(node => !oldList.includes(node))\n ),\n filter((nodes) => !!nodes.length),\n map((nodes) =>\n nodes.map(node => ({ type: 'add', id: node.node.id }))\n )\n ) satisfies Observable<NodeChange[]>\n\n protected nodeRemoveChange$ = toObservable(this.entitiesService.nodes)\n .pipe(\n pairwise(),\n map(([oldList, newList]) =>\n oldList.filter(node => !newList.includes(node))\n ),\n filter((nodes) => !!nodes.length),\n map((nodes) =>\n nodes.map(node => ({ type: 'remove', id: node.node.id }))\n )\n ) satisfies Observable<NodeChange[]>\n\n public readonly changes$: Observable<NodeChange[]> = merge(\n this.nodesPositionChange$,\n this.nodeAddChange$,\n this.nodeRemoveChange$\n )\n}\n","import { Injectable, computed, inject, untracked } from '@angular/core';\nimport { FlowEntitiesService } from './flow-entities.service';\nimport { Observable, asyncScheduler, filter, map, merge, observeOn, pairwise, skip } from 'rxjs';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { EdgeChange } from '../types/edge-change.type';\n\n@Injectable()\nexport class EdgeChangesService {\n protected entitiesService = inject(FlowEntitiesService)\n\n protected edgeDetachedChange$ = toObservable(\n computed(() => {\n const nodes = this.entitiesService.nodes()\n const edges = untracked(this.entitiesService.edges)\n\n return edges.filter(({ source, target }) =>\n !nodes.includes(source) || !nodes.includes(target)\n )\n })\n ).pipe(\n // TODO check why there are 2 emits from single call inside computed\n filter(edges => !!edges.length),\n map((edges) =>\n edges.map(({ edge }) => ({ type: 'detached', id: edge.id }))\n )\n ) satisfies Observable<EdgeChange[]>\n\n protected edgeAddChange$ = toObservable(this.entitiesService.edges)\n .pipe(\n pairwise(),\n map(([oldList, newList]) => {\n return newList.filter(edge => !oldList.includes(edge))\n }),\n filter(edges => !!edges.length),\n map((edges) =>\n edges.map(({ edge }) => ({ type: 'add', id: edge.id }))\n )\n ) satisfies Observable<EdgeChange[]>\n\n protected edgeRemoveChange$ = toObservable(this.entitiesService.edges)\n .pipe(\n pairwise(),\n map(([oldList, newList]) => {\n return oldList.filter(edge => !newList.includes(edge))\n }),\n filter(edges => !!edges.length),\n map((edges) =>\n edges.map(({ edge }) => ({ type: 'remove', id: edge.id }))\n )\n ) satisfies Observable<EdgeChange[]>\n\n public readonly changes$: Observable<EdgeChange[]> = merge(\n this.edgeDetachedChange$,\n this.edgeAddChange$,\n this.edgeRemoveChange$\n )\n .pipe(\n // this fixes the case when user gets 'deteched' changes\n // and tries to delete these edges inside stream\n // angular may ignore this change because [edges] input changed\n // right after [nodes] input change\n observeOn(asyncScheduler),\n )\n}\n","import { Directive, EventEmitter, Output, effect, inject } from '@angular/core';\nimport { NodeChange } from '../types/node-change.type';\nimport { EdgeChangesService } from '../services/edge-changes.service';\nimport { NodesChangeService } from '../services/node-changes.service';\nimport { tap } from 'rxjs';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { EdgeChange } from '../types/edge-change.type';\n\n@Directive({\n selector: '[changesController]',\n standalone: true\n})\nexport class ChangesControllerDirective {\n protected nodesChangeService = inject(NodesChangeService)\n protected edgesChangeService = inject(EdgeChangesService)\n\n @Output()\n public onNodesChange = new EventEmitter<NodeChange[]>()\n\n @Output()\n public onEdgesChange = new EventEmitter<EdgeChange[]>()\n\n protected nodesChangeProxySubscription = this.nodesChangeService.changes$\n .pipe(\n tap((changes) => this.onNodesChange.emit(changes)),\n takeUntilDestroyed()\n )\n .subscribe()\n\n protected edgesChangeProxySubscription = this.edgesChangeService.changes$\n .pipe(\n tap((changes) => this.onEdgesChange.emit(changes)),\n takeUntilDestroyed()\n )\n .subscribe()\n}\n","import { AfterViewInit, ChangeDetectionStrategy, Component, ElementRef, HostBinding, Input, NgZone, OnDestroy, OnInit, TemplateRef, ViewChild, computed, inject, signal } from '@angular/core';\nimport { DraggableService } from '../../services/draggable.service';\nimport { NodeModel } from '../../models/node.model';\nimport { FlowStatusService, batchStatusChanges } from '../../services/flow-status.service';\nimport { FlowEntitiesService } from '../../services/flow-entities.service';\n\nexport type HandleState = 'valid' | 'invalid' | 'idle'\n\n@Component({\n selector: 'g[node]',\n templateUrl: './node.component.html',\n styleUrls: ['./node.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class NodeComponent implements OnInit, AfterViewInit, OnDestroy {\n @Input()\n public nodeModel!: NodeModel\n\n @Input()\n public nodeHtmlTemplate?: TemplateRef<any>\n\n @Input()\n public handleTemplate?: TemplateRef<any>\n\n @ViewChild('nodeContent')\n public nodeContentRef!: ElementRef<SVGGraphicsElement>\n\n @ViewChild('htmlWrapper')\n public htmlWrapperRef!: ElementRef<HTMLDivElement>\n\n @ViewChild('sourceHandle')\n public sourceHandleRef!: ElementRef<SVGGElement | SVGCircleElement>\n\n @ViewChild('targetHandle')\n public targetHandleRef!: ElementRef<SVGGElement | SVGCircleElement>\n\n private draggableService = inject(DraggableService)\n private flowStatusService = inject(FlowStatusService)\n private flowEntitiesService = inject(FlowEntitiesService)\n private hostRef = inject<ElementRef<SVGElement>>(ElementRef)\n\n protected showMagnet = computed(() =>\n this.flowStatusService.status().state === 'connection-start' ||\n this.flowStatusService.status().state === 'connection-validation'\n )\n\n protected readonly defaultHandleStrokeWidth = 2;\n\n private sourceHanldeState = signal<HandleState>('idle')\n private targetHandleState = signal<HandleState>('idle')\n\n private sourceHanldeStateReadonly = this.sourceHanldeState.asReadonly()\n private targetHanldeStateReadonly = this.targetHandleState.asReadonly()\n\n public ngOnInit() {\n this.draggableService.toggleDraggable(this.hostRef.nativeElement, this.nodeModel)\n }\n\n public ngAfterViewInit(): void {\n // TODO remove microtask\n queueMicrotask(() => {\n if (this.nodeModel.node.type === 'default') {\n const { width, height } = this.nodeContentRef.nativeElement.getBBox()\n this.nodeModel.size.set({ width, height })\n }\n\n if (this.nodeModel.node.type === 'html-template') {\n const width = this.htmlWrapperRef.nativeElement.clientWidth\n const height = this.htmlWrapperRef.nativeElement.clientHeight\n\n this.nodeModel.size.set({ width, height })\n }\n\n this.setSourceHandleSize()\n this.setTargetHandleSize()\n })\n }\n\n public ngOnDestroy(): void {\n this.draggableService.destroy(this.hostRef.nativeElement)\n }\n\n protected startConnection(event: MouseEvent) {\n // ignore drag by stopping propagation\n event.stopPropagation()\n\n this.flowStatusService.setConnectionStartStatus(this.nodeModel)\n }\n\n protected endConnection() {\n const status = this.flowStatusService.status()\n\n if (status.state === 'connection-validation') {\n const sourceNode = status.payload.sourceNode\n const targetNode = this.nodeModel\n\n batchStatusChanges(\n // call to create connection\n () => this.flowStatusService.setConnectionEndStatus(sourceNode, targetNode),\n // when connection created, we need go back to idle status\n () => this.flowStatusService.setIdleStatus()\n )\n }\n }\n\n /**\n * TODO srp\n */\n protected validateTargetHandle() {\n const status = this.flowStatusService.status()\n\n if (status.state === 'connection-start') {\n const sourceNode = status.payload.sourceNode\n const targetNode = this.nodeModel\n\n const source = sourceNode.node.id\n const target = targetNode.node.id\n\n const valid = this.flowEntitiesService.connection().validator({ source, target })\n this.targetHandleState.set(valid ? 'valid' : 'invalid')\n\n this.flowStatusService.setConnectionValidationStatus(sourceNode, targetNode, valid)\n }\n }\n\n /**\n * TODO srp\n */\n protected resetValidateTargetHandle() {\n this.targetHandleState.set('idle')\n\n // drop back to start status\n const status = this.flowStatusService.status()\n if (status.state === 'connection-validation') {\n this.flowStatusService.setConnectionStartStatus(status.payload.sourceNode)\n }\n }\n\n protected getHandleContext(type: 'source' | 'target') {\n if (type === 'source') {\n return {\n $implicit: {\n point: this.nodeModel.sourceOffset,\n alignedPoint: this.nodeModel.sourceOffsetAligned,\n state: this.sourceHanldeStateReadonly\n }\n }\n }\n\n return {\n $implicit: {\n point: this.nodeModel.targetOffset,\n alignedPoint: this.nodeModel.targetOffsetAligned,\n state: this.targetHanldeStateReadonly\n }\n }\n }\n\n private setSourceHandleSize() {\n // if handle template provided, we don't know its stroke so it's 0\n const strokeWidth = this.handleTemplate ? 0 : (2 * this.defaultHandleStrokeWidth);\n\n const sourceBox = this.sourceHandleRef.nativeElement.getBBox({ stroke: true })\n this.nodeModel.sourceHandleSize.set({\n width: sourceBox.width + strokeWidth,\n height: sourceBox.height + strokeWidth\n })\n }\n\n private setTargetHandleSize() {\n const strokeWidth = this.handleTemplate ? 0 : (2 * this.defaultHandleStrokeWidth);\n\n const targetBox = this.targetHandleRef.nativeElement.getBBox({ stroke: true })\n this.nodeModel.targetHandleSize.set({\n width: targetBox.width + strokeWidth,\n height: targetBox.height + strokeWidth\n })\n }\n}\n","<svg:foreignObject\n *ngIf=\"nodeModel.node.type === 'default'\"\n #nodeContent\n width=\"100\"\n height=\"50\"\n>\n <div class=\"default-node\" [innerHTML]=\"nodeModel.node.text ?? ''\"></div>\n</svg:foreignObject>\n\n<svg:foreignObject\n *ngIf=\"nodeModel.node.type === 'html-template' && nodeHtmlTemplate\"\n [attr.width]=\"nodeModel.size().width\"\n [attr.height]=\"nodeModel.size().height\"\n>\n <div #htmlWrapper class=\"wrapper\">\n <ng-container\n *ngTemplateOutlet=\"nodeHtmlTemplate; context: { $implicit: { node: nodeModel.node } }\"\n />\n </div>\n</svg:foreignObject>\n\n<ng-container *ngIf=\"handleTemplate\">\n <svg:g #sourceHandle (mousedown)=\"startConnection($event)\">\n <ng-container *ngTemplateOutlet=\"handleTemplate; context: getHandleContext('source')\" />\n </svg:g>\n\n <svg:g #targetHandle>\n <ng-container *ngTemplateOutlet=\"handleTemplate; context: getHandleContext('target')\" />\n </svg:g>\n</ng-container>\n\n<ng-container *ngIf=\"!handleTemplate\">\n <svg:circle\n #sourceHandle\n [attr.cx]=\"nodeModel.sourceOffset().x\"\n [attr.cy]=\"nodeModel.sourceOffset().y\"\n [attr.stroke-width]=\"defaultHandleStrokeWidth\"\n r=\"5\"\n stroke=\"white\"\n fill=\"black\"\n (mousedown)=\"startConnection($event)\"\n />\n\n <svg:circle\n #targetHandle\n [attr.cx]=\"nodeModel.targetOffset().x\"\n [attr.cy]=\"nodeModel.targetOffset().y\"\n [attr.stroke-width]=\"defaultHandleStrokeWidth\"\n r=\"5\"\n stroke=\"white\"\n fill=\"black\"\n (mouseup)=\"endConnection()\"\n />\n</ng-container>\n\n<svg:circle\n *ngIf=\"showMagnet()\"\n class=\"magnet\"\n [attr.r]=\"nodeModel.magnetRadius\"\n [attr.cx]=\"nodeModel.targetOffset().x\"\n [attr.cy]=\"nodeModel.targetOffset().y\"\n (mouseup)=\"endConnection(); resetValidateTargetHandle()\"\n (mouseover)=\"validateTargetHandle()\"\n (mouseout)=\"resetValidateTargetHandle()\"\n/>\n\n\n","import { AfterViewInit, ChangeDetectionStrategy, Component, ElementRef, Input, OnChanges, OnInit, SimpleChanges, TemplateRef, ViewChild, computed, signal } from '@angular/core';\nimport { EdgeLabelModel } from '../../models/edge-label.model';\nimport { EdgeModel } from '../../models/edge.model';\nimport { Point } from '../../interfaces/point.interface';\n\n@Component({\n selector: 'g[edgeLabel]',\n templateUrl: './edge-label.component.html',\n styles: [`\n .edge-label-wrapper {\n width: max-content;\n\n /*\n this is a fix for bug in chrome, for some reason if the div fully matches the size\n of foreignObject there are occurs some visual artifacts around this div\n */\n margin-top: 1px;\n margin-left: 1px;\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class EdgeLabelComponent implements AfterViewInit {\n // TODO: too many inputs\n @Input()\n public model!: EdgeLabelModel\n\n @Input()\n public edgeModel!: EdgeModel\n\n @Input()\n public set point(point: Point) { this.pointSignal.set(point) }\n\n @Input()\n public htmlTemplate?: TemplateRef<any>\n\n @ViewChild('edgeLabelWrapper')\n public edgeLabelWrapperRef!: ElementRef<HTMLDivElement>\n\n /**\n * Centered point of label\n *\n * TODO: maybe put it into EdgeLabelModel\n */\n protected edgeLabelPoint = computed(() => {\n const point = this.pointSignal()\n\n const { width, height } = this.model.size()\n\n return {\n x: point.x - (width / 2),\n y: point.y - (height / 2)\n }\n })\n\n private pointSignal = signal({ x: 0, y: 0 })\n\n public ngAfterViewInit(): void {\n queueMicrotask(() => {\n // this is a fix for visual artifact in chrome that for some reason adresses only for edge label.\n // the bug reproduces if edgeLabelWrapperRef size fully matched the size of parent foreignObject\n const MAGIC_VALUE_TO_FIX_GLITCH_IN_CHROME = 2\n\n const width = this.edgeLabelWrapperRef.nativeElement.clientWidth + MAGIC_VALUE_TO_FIX_GLITCH_IN_CHROME\n const height = this.edgeLabelWrapperRef.nativeElement.clientHeight + MAGIC_VALUE_TO_FIX_GLITCH_IN_CHROME\n\n this.model.size.set({ width, height })\n })\n }\n\n protected getLabelContext() {\n return {\n $implicit: {\n edge: this.edgeModel.edge,\n label: this.model.edgeLabel\n }\n }\n }\n}\n","<svg:foreignObject\n [attr.x]=\"edgeLabelPoint().x\"\n [attr.y]=\"edgeLabelPoint().y\"\n [attr.width]=\"model.size().width\"\n [attr.height]=\"model.size().height\"\n *ngIf=\"model.edgeLabel.type === 'html-template' && htmlTemplate\"\n>\n <div #edgeLabelWrapper class=\"edge-label-wrapper\">\n <ng-container\n *ngTemplateOutlet=\"htmlTemplate; context: getLabelContext()\"\n />\n </div>\n</svg:foreignObject>\n","import { ChangeDetectionStrategy, Component, Input, OnInit, Signal, TemplateRef, computed } from '@angular/core';\nimport { EdgeModel } from '../../models/edge.model';\nimport { hashCode } from '../../utils/hash';\nimport { EdgeContext } from '../../interfaces/template-context.interface';\n\n@Component({\n selector: 'g[edge]',\n templateUrl: './edge.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class EdgeComponent implements OnInit {\n @Input()\n public model!: EdgeModel\n\n @Input()\n public edgeTemplate?: TemplateRef<EdgeContext>\n\n @Input()\n public edgeLabelHtmlTemplate?: TemplateRef<any>\n\n protected markerStartUrl = computed(() => {\n const marker = this.model.edge.markers?.start\n\n return marker ? `url(#${hashCode(JSON.stringify(marker))})` : ''\n })\n\n protected markerEndUrl = computed(() => {\n const marker = this.model.edge.markers?.end\n\n return marker ? `url(#${hashCode(JSON.stringify(marker))})` : ''\n })\n\n protected readonly defaultColor = 'rgb(177, 177, 183)'\n\n protected edgeContext!: EdgeContext\n\n public ngOnInit(): void {\n this.edgeContext = {\n $implicit: {\n // TODO: check if edge could change\n edge: this.model.edge,\n path: computed(() => this.model.path().path),\n markerStart: this.markerStartUrl,\n markerEnd: this.markerEndUrl\n }\n }\n }\n}\n","<svg:path\n *ngIf=\"model.type === 'default'\"\n [attr.d]=\"model.path().path\"\n [attr.marker-start]=\"markerStartUrl()\"\n [attr.marker-end]=\"markerEndUrl()\"\n [attr.stroke]=\"defaultColor\"\n stroke-width=\"2\"\n fill=\"none\"\n/>\n\n<ng-container *ngIf=\"model.type === 'template' && edgeTemplate\">\n <ng-container *ngTemplateOutlet=\"edgeTemplate; context: edgeContext\"></ng-container>\n</ng-container>\n\n<ng-container *ngIf=\"model.edgeLabels?.start as label\">\n <svg:g edgeLabel\n [model]=\"label\"\n [point]=\"model.path().points.start\"\n [edgeModel]=\"model\"\n [htmlTemplate]=\"edgeLabelHtmlTemplate\"\n />\n</ng-container>\n\n<ng-container *ngIf=\"model.edgeLabels?.center as label\">\n <svg:g edgeLabel\n [model]=\"label\"\n [point]=\"model.path().points.center\"\n [edgeModel]=\"model\"\n [htmlTemplate]=\"edgeLabelHtmlTemplate\"\n />\n</ng-container>\n\n<ng-container *ngIf=\"model.edgeLabels?.end as label\">\n <svg:g edgeLabel\n [model]=\"label\"\n [point]=\"model.path().points.end\"\n [edgeModel]=\"model\"\n [htmlTemplate]=\"edgeLabelHtmlTemplate\"\n />\n</ng-container>\n","import { Directive, ElementRef, Signal, computed, inject } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { fromEvent, map, startWith } from 'rxjs';\nimport { RootSvgReferenceDirective } from './reference.directive';\nimport { Point } from '../interfaces/point.interface';\n\n@Directive({ selector: 'g[spacePointContext]' })\nexport class SpacePointContextDirective {\n /**\n * Signal with current mouse position in svg space\n */\n public svgCurrentSpacePoint: Signal<Point> = computed(() => {\n const movement = this.mouseMovement()\n\n const point = this.rootSvg.createSVGPoint()\n point.x = movement.x\n point.y = movement.y\n\n return point.matrixTransform(this.host.getScreenCTM()!.inverse())\n })\n\n private rootSvg = inject(RootSvgReferenceDirective).element\n private host = inject<ElementRef<SVGGElement>>(ElementRef).nativeElement\n\n private mouseMovement = toSignal(\n fromEvent<MouseEvent>(this.rootSvg, 'mousemove').pipe(\n map(event => ({ x: event.clientX, y: event.clientY })),\n ),\n { initialValue: { x: 0, y: 0 } }\n )\n}\n","import { ChangeDetectionStrategy, Component, Input, TemplateRef, computed, inject } from '@angular/core';\nimport { FlowStatusService } from '../../services/flow-status.service';\nimport { straightPath } from '../../math/edge-path/straigh-path';\nimport { SpacePointContextDirective } from '../../directives/space-point-context.directive';\nimport { ConnectionModel } from '../../models/connection.model';\nimport { bezierPath } from '../../math/edge-path/bezier-path';\nimport { hashCode } from '../../utils/hash';\n\n@Component({\n selector: 'g[connection]',\n template: `\n <ng-container *ngIf=\"model.type === 'default'\">\n <svg:path\n *ngIf=\"path() as path\"\n [attr.d]=\"path\"\n [attr.marker-end]=\"markerUrl()\"\n [attr.stroke]=\"defaultColor\"\n fill=\"none\"\n stroke-width=\"2\"\n />\n </ng-container>\n\n <ng-container *ngIf=\"model.type === 'template' && template\">\n <ng-container *ngTemplateOutlet=\"template; context: getContext()\" />\n </ng-container>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class ConnectionComponent {\n @Input({ required: true })\n public model!: ConnectionModel\n\n @Input()\n public template?: TemplateRef<any>\n\n private flowStatusService = inject(FlowStatusService)\n private spacePointContext = inject(SpacePointContextDirective)\n\n protected path = computed(() => {\n const status = this.flowStatusService.status()\n\n if (status.state === 'connection-start') {\n const sourceNode = status.payload.sourceNode\n const sourcePoint = sourceNode.sourcePointAbsolute()\n const targetPoint = this.spacePointContext.svgCurrentSpacePoint()\n\n switch (this.model.curve) {\n case 'straight': return straightPath(sourcePoint, targetPoint).path\n case 'bezier': return bezierPath(\n sourcePoint, targetPoint,\n sourceNode.sourcePosition(), sourceNode.targetPosition()\n ).path\n }\n }\n\n if (status.state === 'connection-validation') {\n const sourcePoint = status.payload.sourceNode.sourcePointAbsolute()\n // ignore magnet if validation failed\n const targetPoint = status.payload.valid\n ? status.payload.targetNode.targetPointAbsolute()\n : this.spacePointContext.svgCurrentSpacePoint()\n\n switch (this.model.curve) {\n case 'straight': return straightPath(sourcePoint, targetPoint).path\n case 'bezier': return bezierPath(\n sourcePoint, targetPoint,\n status.payload.sourceNode.sourcePosition(),\n status.payload.sourceNode.targetPosition()\n ).path\n }\n }\n\n return null\n })\n\n protected markerUrl = computed(() => {\n const marker = this.model.connection.marker\n\n if (marker) {\n return `url(#${hashCode(JSON.stringify(marker))})`\n }\n\n return ''\n })\n\n protected readonly defaultColor = 'rgb(177, 177, 183)'\n\n protected getContext() {\n return {\n $implicit: {\n path: this.path,\n marker: this.markerUrl\n }\n }\n }\n}\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\nimport { Marker } from '../../interfaces/marker.interface';\n\n@Component({\n selector: 'defs[flowDefs]',\n templateUrl: './defs.component.html',\n styleUrls: ['./defs.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class DefsComponent {\n @Input({ required: true })\n public markers: Map<number, Marker> = new Map()\n\n protected readonly defaultColor = 'rgb(177, 177, 183)'\n}\n","<svg:marker\n *ngFor=\"let marker of markers | keyvalue\"\n [attr.id]=\"marker.key\"\n [attr.markerWidth]=\"marker.value.width ?? 16.5\"\n [attr.markerHeight]=\"marker.value.height ?? 16.5\"\n [attr.orient]=\"marker.value.orient ?? 'auto-start-reverse'\"\n viewBox=\"-10 -10 20 20\"\n [attr.markerUnits]=\"marker.value.markerUnits ?? 'userSpaceOnUse'\"\n refX=\"0\"\n refY=\"0\"\n>\n <polyline\n *ngIf=\"marker.value.type === 'arrow-closed' || !marker.value.type\"\n class=\"marker__arrow_closed\"\n [style.stroke]=\"marker.value.color ?? defaultColor\"\n [style.stroke-width]=\"marker.value.strokeWidth ?? 2\"\n [style.fill]=\"marker.value.color ?? defaultColor\"\n points=\"-5,-4 1,0 -5,4 -5,-4\"\n />\n\n <polyline\n *ngIf=\"marker.value.type === 'arrow'\"\n class=\"marker__arrow_default\"\n [style.stroke]=\"marker.value.color ?? defaultColor\"\n [style.stroke-width]=\"marker.value.strokeWidth ?? 2\"\n points=\"-5,-4 0,0 -5,4\"\n />\n</svg:marker>\n","import { Directive, HostListener, inject } from '@angular/core';\nimport { FlowStatusService } from '../services/flow-status.service';\n\n// TODO: too general purpose nane\n@Directive({ selector: 'svg[rootSvgContext]' })\nexport class RootSvgContextDirective {\n private flowStatusService = inject(FlowStatusService)\n\n // TODO: check for multiple instances on page\n @HostListener('document:mouseup')\n protected resetConnection() {\n const status = this.flowStatusService.status()\n\n if (status.state === 'connection-start') {\n this.flowStatusService.setIdleStatus()\n }\n }\n}\n","import { AfterContentInit, ChangeDetectionStrategy, Component, ContentChild, EventEmitter, Injector, Input, OnChanges, Output, Signal, SimpleChanges, ViewChild, computed, effect, inject, runInInjectionContext } from '@angular/core';\nimport { Node } from '../../interfaces/node.interface';\nimport { MapContextDirective } from '../../directives/map-context.directive';\nimport { DraggableService } from '../../services/draggable.service';\nimport { NodeModel } from '../../models/node.model';\nimport { ViewportService } from '../../services/viewport.service';\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { Edge } from '../../interfaces/edge.interface';\nimport { EdgeModel } from '../../models/edge.model';\nimport { ConnectionTemplateDirective, EdgeLabelHtmlTemplateDirective, EdgeTemplateDirective, HandleTemplateDirective, NodeHtmlTemplateDirective } from '../../directives/template.directive';\nimport { HandlePositions } from '../../interfaces/handle-positions.interface';\nimport { addNodesToEdges } from '../../utils/add-nodes-to-edges';\nimport { FlowModel } from '../../models/flow.model';\nimport { skip } from 'rxjs';\nimport { Point } from '../../interfaces/point.interface';\nimport { ViewportState } from '../../interfaces/viewport.interface';\nimport { FlowStatusService } from '../../services/flow-status.service';\nimport { ConnectionControllerDirective } from '../../directives/connection-controller.directive';\nimport { FlowEntitiesService } from '../../services/flow-entities.service';\nimport { ConnectionSettings } from '../../interfaces/connection-settings.interface';\nimport { ConnectionModel } from '../../models/connection.model';\nimport { ReferenceKeeper } from '../../utils/reference-keeper';\nimport { NodesChangeService } from '../../services/node-changes.service';\nimport { EdgeChangesService } from '../../services/edge-changes.service';\nimport { NodeChange } from '../../types/node-change.type';\nimport { ChangesControllerDirective } from '../../directives/changes-controller.directive';\nimport { EdgeChange } from '../../types/edge-change.type';\n\nconst connectionControllerHostDirective = {\n directive: ConnectionControllerDirective,\n outputs: ['onConnect']\n}\n\nconst changesControllerHostDirective = {\n directive: ChangesControllerDirective,\n outputs: ['onNodesChange', 'onEdgesChange']\n}\n\n@Component({\n selector: 'vflow',\n templateUrl: './vflow.component.html',\n styleUrls: ['./vflow.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n DraggableService,\n ViewportService,\n FlowStatusService,\n FlowEntitiesService,\n NodesChangeService,\n EdgeChangesService\n ],\n hostDirectives: [\n connectionControllerHostDirective,\n changesControllerHostDirective\n ]\n})\nexport class VflowComponent {\n // #region DI\n protected viewportService = inject(ViewportService)\n protected flowEntitiesService = inject(FlowEntitiesService)\n protected nodesChangeService = inject(NodesChangeService)\n protected edgesChangeService = inject(EdgeChangesService)\n protected injector = inject(Injector)\n // #endregion\n\n // #region SETTINGS\n\n /**\n * Size for flow view\n *\n * accepts\n * - absolute size in format [width, height] or\n * - 'auto' to compute size based on parent element size\n */\n @Input()\n public set view(view: [number, number] | 'auto') {\n this.flowModel.view.set(view)\n }\n\n @Input()\n public minZoom = 0.5\n\n @Input()\n public maxZoom = 3\n\n @Input()\n public set handlePositions(handlePositions: HandlePositions) {\n this.flowModel.handlePositions.set(handlePositions)\n }\n\n @Input()\n public background: string = '#FFFFFF'\n\n @Input({ transform: (settings: ConnectionSettings) => new ConnectionModel(settings) })\n public set connection(connection: ConnectionModel) { this.flowEntitiesService.connection.set(connection) }\n public get connection() { return this.flowEntitiesService.connection() }\n // #endregion\n\n // #region MAIN_INPUTS\n @Input({ required: true })\n public set nodes(newNodes: Node[]) {\n const newModels = runInInjectionContext(this.injector,\n () => ReferenceKeeper.nodes(newNodes, this.flowEntitiesService.nodes())\n )\n\n // TODO better to solve this by DI\n bindFlowToNodes(this.flowModel, newModels)\n\n // quick and dirty binding nodes to edges\n addNodesToEdges(newModels, this.flowEntitiesService.edges())\n\n this.flowEntitiesService.nodes.set(newModels)\n }\n\n public get nodeModels() { return this.flowEntitiesService.nodes() }\n\n @Input()\n public set edges(newEdges: Edge[]) {\n const newModels = ReferenceKeeper.edges(newEdges, this.flowEntitiesService.edges())\n\n // quick and dirty binding nodes to edges\n addNodesToEdges(this.nodeModels, newModels)\n\n this.flowEntitiesService.edges.set(newModels)\n }\n\n public get edgeModels() { return this.flowEntitiesService.validEdges() }\n // #endregion\n\n // #region TEMPLATES\n @ContentChild(NodeHtmlTemplateDirective)\n protected nodeHtmlDirective?: NodeHtmlTemplateDirective\n\n @ContentChild(EdgeTemplateDirective)\n protected edgeTemplateDirective?: EdgeTemplateDirective\n\n @ContentChild(EdgeLabelHtmlTemplateDirective)\n protected edgeLabelHtmlDirective?: EdgeLabelHtmlTemplateDirective\n\n @ContentChild(ConnectionTemplateDirective)\n protected connectionTemplateDirective?: ConnectionTemplateDirective\n\n @ContentChild(HandleTemplateDirective)\n protected handleTemplateDirective?: HandleTemplateDirective\n // #endregion\n\n // #region DIRECTIVES\n @ViewChild(MapContextDirective)\n protected mapContext!: MapContextDirective\n // #endregion\n\n // #region SIGNAL_API\n public readonly viewport = this.viewportService.readableViewport.asReadonly()\n\n public readonly nodesChange =\n toSignal(this.nodesChangeService.changes$, { initialValue: [] as NodeChange[] })\n\n public readonly edgesChange =\n toSignal(this.edgesChangeService.changes$, { initialValue: [] as EdgeChange[] })\n // #endregion\n\n // #region RX_API\n public readonly viewportChanges$ = toObservable(this.viewportService.readableViewport)\n .pipe(skip(1)) // skip default value that set by signal\n\n public readonly nodesChange$ = this.nodesChangeService.changes$\n\n public readonly edgesChange$ = this.edgesChangeService.changes$\n // #endregion\n\n // TODO: probably better to make it injectable\n protected flowModel = new FlowModel()\n\n protected markers = this.flowEntitiesService.markers\n\n // #region METHODS_API\n public viewportTo(viewport: ViewportState): void {\n this.viewportService.writableViewport.set({ changeType: 'absolute', state: viewport })\n }\n\n public zoomTo(zoom: number): void {\n this.viewportService.writableViewport.set({ changeType: 'absolute', state: { zoom } })\n }\n\n public panTo(point: Point): void {\n this.viewportService.writableViewport.set({ changeType: 'absolute', state: point })\n }\n\n public getNode<T = unknown>(id: string): Node<T> | undefined {\n return this.flowEntitiesService.getNode<T>(id)?.node\n }\n // #endregion\n\n protected trackNodes(idx: number, { node }: NodeModel) {\n return node.id\n }\n\n protected trackEdges(idx: number, { edge }: EdgeModel) {\n return edge.id\n }\n}\n\nfunction bindFlowToNodes(flow: FlowModel, nodes: NodeModel[]) {\n nodes.forEach(n => n.bindFlow(flow))\n}\n\n","<svg:svg\n rootSvgRef\n rootSvgContext\n class=\"root-svg\"\n #flow\n [style.backgroundColor]=\"background\"\n [attr.width]=\"flowModel.flowWidth()\"\n [attr.height]=\"flowModel.flowHeight()\"\n>\n <defs [markers]=\"markers()\" flowDefs />\n\n <svg:g\n mapContext\n spacePointContext\n [minZoom]=\"minZoom\"\n [maxZoom]=\"maxZoom\"\n >\n <!-- Connection -->\n <svg:g\n connection\n [model]=\"connection\"\n [template]=\"connectionTemplateDirective?.templateRef\"\n />\n\n <!-- Edges -->\n <svg:g\n *ngFor=\"let model of edgeModels; trackBy: trackEdges\"\n edge\n [model]=\"model\"\n [edgeTemplate]=\"edgeTemplateDirective?.templateRef\"\n [edgeLabelHtmlTemplate]=\"edgeLabelHtmlDirective?.templateRef\"\n />\n\n <!-- Nodes -->\n <svg:g\n *ngFor=\"let model of nodeModels; trackBy: trackNodes\"\n node\n [nodeModel]=\"model\"\n [nodeHtmlTemplate]=\"nodeHtmlDirective?.templateRef\"\n [handleTemplate]=\"handleTemplateDirective?.templateRef\"\n [attr.transform]=\"model.pointTransform()\"\n />\n </svg:g>\n\n</svg:svg>\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { VflowComponent } from './components/vflow/vflow.component';\nimport { NodeComponent } from './components/node/node.component';\nimport { MapContextDirective } from './directives/map-context.directive';\nimport { EdgeComponent } from './components/edge/edge.component';\nimport { EdgeLabelComponent } from './components/edge-label/edge-label.component';\nimport { ConnectionTemplateDirective, EdgeLabelHtmlTemplateDirective, EdgeTemplateDirective, HandleTemplateDirective, NodeHtmlTemplateDirective } from './directives/template.directive';\nimport { ConnectionComponent } from './components/connection/connection.component';\nimport { SpacePointContextDirective } from './directives/space-point-context.directive';\nimport { RootSvgReferenceDirective } from './directives/reference.directive';\nimport { RootSvgContextDirective } from './directives/root-svg-context.directive';\nimport { DefsComponent } from './components/defs/defs.component';\n\nconst components = [\n VflowComponent,\n NodeComponent,\n EdgeComponent,\n EdgeLabelComponent,\n ConnectionComponent,\n DefsComponent\n]\n\nconst directives = [\n SpacePointContextDirective,\n MapContextDirective,\n RootSvgReferenceDirective,\n RootSvgContextDirective,\n]\n\nconst templateDirectives = [\n NodeHtmlTemplateDirective,\n EdgeLabelHtmlTemplateDirective,\n EdgeTemplateDirective,\n ConnectionTemplateDirective,\n HandleTemplateDirective\n]\n\n@NgModule({\n imports: [CommonModule],\n exports: [\n VflowComponent,\n ...templateDirectives\n ],\n declarations: [...components, ...directives, ...templateDirectives],\n})\nexport class VflowModule { }\n","// Modules\nexport * from './lib/vflow/vflow.module';\n\n// Interfaces\nexport * from './lib/vflow/interfaces/node.interface';\nexport * from './lib/vflow/interfaces/point.interface';\nexport * from './lib/vflow/interfaces/edge.interface';\nexport * from './lib/vflow/interfaces/edge-label.interface';\nexport * from './lib/vflow/interfaces/connection.interface';\nexport * from './lib/vflow/interfaces/connection.interface';\nexport * from './lib/vflow/interfaces/connection-settings.interface';\nexport * from './lib/vflow/interfaces/handle-positions.interface';\nexport * from './lib/vflow/interfaces/marker.interface';\nexport { ViewportState } from './lib/vflow/interfaces/viewport.interface';\n\n// Types\nexport * from './lib/vflow/types/node-change.type';\nexport * from './lib/vflow/types/edge-change.type';\nexport * from './lib/vflow/types/position.type';\n\n// Components\nexport * from './lib/vflow/components/vflow/vflow.component';\n\n// Directives\nexport * from './lib/vflow/directives/template.directive';\nexport * from './lib/vflow/directives/connection-controller.directive';\nexport * from './lib/vflow/directives/changes-controller.directive';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["path","d3Path","i2.EdgeLabelComponent","i1.ConnectionControllerDirective","i2.ChangesControllerDirective","i3","i4.NodeComponent","i5.EdgeComponent","i6.ConnectionComponent","i7.DefsComponent","i8.SpacePointContextDirective","i9.MapContextDirective","i10.RootSvgReferenceDirective","i11.RootSvgContextDirective"],"mappings":"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"}
1
+ {"version":3,"file":"ngx-vflow.mjs","sources":["../../../projects/ngx-vflow-lib/src/lib/vflow/services/viewport.service.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/utils/is-defined.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/directives/reference.directive.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/directives/map-context.directive.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/utils/round.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/services/draggable.service.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/directives/template.directive.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/utils/add-nodes-to-edges.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/models/flow.model.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/services/flow-status.service.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/models/connection.model.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/utils/hash.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/services/flow-entities.service.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/directives/connection-controller.directive.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/models/node.model.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/models/edge-label.model.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/math/point-on-line-by-ratio.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/math/edge-path/straigh-path.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/math/edge-path/bezier-path.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/models/edge.model.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/utils/reference-keeper.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/services/node-changes.service.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/services/edge-changes.service.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/directives/changes-controller.directive.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/components/node/node.component.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/components/node/node.component.html","../../../projects/ngx-vflow-lib/src/lib/vflow/components/edge-label/edge-label.component.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/components/edge-label/edge-label.component.html","../../../projects/ngx-vflow-lib/src/lib/vflow/components/edge/edge.component.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/components/edge/edge.component.html","../../../projects/ngx-vflow-lib/src/lib/vflow/directives/space-point-context.directive.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/components/connection/connection.component.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/components/defs/defs.component.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/components/defs/defs.component.html","../../../projects/ngx-vflow-lib/src/lib/vflow/directives/root-svg-context.directive.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/components/vflow/vflow.component.ts","../../../projects/ngx-vflow-lib/src/lib/vflow/components/vflow/vflow.component.html","../../../projects/ngx-vflow-lib/src/lib/vflow/vflow.module.ts","../../../projects/ngx-vflow-lib/src/public-api.ts","../../../projects/ngx-vflow-lib/src/ngx-vflow.ts"],"sourcesContent":["import { Injectable, Signal, WritableSignal, signal } from '@angular/core';\nimport { Point } from '../interfaces/point.interface';\nimport { ViewportState, WritableViewport } from '../interfaces/viewport.interface';\n\n@Injectable()\nexport class ViewportService {\n /**\n * The default value used by d3, just copy it here\n *\n * @returns default viewport value\n */\n private static getDefaultViewport(): ViewportState { return { zoom: 1, x: 0, y: 0 } }\n\n /**\n * Internal signal that accepts value from user by lib api\n * When this signal changes, lib sets new view state and update readableViewport signal\n */\n public readonly writableViewport: WritableSignal<WritableViewport> = signal({\n changeType: 'initial',\n state: ViewportService.getDefaultViewport()\n })\n\n /**\n * Public signal with viewport state. User can directly read from this signal. It's updated by:\n * - user events on flow\n * - writableViewport signal\n */\n public readonly readableViewport: WritableSignal<ViewportState> = signal(ViewportService.getDefaultViewport())\n\n // TODO: add writableViewportWithConstraints (to apply min zoom/max zoom values)\n}\n","export function isDefined<T>(data: T | undefined): data is T {\n return data !== undefined\n}\n","import { Directive, ElementRef, inject } from '@angular/core';\n\n@Directive({\n selector: 'svg[rootSvgRef]'\n})\nexport class RootSvgReferenceDirective {\n public readonly element = inject<ElementRef<SVGSVGElement>>(ElementRef).nativeElement\n}\n","import { Directive, ElementRef, Injector, Input, OnInit, effect, inject, runInInjectionContext } from '@angular/core';\nimport { select } from 'd3-selection';\nimport { D3ZoomEvent, ZoomBehavior, zoom, zoomIdentity, zoomTransform } from 'd3-zoom';\nimport { ViewportService } from '../services/viewport.service';\nimport { isDefined } from '../utils/is-defined';\nimport { RootSvgReferenceDirective } from './reference.directive';\n\ntype ZoomEvent = D3ZoomEvent<SVGSVGElement, unknown>\n\n@Directive({ selector: 'g[mapContext]' })\nexport class MapContextDirective implements OnInit {\n @Input()\n public minZoom!: number\n\n @Input()\n public maxZoom!: number\n\n protected rootSvg = inject(RootSvgReferenceDirective).element\n protected host = inject<ElementRef<SVGGElement>>(ElementRef).nativeElement\n protected viewportService = inject(ViewportService)\n\n protected rootSvgSelection = select(this.rootSvg)\n protected zoomableSelection = select(this.host)\n\n // under the hood this effect triggers handleZoom, so error throws without this flag\n // TODO: hack with timer fixes wrong node scaling (handle positions not matched with content size)\n protected manualViewportChangeEffect = effect(() => setTimeout(() => {\n const viewport = this.viewportService.writableViewport()\n const state = viewport.state\n\n if (viewport.changeType === 'initial') {\n return\n }\n\n // If only zoom provided\n if (isDefined(state.zoom) && (!isDefined(state.x) && !isDefined(state.y))) {\n this.rootSvgSelection.call(this.zoomBehavior.scaleTo, state.zoom)\n\n return\n }\n\n // If only pan provided\n if ((isDefined(state.x) && isDefined(state.y)) && !isDefined(state.zoom)) {\n this.rootSvgSelection.call(this.zoomBehavior.translateTo, state.x, state.y)\n\n return\n }\n\n // If whole viewort state provided\n if (isDefined(state.x) && isDefined(state.y) && isDefined(state.zoom)) {\n this.rootSvgSelection.call(this.zoomBehavior.transform,\n zoomIdentity.translate(state.x, state.y).scale(state.zoom)\n )\n\n return\n }\n }), { allowSignalWrites: true })\n\n protected zoomBehavior!: ZoomBehavior<SVGSVGElement, unknown>;\n\n public ngOnInit(): void {\n this.zoomBehavior = zoom<SVGSVGElement, unknown>()\n .scaleExtent([this.minZoom, this.maxZoom])\n .on('zoom', this.handleZoom)\n\n this.rootSvgSelection.call(this.zoomBehavior)\n }\n\n private handleZoom = ({ transform }: ZoomEvent) => {\n // update public signal for user to read\n this.viewportService.readableViewport.set({ zoom: transform.k, x: transform.x, y: transform.y })\n\n this.zoomableSelection.attr('transform', transform.toString())\n }\n}\n","export const round = (num: number) => Math.round(num * 100) / 100\n","import { Injectable } from '@angular/core';\nimport { select } from 'd3-selection';\nimport { D3DragEvent, drag } from 'd3-drag';\nimport { NodeModel } from '../models/node.model';\nimport { round } from '../utils/round';\n\ntype DragEvent = D3DragEvent<Element, unknown, unknown>\n\n@Injectable()\nexport class DraggableService {\n /**\n * Enable or disable draggable behavior for element.\n * model contains draggable flag which declares if draggable should be enabled or not\n *\n * @param element target element for toggling draggable\n * @param model model with data for this element\n */\n public toggleDraggable(element: Element, model: NodeModel) {\n const d3Element = select(element)\n\n const behavior = model.draggable\n ? this.getDragBehavior(model)\n : this.getIgnoreDragBehavior()\n\n d3Element.call(behavior)\n }\n\n /**\n * TODO: not shure if this work, need to check\n *\n * @param element\n */\n public destroy(element: Element) {\n select(element).on('.drag', null)\n }\n\n /**\n * Node drag behavior. Updated node's coordinate according to dragging\n *\n * @param model\n * @returns\n */\n private getDragBehavior(model: NodeModel) {\n let deltaX: number\n let deltaY: number\n\n return drag()\n .on('start', (event: DragEvent) => {\n deltaX = model.point().x - event.x\n deltaY = model.point().y - event.y\n })\n\n .on('drag', (event: DragEvent) => {\n model.point.set(\n {\n x: round(event.x + deltaX),\n y: round(event.y + deltaY)\n }\n )\n })\n }\n\n /**\n * Specify ignoring drag behavior. It's responsible for not moving the map when user tries to drag node\n * with disabled drag behavior\n */\n private getIgnoreDragBehavior() {\n return drag()\n .on('drag', (event: DragEvent) => {\n (event.sourceEvent as Event).stopPropagation()\n })\n }\n}\n","import { Directive, TemplateRef, inject } from '@angular/core';\nimport { EdgeContext } from '../interfaces/template-context.interface';\n\n@Directive({ selector: 'ng-template[edge]' })\nexport class EdgeTemplateDirective {\n public templateRef = inject<TemplateRef<EdgeContext>>(TemplateRef)\n}\n\n@Directive({ selector: 'ng-template[connection]' })\nexport class ConnectionTemplateDirective {\n public templateRef = inject(TemplateRef)\n}\n\n@Directive({ selector: 'ng-template[edgeLabelHtml]' })\nexport class EdgeLabelHtmlTemplateDirective {\n public templateRef = inject(TemplateRef)\n}\n\n@Directive({ selector: 'ng-template[nodeHtml]' })\nexport class NodeHtmlTemplateDirective {\n public templateRef = inject(TemplateRef)\n}\n\n@Directive({ selector: 'ng-template[handle]' })\nexport class HandleTemplateDirective {\n public templateRef = inject(TemplateRef)\n}\n","import { EdgeModel } from \"../models/edge.model\"\nimport { NodeModel } from \"../models/node.model\"\n\nexport function addNodesToEdges(nodes: NodeModel[], edges: EdgeModel[]) {\n const nodesById = nodes.reduce((acc, n) => {\n acc[n.node.id] = n\n\n return acc\n }, {} as { [nodeId: string]: NodeModel })\n\n edges.forEach(e => {\n e.source = nodesById[e.edge.source]\n e.target = nodesById[e.edge.target]\n })\n}\n","import { Signal, WritableSignal, computed, signal } from \"@angular/core\";\nimport { HandlePositions } from \"../interfaces/handle-positions.interface\";\n\nexport class FlowModel {\n /**\n * Global setting with handle positions. Nodes derive this value\n */\n public handlePositions: WritableSignal<HandlePositions> = signal({ source: 'right', target: 'left' })\n\n /**\n * @see {VflowComponent.view}\n */\n public view: WritableSignal<[number, number] | 'auto'> = signal([400, 400])\n\n public flowWidth = computed(() => this.view() === 'auto' ? '100%' : this.view()[0])\n\n public flowHeight = computed(() => this.view() === 'auto' ? '100%' : this.view()[1])\n}\n","import { Injectable, signal } from '@angular/core';\nimport { NodeModel } from '../models/node.model';\n\nexport interface FlowStatusIdle {\n state: 'idle',\n payload: null\n}\n\nexport interface FlowStatusConnectionStart {\n state: 'connection-start',\n payload: {\n sourceNode: NodeModel\n }\n}\n\nexport interface FlowStatusConnectionValidation {\n state: 'connection-validation',\n payload: {\n sourceNode: NodeModel\n targetNode: NodeModel\n valid: boolean\n }\n}\n\nexport interface FlowStatusConnectionEnd {\n state: 'connection-end',\n payload: {\n sourceNode: NodeModel\n targetNode: NodeModel\n }\n}\n\nexport type FlowStatus =\n FlowStatusIdle |\n FlowStatusConnectionStart |\n FlowStatusConnectionValidation |\n FlowStatusConnectionEnd\n\n@Injectable()\nexport class FlowStatusService {\n public readonly status = signal<FlowStatus>({ state: 'idle', payload: null })\n\n public setIdleStatus() {\n this.status.set({ state: 'idle', payload: null })\n }\n\n public setConnectionStartStatus(sourceNode: NodeModel) {\n this.status.set({ state: 'connection-start', payload: { sourceNode } })\n }\n\n public setConnectionValidationStatus(sourceNode: NodeModel, targetNode: NodeModel, valid: boolean) {\n this.status.set({ state: 'connection-validation', payload: { sourceNode, targetNode, valid } })\n }\n\n public setConnectionEndStatus(sourceNode: NodeModel, targetNode: NodeModel) {\n this.status.set({ state: 'connection-end', payload: { sourceNode, targetNode } })\n }\n}\n\n/**\n * Batch status changes together to call them one after another\n *\n * @param changes list of set[FlowStatus.state]Status() calls\n */\nexport function batchStatusChanges(...changes: Function[]) {\n if (changes.length) {\n const [firstChange, ...restChanges] = changes\n // first change is sync\n firstChange()\n // without timer, subscribed effects/comuted signals only get latest value\n restChanges.forEach(change => setTimeout(() => change()))\n }\n}\n","import { ConnectionSettings, ConnectionValidatorFn } from \"../interfaces/connection-settings.interface\";\nimport { Curve, EdgeType } from \"../interfaces/edge.interface\";\n\nexport class ConnectionModel {\n public curve: Curve\n public type: EdgeType\n public validator: ConnectionValidatorFn\n\n constructor(public connection: ConnectionSettings) {\n this.curve = connection.curve ?? 'bezier'\n this.type = connection.type ?? 'default'\n this.validator = connection.validator ?? (() => true)\n }\n}\n","export function hashCode(str: string): number {\n return str.split('').reduce((a, b) => {\n a = ((a << 5) - a) + b.charCodeAt(0)\n\n return a & a\n }, 0)\n}\n","import { Injectable, computed, effect, signal, untracked } from '@angular/core';\nimport { NodeModel } from '../models/node.model';\nimport { EdgeModel } from '../models/edge.model';\nimport { ConnectionModel } from '../models/connection.model';\nimport { Marker } from '../interfaces/marker.interface';\nimport { hashCode } from '../utils/hash';\n\n@Injectable()\nexport class FlowEntitiesService {\n public readonly nodes = signal<NodeModel[]>([], {\n // empty arrays considered equal, other arrays may not be equal\n equal: (a, b) => !a.length && !b.length ? true : a === b\n })\n\n public readonly edges = signal<EdgeModel[]>([], {\n // empty arrays considered equal, other arrays may not be equal\n equal: (a, b) => !a.length && !b.length ? true : a === b\n })\n\n public readonly connection = signal<ConnectionModel>(new ConnectionModel({}))\n\n public readonly markers = computed(() => {\n const markersMap = new Map<number, Marker>()\n\n this.validEdges().forEach(e => {\n if (e.edge.markers?.start) {\n const hash = hashCode(JSON.stringify(e.edge.markers.start))\n markersMap.set(hash, e.edge.markers.start)\n }\n\n if (e.edge.markers?.end) {\n const hash = hashCode(JSON.stringify(e.edge.markers.end))\n markersMap.set(hash, e.edge.markers.end)\n }\n })\n\n const connectionMarker = this.connection().connection.marker\n if (connectionMarker) {\n const hash = hashCode(JSON.stringify(connectionMarker))\n markersMap.set(hash, connectionMarker)\n }\n\n return markersMap\n })\n\n public readonly validEdges = computed(() => {\n const nodes = this.nodes()\n\n return this.edges().filter(e => nodes.includes(e.source) && nodes.includes(e.target))\n })\n\n public getNode<T>(id: string) {\n return this.nodes().find(({ node }) => node.id === id) as NodeModel<T> | undefined\n }\n}\n","import { Directive, EventEmitter, Output, effect, inject } from '@angular/core';\nimport { Connection } from '../interfaces/connection.interface';\nimport { FlowStatusService } from '../services/flow-status.service';\n\nimport { FlowEntitiesService } from '../services/flow-entities.service';\n\n@Directive({\n selector: '[connectionController]',\n standalone: true\n})\nexport class ConnectionControllerDirective {\n @Output()\n public onConnect = new EventEmitter<Connection>()\n\n private statusService = inject(FlowStatusService)\n private flowEntitiesService = inject(FlowEntitiesService)\n\n protected connectEffect = effect(() => {\n const status = this.statusService.status()\n\n if (status.state === 'connection-end') {\n const sourceModel = status.payload.sourceNode\n const targetModel = status.payload.targetNode\n\n const source = sourceModel.node.id\n const target = targetModel.node.id\n\n const connection = this.flowEntitiesService.connection()\n\n if (connection.validator({ source, target })) {\n this.onConnect.emit({ source, target })\n }\n }\n }, { allowSignalWrites: true })\n}\n","import { Injector, computed, inject, signal } from '@angular/core'\nimport { Node } from '../interfaces/node.interface'\nimport { FlowModel } from './flow.model'\nimport { isDefined } from '../utils/is-defined'\nimport { toObservable } from '@angular/core/rxjs-interop'\n\nexport class NodeModel<T = unknown> {\n public point = signal({ x: 0, y: 0 })\n\n public point$ = toObservable(this.point)\n\n public size = signal({ width: 0, height: 0 })\n\n public pointTransform = computed(() => `translate(${this.point().x}, ${this.point().y})`)\n\n public sourceOffset = computed(() => {\n const { width, height } = this.size()\n\n switch (this.sourcePosition()) {\n case 'left': return { x: 0, y: height / 2 }\n case 'right': return { x: width, y: height / 2 }\n case 'top': return { x: width / 2, y: 0 }\n case 'bottom': return { x: width / 2, y: height }\n }\n })\n\n public targetOffset = computed(() => {\n const { width, height } = this.size()\n\n switch (this.targetPosition()) {\n case 'left': return { x: 0, y: (height / 2) }\n case 'right': return { x: width, y: height / 2 }\n case 'top': return { x: width / 2, y: 0 }\n case 'bottom': return { x: width / 2, y: height }\n }\n })\n\n public sourcePointAbsolute = computed(() => {\n return {\n x: this.point().x + this.sourceOffset().x + this.sourceHandleOffset().x,\n y: this.point().y + this.sourceOffset().y + this.sourceHandleOffset().y\n }\n })\n\n public targetPointAbsolute = computed(() => {\n return {\n x: this.point().x + this.targetOffset().x + this.targetHandleOffset().x,\n y: this.point().y + this.targetOffset().y + this.targetHandleOffset().y\n }\n })\n\n // Now source and handle positions derived from parent flow\n public sourcePosition = computed(() => this.flow.handlePositions().source)\n public targetPosition = computed(() => this.flow.handlePositions().target)\n\n public sourceHandleSize = signal({ width: 0, height: 0 })\n public targetHandleSize = signal({ width: 0, height: 0 })\n\n public sourceHandleOffset = computed(() => {\n switch (this.sourcePosition()) {\n case 'left': return { x: -(this.sourceHandleSize().width / 2), y: 0 }\n case 'right': return { x: this.sourceHandleSize().width / 2, y: 0 }\n case 'top': return { x: 0, y: -(this.sourceHandleSize().height / 2) }\n case 'bottom': return { x: 0, y: this.sourceHandleSize().height / 2 }\n }\n })\n\n public targetHandleOffset = computed(() => {\n switch (this.targetPosition()) {\n case 'left': return { x: -(this.targetHandleSize().width / 2), y: 0 }\n case 'right': return { x: this.targetHandleSize().width / 2, y: 0 }\n case 'top': return { x: 0, y: -(this.targetHandleSize().height / 2) }\n case 'bottom': return { x: 0, y: this.targetHandleSize().height / 2 }\n }\n })\n\n public sourceOffsetAligned = computed(() => {\n return {\n x: this.sourceOffset().x - (this.sourceHandleSize().width / 2),\n y: this.sourceOffset().y - (this.sourceHandleSize().height / 2),\n }\n })\n\n public targetOffsetAligned = computed(() => {\n return {\n x: this.targetOffset().x - (this.targetHandleSize().width / 2),\n y: this.targetOffset().y - (this.targetHandleSize().height / 2),\n }\n })\n\n public draggable = true\n\n // disabled for configuration for now\n public readonly magnetRadius = 20\n\n private flow!: FlowModel\n\n constructor(\n public node: Node<T>\n ) {\n this.point.set(node.point)\n\n if (isDefined(node.draggable)) this.draggable = node.draggable\n }\n\n /**\n * Bind parent flow model to node\n *\n * @param flow parent flow\n */\n public bindFlow(flow: FlowModel) {\n this.flow = flow\n }\n}\n","import { signal } from \"@angular/core\"\nimport { EdgeLabel } from \"../interfaces/edge-label.interface\"\n\nexport class EdgeLabelModel {\n public size = signal({ width: 0, height: 0 })\n\n constructor(public edgeLabel: EdgeLabel) { }\n}\n","import { Point } from \"../interfaces/point.interface\";\n\n/**\n * Get point on line\n *\n * https://math.stackexchange.com/questions/563566/how-do-i-find-the-middle1-2-1-3-1-4-etc-of-a-line\n */\nexport function getPointOnLineByRatio(start: Point, end: Point, ratio: number): Point {\n return {\n x: (1 - ratio) * start.x + ratio * end.x,\n y: (1 - ratio) * start.y + ratio * end.y,\n };\n}\n","import { PathData } from \"../../interfaces/path-data.interface\";\nimport { Point } from \"../../interfaces/point.interface\";\nimport { path as d3Path } from 'd3-path'\nimport { UsingPoints } from \"../../types/using-points.type\";\nimport { getPointOnLineByRatio } from \"../point-on-line-by-ratio\";\n\nexport function straightPath(\n source: Point,\n target: Point,\n usingPoints: UsingPoints = [false, false, false]\n): PathData {\n const [start, center, end] = usingPoints\n const nullPoint = { x: 0, y: 0 }\n\n const path = d3Path()\n\n path.moveTo(source.x, source.y)\n path.lineTo(target.x, target.y)\n\n return {\n path: path.toString(),\n points: {\n start: start ? getPointOnLineByRatio(source, target, .15) : nullPoint,\n center: center ? getPointOnLineByRatio(source, target, .50) : nullPoint,\n end: end ? getPointOnLineByRatio(source, target, .85) : nullPoint,\n }\n }\n}\n","import { PathData } from '../../interfaces/path-data.interface';\nimport { Point } from '../../interfaces/point.interface';\nimport { Path, path as d3Path } from 'd3-path';\nimport { UsingPoints } from '../../types/using-points.type';\nimport { Position } from '../../types/position.type';\nimport { getPointOnLineByRatio } from '../point-on-line-by-ratio';\n\nexport function bezierPath(\n source: Point,\n target: Point,\n sourcePosition: Position,\n targetPosition: Position,\n usingPoints: UsingPoints = [false, false, false]\n): PathData {\n const path = d3Path();\n\n path.moveTo(source.x, source.y);\n\n const distanceVector = { x: source.x - target.x, y: source.y - target.y };\n\n const firstControl = calcControlPoint(source, sourcePosition, distanceVector);\n const secondControl = calcControlPoint(target, targetPosition, distanceVector);\n\n path.bezierCurveTo(\n firstControl.x,\n firstControl.y,\n secondControl.x,\n secondControl.y,\n target.x,\n target.y\n );\n\n return getPathData(\n path,\n source,\n target,\n firstControl,\n secondControl,\n usingPoints\n );\n}\n\n/**\n * Calculate control point based on provided point\n *\n * @param point relative this point control point is gonna be computed (the source or the target)\n * @param pointPosition position of {point} on block\n * @param distanceVector transmits the distance between the source and the target as x and y coordinates\n */\n\nfunction calcControlPoint(\n point: Point,\n pointPosition: Position,\n distanceVector: Point\n) {\n const factorPoint = { x: 0, y: 0 };\n\n switch (pointPosition) {\n case 'top':\n factorPoint.y = 1;\n break;\n case 'bottom':\n factorPoint.y = -1;\n break;\n case 'right':\n factorPoint.x = 1;\n break;\n case 'left':\n factorPoint.x = -1;\n break;\n }\n\n // TODO: explain name\n const fullDistanceVector = {\n x: distanceVector.x * Math.abs(factorPoint.x),\n y: distanceVector.y * Math.abs(factorPoint.y),\n };\n\n // TODO: probably need to make this configurable\n const curvature = 0.25;\n // thanks colleagues from react/svelte world\n // https://github.com/xyflow/xyflow/blob/f0117939bae934447fa7f232081f937169ee23b5/packages/system/src/utils/edges/bezier-edge.ts#L56\n const controlOffset =\n curvature * 25 * Math.sqrt(Math.abs(fullDistanceVector.x + fullDistanceVector.y));\n\n return {\n x: point.x + factorPoint.x * controlOffset,\n y: point.y - factorPoint.y * controlOffset,\n };\n}\n\nfunction getPathData(\n path: Path,\n source: Point,\n target: Point,\n firstControl: Point,\n secondControl: Point,\n usingPoints: UsingPoints\n): PathData {\n const [start, center, end] = usingPoints;\n\n const nullPoint = { x: 0, y: 0 };\n\n return {\n path: path.toString(),\n points: {\n start: start\n ? getPointOnBezier(source, target, firstControl, secondControl, 0.1)\n : nullPoint,\n center: center\n ? getPointOnBezier(source, target, firstControl, secondControl, 0.5)\n : nullPoint,\n end: end\n ? getPointOnBezier(source, target, firstControl, secondControl, 0.9)\n : nullPoint,\n },\n };\n}\n\n/**\n * Get point on bezier curve by ratio\n */\nfunction getPointOnBezier(\n sourcePoint: Point,\n targetPoint: Point,\n controlPoint1: Point,\n controlPoint2: Point,\n ratio: number\n): Point {\n const fromSourceToFirstControl: Point = getPointOnLineByRatio(\n sourcePoint,\n controlPoint1,\n ratio\n );\n const fromFirstControlToSecond: Point = getPointOnLineByRatio(\n controlPoint1,\n controlPoint2,\n ratio\n );\n const fromSecondControlToTarget: Point = getPointOnLineByRatio(\n controlPoint2,\n targetPoint,\n ratio\n );\n\n return getPointOnLineByRatio(\n getPointOnLineByRatio(fromSourceToFirstControl, fromFirstControlToSecond, ratio),\n getPointOnLineByRatio(fromFirstControlToSecond, fromSecondControlToTarget, ratio),\n ratio\n );\n}\n","import { computed } from \"@angular/core\";\nimport { EdgeLabelPosition } from \"../interfaces/edge-label.interface\";\nimport { Edge, Curve, EdgeType } from \"../interfaces/edge.interface\";\nimport { EdgeLabelModel } from \"./edge-label.model\";\nimport { NodeModel } from \"./node.model\";\nimport { straightPath } from \"../math/edge-path/straigh-path\";\nimport { bezierPath } from \"../math/edge-path/bezier-path\";\nimport { UsingPoints } from \"../types/using-points.type\";\n\nexport class EdgeModel {\n public source!: NodeModel\n public target!: NodeModel\n public curve: Curve\n public type: EdgeType\n\n public path = computed(() => {\n const source = this.source.sourcePointAbsolute()\n const target = this.target.targetPointAbsolute()\n\n switch (this.curve) {\n case 'straight':\n return straightPath(source, target, this.usingPoints)\n case 'bezier':\n return bezierPath(\n source, target,\n this.source.sourcePosition(),\n this.target.targetPosition(),\n this.usingPoints\n )\n }\n })\n\n public edgeLabels: { [position in EdgeLabelPosition]?: EdgeLabelModel } = {}\n\n private usingPoints: UsingPoints\n\n constructor(public edge: Edge) {\n this.type = edge.type ?? 'default'\n this.curve = edge.curve ?? 'bezier'\n\n if (edge.edgeLabels?.start) this.edgeLabels.start = new EdgeLabelModel(edge.edgeLabels.start)\n if (edge.edgeLabels?.center) this.edgeLabels.center = new EdgeLabelModel(edge.edgeLabels.center)\n if (edge.edgeLabels?.end) this.edgeLabels.end = new EdgeLabelModel(edge.edgeLabels.end)\n\n this.usingPoints = [!!this.edgeLabels.start, !!this.edgeLabels.center, !!this.edgeLabels.end]\n }\n}\n","import { NodeModel } from \"../models/node.model\";\nimport { Node } from '../interfaces/node.interface';\nimport { EdgeModel } from \"../models/edge.model\";\nimport { Edge } from \"../interfaces/edge.interface\";\n\nexport class ReferenceKeeper {\n /**\n * Create new models for new node references and keep old models for old node references\n */\n public static nodes(newNodes: Node[], oldNodeModels: NodeModel[]) {\n const oldNodesMap: Map<Node, NodeModel> = new Map()\n oldNodeModels.forEach(model => oldNodesMap.set(model.node, model))\n\n return newNodes.map(newNode => {\n if (oldNodesMap.has(newNode)) return oldNodesMap.get(newNode)!\n else return new NodeModel(newNode)\n })\n }\n\n /**\n * Create new models for new edge references and keep old models for old edge references\n */\n public static edges(newEdges: Edge[], oldEdgeModels: EdgeModel[]) {\n const oldEdgesMap: Map<Edge, EdgeModel> = new Map()\n oldEdgeModels.forEach(model => oldEdgesMap.set(model.edge, model))\n\n return newEdges.map(newEdge => {\n if (oldEdgesMap.has(newEdge)) return oldEdgesMap.get(newEdge)!\n else return new EdgeModel(newEdge)\n })\n }\n}\n","import { Injectable, Signal, inject } from '@angular/core';\nimport { FlowEntitiesService } from './flow-entities.service';\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { Observable, filter, map, merge, of, pairwise, skip, switchMap } from 'rxjs';\nimport { NodeChange } from '../types/node-change.type';\n\n@Injectable()\nexport class NodesChangeService {\n protected entitiesService = inject(FlowEntitiesService)\n\n protected nodesPositionChange$ = toObservable(this.entitiesService.nodes)\n .pipe(\n // Check for nodes list change and watch for specific node from this list change its position\n switchMap((nodes) =>\n merge(\n ...nodes.map(node =>\n node.point$.pipe(\n // skip initial position from signal\n skip(1),\n map(() => node)\n )\n )\n )\n ),\n // For now it's a single node, later this list will also be filled\n // with child node position changes\n map(changedNode => [\n { type: 'position', id: changedNode.node.id, point: changedNode.point() }\n ])\n ) satisfies Observable<NodeChange[]>\n\n protected nodeAddChange$ = toObservable(this.entitiesService.nodes)\n .pipe(\n pairwise(),\n map(([oldList, newList]) =>\n newList.filter(node => !oldList.includes(node))\n ),\n filter((nodes) => !!nodes.length),\n map((nodes) =>\n nodes.map(node => ({ type: 'add', id: node.node.id }))\n )\n ) satisfies Observable<NodeChange[]>\n\n protected nodeRemoveChange$ = toObservable(this.entitiesService.nodes)\n .pipe(\n pairwise(),\n map(([oldList, newList]) =>\n oldList.filter(node => !newList.includes(node))\n ),\n filter((nodes) => !!nodes.length),\n map((nodes) =>\n nodes.map(node => ({ type: 'remove', id: node.node.id }))\n )\n ) satisfies Observable<NodeChange[]>\n\n public readonly changes$: Observable<NodeChange[]> = merge(\n this.nodesPositionChange$,\n this.nodeAddChange$,\n this.nodeRemoveChange$\n )\n}\n","import { Injectable, computed, inject, untracked } from '@angular/core';\nimport { FlowEntitiesService } from './flow-entities.service';\nimport { Observable, asyncScheduler, filter, map, merge, observeOn, pairwise, skip } from 'rxjs';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { EdgeChange } from '../types/edge-change.type';\n\n@Injectable()\nexport class EdgeChangesService {\n protected entitiesService = inject(FlowEntitiesService)\n\n protected edgeDetachedChange$ = toObservable(\n computed(() => {\n const nodes = this.entitiesService.nodes()\n const edges = untracked(this.entitiesService.edges)\n\n return edges.filter(({ source, target }) =>\n !nodes.includes(source) || !nodes.includes(target)\n )\n })\n ).pipe(\n // TODO check why there are 2 emits from single call inside computed\n filter(edges => !!edges.length),\n map((edges) =>\n edges.map(({ edge }) => ({ type: 'detached', id: edge.id }))\n )\n ) satisfies Observable<EdgeChange[]>\n\n protected edgeAddChange$ = toObservable(this.entitiesService.edges)\n .pipe(\n pairwise(),\n map(([oldList, newList]) => {\n return newList.filter(edge => !oldList.includes(edge))\n }),\n filter(edges => !!edges.length),\n map((edges) =>\n edges.map(({ edge }) => ({ type: 'add', id: edge.id }))\n )\n ) satisfies Observable<EdgeChange[]>\n\n protected edgeRemoveChange$ = toObservable(this.entitiesService.edges)\n .pipe(\n pairwise(),\n map(([oldList, newList]) => {\n return oldList.filter(edge => !newList.includes(edge))\n }),\n filter(edges => !!edges.length),\n map((edges) =>\n edges.map(({ edge }) => ({ type: 'remove', id: edge.id }))\n )\n ) satisfies Observable<EdgeChange[]>\n\n public readonly changes$: Observable<EdgeChange[]> = merge(\n this.edgeDetachedChange$,\n this.edgeAddChange$,\n this.edgeRemoveChange$\n )\n .pipe(\n // this fixes the case when user gets 'deteched' changes\n // and tries to delete these edges inside stream\n // angular may ignore this change because [edges] input changed\n // right after [nodes] input change\n observeOn(asyncScheduler),\n )\n}\n","import { Directive, EventEmitter, Output, effect, inject } from '@angular/core';\nimport { NodeChange } from '../types/node-change.type';\nimport { EdgeChangesService } from '../services/edge-changes.service';\nimport { NodesChangeService } from '../services/node-changes.service';\nimport { tap } from 'rxjs';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { EdgeChange } from '../types/edge-change.type';\n\n@Directive({\n selector: '[changesController]',\n standalone: true\n})\nexport class ChangesControllerDirective {\n protected nodesChangeService = inject(NodesChangeService)\n protected edgesChangeService = inject(EdgeChangesService)\n\n @Output()\n public onNodesChange = new EventEmitter<NodeChange[]>()\n\n @Output()\n public onEdgesChange = new EventEmitter<EdgeChange[]>()\n\n protected nodesChangeProxySubscription = this.nodesChangeService.changes$\n .pipe(\n tap((changes) => this.onNodesChange.emit(changes)),\n takeUntilDestroyed()\n )\n .subscribe()\n\n protected edgesChangeProxySubscription = this.edgesChangeService.changes$\n .pipe(\n tap((changes) => this.onEdgesChange.emit(changes)),\n takeUntilDestroyed()\n )\n .subscribe()\n}\n","import { AfterViewInit, ChangeDetectionStrategy, Component, ElementRef, HostBinding, Input, NgZone, OnDestroy, OnInit, TemplateRef, ViewChild, computed, inject, signal } from '@angular/core';\nimport { DraggableService } from '../../services/draggable.service';\nimport { NodeModel } from '../../models/node.model';\nimport { FlowStatusService, batchStatusChanges } from '../../services/flow-status.service';\nimport { FlowEntitiesService } from '../../services/flow-entities.service';\n\nexport type HandleState = 'valid' | 'invalid' | 'idle'\n\n@Component({\n selector: 'g[node]',\n templateUrl: './node.component.html',\n styleUrls: ['./node.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class NodeComponent implements OnInit, AfterViewInit, OnDestroy {\n @Input()\n public nodeModel!: NodeModel\n\n @Input()\n public nodeHtmlTemplate?: TemplateRef<any>\n\n @Input()\n public handleTemplate?: TemplateRef<any>\n\n @ViewChild('nodeContent')\n public nodeContentRef!: ElementRef<SVGGraphicsElement>\n\n @ViewChild('htmlWrapper')\n public htmlWrapperRef!: ElementRef<HTMLDivElement>\n\n @ViewChild('sourceHandle')\n public sourceHandleRef!: ElementRef<SVGGElement | SVGCircleElement>\n\n @ViewChild('targetHandle')\n public targetHandleRef!: ElementRef<SVGGElement | SVGCircleElement>\n\n private draggableService = inject(DraggableService)\n private flowStatusService = inject(FlowStatusService)\n private flowEntitiesService = inject(FlowEntitiesService)\n private hostRef = inject<ElementRef<SVGElement>>(ElementRef)\n\n protected showMagnet = computed(() =>\n this.flowStatusService.status().state === 'connection-start' ||\n this.flowStatusService.status().state === 'connection-validation'\n )\n\n protected readonly defaultHandleStrokeWidth = 2;\n\n private sourceHanldeState = signal<HandleState>('idle')\n private targetHandleState = signal<HandleState>('idle')\n\n private sourceHanldeStateReadonly = this.sourceHanldeState.asReadonly()\n private targetHanldeStateReadonly = this.targetHandleState.asReadonly()\n\n public ngOnInit() {\n this.draggableService.toggleDraggable(this.hostRef.nativeElement, this.nodeModel)\n }\n\n public ngAfterViewInit(): void {\n // TODO remove microtask\n queueMicrotask(() => {\n if (this.nodeModel.node.type === 'default') {\n const { width, height } = this.nodeContentRef.nativeElement.getBBox()\n this.nodeModel.size.set({ width, height })\n }\n\n if (this.nodeModel.node.type === 'html-template') {\n const width = this.htmlWrapperRef.nativeElement.clientWidth\n const height = this.htmlWrapperRef.nativeElement.clientHeight\n\n this.nodeModel.size.set({ width, height })\n }\n\n this.setSourceHandleSize()\n this.setTargetHandleSize()\n })\n }\n\n public ngOnDestroy(): void {\n this.draggableService.destroy(this.hostRef.nativeElement)\n }\n\n protected startConnection(event: MouseEvent) {\n // ignore drag by stopping propagation\n event.stopPropagation()\n\n this.flowStatusService.setConnectionStartStatus(this.nodeModel)\n }\n\n protected endConnection() {\n const status = this.flowStatusService.status()\n\n if (status.state === 'connection-validation') {\n const sourceNode = status.payload.sourceNode\n const targetNode = this.nodeModel\n\n batchStatusChanges(\n // call to create connection\n () => this.flowStatusService.setConnectionEndStatus(sourceNode, targetNode),\n // when connection created, we need go back to idle status\n () => this.flowStatusService.setIdleStatus()\n )\n }\n }\n\n /**\n * TODO srp\n */\n protected validateTargetHandle() {\n const status = this.flowStatusService.status()\n\n if (status.state === 'connection-start') {\n const sourceNode = status.payload.sourceNode\n const targetNode = this.nodeModel\n\n const source = sourceNode.node.id\n const target = targetNode.node.id\n\n const valid = this.flowEntitiesService.connection().validator({ source, target })\n this.targetHandleState.set(valid ? 'valid' : 'invalid')\n\n this.flowStatusService.setConnectionValidationStatus(sourceNode, targetNode, valid)\n }\n }\n\n /**\n * TODO srp\n */\n protected resetValidateTargetHandle() {\n this.targetHandleState.set('idle')\n\n // drop back to start status\n const status = this.flowStatusService.status()\n if (status.state === 'connection-validation') {\n this.flowStatusService.setConnectionStartStatus(status.payload.sourceNode)\n }\n }\n\n protected getHandleContext(type: 'source' | 'target') {\n if (type === 'source') {\n return {\n $implicit: {\n point: this.nodeModel.sourceOffset,\n alignedPoint: this.nodeModel.sourceOffsetAligned,\n state: this.sourceHanldeStateReadonly\n }\n }\n }\n\n return {\n $implicit: {\n point: this.nodeModel.targetOffset,\n alignedPoint: this.nodeModel.targetOffsetAligned,\n state: this.targetHanldeStateReadonly\n }\n }\n }\n\n private setSourceHandleSize() {\n // if handle template provided, we don't know its stroke so it's 0\n const strokeWidth = this.handleTemplate ? 0 : (2 * this.defaultHandleStrokeWidth);\n\n const sourceBox = this.sourceHandleRef.nativeElement.getBBox({ stroke: true })\n this.nodeModel.sourceHandleSize.set({\n width: sourceBox.width + strokeWidth,\n height: sourceBox.height + strokeWidth\n })\n }\n\n private setTargetHandleSize() {\n const strokeWidth = this.handleTemplate ? 0 : (2 * this.defaultHandleStrokeWidth);\n\n const targetBox = this.targetHandleRef.nativeElement.getBBox({ stroke: true })\n this.nodeModel.targetHandleSize.set({\n width: targetBox.width + strokeWidth,\n height: targetBox.height + strokeWidth\n })\n }\n}\n","<svg:foreignObject\n *ngIf=\"nodeModel.node.type === 'default'\"\n #nodeContent\n width=\"100\"\n height=\"50\"\n>\n <div class=\"default-node\" [innerHTML]=\"nodeModel.node.text ?? ''\"></div>\n</svg:foreignObject>\n\n<svg:foreignObject\n *ngIf=\"nodeModel.node.type === 'html-template' && nodeHtmlTemplate\"\n [attr.width]=\"nodeModel.size().width\"\n [attr.height]=\"nodeModel.size().height\"\n>\n <div #htmlWrapper class=\"wrapper\">\n <ng-container\n *ngTemplateOutlet=\"nodeHtmlTemplate; context: { $implicit: { node: nodeModel.node } }\"\n />\n </div>\n</svg:foreignObject>\n\n<ng-container *ngIf=\"handleTemplate\">\n <svg:g #sourceHandle (mousedown)=\"startConnection($event)\">\n <ng-container *ngTemplateOutlet=\"handleTemplate; context: getHandleContext('source')\" />\n </svg:g>\n\n <svg:g #targetHandle>\n <ng-container *ngTemplateOutlet=\"handleTemplate; context: getHandleContext('target')\" />\n </svg:g>\n</ng-container>\n\n<ng-container *ngIf=\"!handleTemplate\">\n <svg:circle\n #sourceHandle\n [attr.cx]=\"nodeModel.sourceOffset().x\"\n [attr.cy]=\"nodeModel.sourceOffset().y\"\n [attr.stroke-width]=\"defaultHandleStrokeWidth\"\n r=\"5\"\n stroke=\"white\"\n fill=\"black\"\n (mousedown)=\"startConnection($event)\"\n />\n\n <svg:circle\n #targetHandle\n [attr.cx]=\"nodeModel.targetOffset().x\"\n [attr.cy]=\"nodeModel.targetOffset().y\"\n [attr.stroke-width]=\"defaultHandleStrokeWidth\"\n r=\"5\"\n stroke=\"white\"\n fill=\"black\"\n (mouseup)=\"endConnection()\"\n />\n</ng-container>\n\n<svg:circle\n *ngIf=\"showMagnet()\"\n class=\"magnet\"\n [attr.r]=\"nodeModel.magnetRadius\"\n [attr.cx]=\"nodeModel.targetOffset().x\"\n [attr.cy]=\"nodeModel.targetOffset().y\"\n (mouseup)=\"endConnection(); resetValidateTargetHandle()\"\n (mouseover)=\"validateTargetHandle()\"\n (mouseout)=\"resetValidateTargetHandle()\"\n/>\n\n\n","import { AfterViewInit, ChangeDetectionStrategy, Component, ElementRef, Input, OnChanges, OnInit, SimpleChanges, TemplateRef, ViewChild, computed, signal } from '@angular/core';\nimport { EdgeLabelModel } from '../../models/edge-label.model';\nimport { EdgeModel } from '../../models/edge.model';\nimport { Point } from '../../interfaces/point.interface';\n\n@Component({\n selector: 'g[edgeLabel]',\n templateUrl: './edge-label.component.html',\n styles: [`\n .edge-label-wrapper {\n width: max-content;\n\n /*\n this is a fix for bug in chrome, for some reason if the div fully matches the size\n of foreignObject there are occurs some visual artifacts around this div\n */\n margin-top: 1px;\n margin-left: 1px;\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class EdgeLabelComponent implements AfterViewInit {\n // TODO: too many inputs\n @Input()\n public model!: EdgeLabelModel\n\n @Input()\n public edgeModel!: EdgeModel\n\n @Input()\n public set point(point: Point) { this.pointSignal.set(point) }\n\n @Input()\n public htmlTemplate?: TemplateRef<any>\n\n @ViewChild('edgeLabelWrapper')\n public edgeLabelWrapperRef!: ElementRef<HTMLDivElement>\n\n /**\n * Centered point of label\n *\n * TODO: maybe put it into EdgeLabelModel\n */\n protected edgeLabelPoint = computed(() => {\n const point = this.pointSignal()\n\n const { width, height } = this.model.size()\n\n return {\n x: point.x - (width / 2),\n y: point.y - (height / 2)\n }\n })\n\n private pointSignal = signal({ x: 0, y: 0 })\n\n public ngAfterViewInit(): void {\n queueMicrotask(() => {\n // this is a fix for visual artifact in chrome that for some reason adresses only for edge label.\n // the bug reproduces if edgeLabelWrapperRef size fully matched the size of parent foreignObject\n const MAGIC_VALUE_TO_FIX_GLITCH_IN_CHROME = 2\n\n const width = this.edgeLabelWrapperRef.nativeElement.clientWidth + MAGIC_VALUE_TO_FIX_GLITCH_IN_CHROME\n const height = this.edgeLabelWrapperRef.nativeElement.clientHeight + MAGIC_VALUE_TO_FIX_GLITCH_IN_CHROME\n\n this.model.size.set({ width, height })\n })\n }\n\n protected getLabelContext() {\n return {\n $implicit: {\n edge: this.edgeModel.edge,\n label: this.model.edgeLabel\n }\n }\n }\n}\n","<svg:foreignObject\n [attr.x]=\"edgeLabelPoint().x\"\n [attr.y]=\"edgeLabelPoint().y\"\n [attr.width]=\"model.size().width\"\n [attr.height]=\"model.size().height\"\n *ngIf=\"model.edgeLabel.type === 'html-template' && htmlTemplate\"\n>\n <div #edgeLabelWrapper class=\"edge-label-wrapper\">\n <ng-container\n *ngTemplateOutlet=\"htmlTemplate; context: getLabelContext()\"\n />\n </div>\n</svg:foreignObject>\n","import { ChangeDetectionStrategy, Component, Input, OnInit, Signal, TemplateRef, computed } from '@angular/core';\nimport { EdgeModel } from '../../models/edge.model';\nimport { hashCode } from '../../utils/hash';\nimport { EdgeContext } from '../../interfaces/template-context.interface';\n\n@Component({\n selector: 'g[edge]',\n templateUrl: './edge.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class EdgeComponent implements OnInit {\n @Input()\n public model!: EdgeModel\n\n @Input()\n public edgeTemplate?: TemplateRef<EdgeContext>\n\n @Input()\n public edgeLabelHtmlTemplate?: TemplateRef<any>\n\n protected markerStartUrl = computed(() => {\n const marker = this.model.edge.markers?.start\n\n return marker ? `url(#${hashCode(JSON.stringify(marker))})` : ''\n })\n\n protected markerEndUrl = computed(() => {\n const marker = this.model.edge.markers?.end\n\n return marker ? `url(#${hashCode(JSON.stringify(marker))})` : ''\n })\n\n protected readonly defaultColor = 'rgb(177, 177, 183)'\n\n protected edgeContext!: EdgeContext\n\n public ngOnInit(): void {\n this.edgeContext = {\n $implicit: {\n // TODO: check if edge could change\n edge: this.model.edge,\n path: computed(() => this.model.path().path),\n markerStart: this.markerStartUrl,\n markerEnd: this.markerEndUrl\n }\n }\n }\n}\n","<svg:path\n *ngIf=\"model.type === 'default'\"\n [attr.d]=\"model.path().path\"\n [attr.marker-start]=\"markerStartUrl()\"\n [attr.marker-end]=\"markerEndUrl()\"\n [attr.stroke]=\"defaultColor\"\n stroke-width=\"2\"\n fill=\"none\"\n/>\n\n<ng-container *ngIf=\"model.type === 'template' && edgeTemplate\">\n <ng-container *ngTemplateOutlet=\"edgeTemplate; context: edgeContext\"></ng-container>\n</ng-container>\n\n<ng-container *ngIf=\"model.edgeLabels?.start as label\">\n <svg:g edgeLabel\n [model]=\"label\"\n [point]=\"model.path().points.start\"\n [edgeModel]=\"model\"\n [htmlTemplate]=\"edgeLabelHtmlTemplate\"\n />\n</ng-container>\n\n<ng-container *ngIf=\"model.edgeLabels?.center as label\">\n <svg:g edgeLabel\n [model]=\"label\"\n [point]=\"model.path().points.center\"\n [edgeModel]=\"model\"\n [htmlTemplate]=\"edgeLabelHtmlTemplate\"\n />\n</ng-container>\n\n<ng-container *ngIf=\"model.edgeLabels?.end as label\">\n <svg:g edgeLabel\n [model]=\"label\"\n [point]=\"model.path().points.end\"\n [edgeModel]=\"model\"\n [htmlTemplate]=\"edgeLabelHtmlTemplate\"\n />\n</ng-container>\n","import { Directive, ElementRef, Signal, computed, inject } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { fromEvent, map, startWith } from 'rxjs';\nimport { RootSvgReferenceDirective } from './reference.directive';\nimport { Point } from '../interfaces/point.interface';\n\n@Directive({ selector: 'g[spacePointContext]' })\nexport class SpacePointContextDirective {\n /**\n * Signal with current mouse position in svg space\n */\n public svgCurrentSpacePoint: Signal<Point> = computed(() => {\n const movement = this.mouseMovement()\n\n const point = this.rootSvg.createSVGPoint()\n point.x = movement.x\n point.y = movement.y\n\n return point.matrixTransform(this.host.getScreenCTM()!.inverse())\n })\n\n private rootSvg = inject(RootSvgReferenceDirective).element\n private host = inject<ElementRef<SVGGElement>>(ElementRef).nativeElement\n\n private mouseMovement = toSignal(\n fromEvent<MouseEvent>(this.rootSvg, 'mousemove').pipe(\n map(event => ({ x: event.clientX, y: event.clientY })),\n ),\n { initialValue: { x: 0, y: 0 } }\n )\n}\n","import { ChangeDetectionStrategy, Component, Input, TemplateRef, computed, inject } from '@angular/core';\nimport { FlowStatusService } from '../../services/flow-status.service';\nimport { straightPath } from '../../math/edge-path/straigh-path';\nimport { SpacePointContextDirective } from '../../directives/space-point-context.directive';\nimport { ConnectionModel } from '../../models/connection.model';\nimport { bezierPath } from '../../math/edge-path/bezier-path';\nimport { hashCode } from '../../utils/hash';\n\n@Component({\n selector: 'g[connection]',\n template: `\n <ng-container *ngIf=\"model.type === 'default'\">\n <svg:path\n *ngIf=\"path() as path\"\n [attr.d]=\"path\"\n [attr.marker-end]=\"markerUrl()\"\n [attr.stroke]=\"defaultColor\"\n fill=\"none\"\n stroke-width=\"2\"\n />\n </ng-container>\n\n <ng-container *ngIf=\"model.type === 'template' && template\">\n <ng-container *ngTemplateOutlet=\"template; context: getContext()\" />\n </ng-container>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class ConnectionComponent {\n @Input({ required: true })\n public model!: ConnectionModel\n\n @Input()\n public template?: TemplateRef<any>\n\n private flowStatusService = inject(FlowStatusService)\n private spacePointContext = inject(SpacePointContextDirective)\n\n protected path = computed(() => {\n const status = this.flowStatusService.status()\n\n if (status.state === 'connection-start') {\n const sourceNode = status.payload.sourceNode\n const sourcePoint = sourceNode.sourcePointAbsolute()\n const targetPoint = this.spacePointContext.svgCurrentSpacePoint()\n\n switch (this.model.curve) {\n case 'straight': return straightPath(sourcePoint, targetPoint).path\n case 'bezier': return bezierPath(\n sourcePoint, targetPoint,\n sourceNode.sourcePosition(), sourceNode.targetPosition()\n ).path\n }\n }\n\n if (status.state === 'connection-validation') {\n const sourcePoint = status.payload.sourceNode.sourcePointAbsolute()\n // ignore magnet if validation failed\n const targetPoint = status.payload.valid\n ? status.payload.targetNode.targetPointAbsolute()\n : this.spacePointContext.svgCurrentSpacePoint()\n\n switch (this.model.curve) {\n case 'straight': return straightPath(sourcePoint, targetPoint).path\n case 'bezier': return bezierPath(\n sourcePoint, targetPoint,\n status.payload.sourceNode.sourcePosition(),\n status.payload.sourceNode.targetPosition()\n ).path\n }\n }\n\n return null\n })\n\n protected markerUrl = computed(() => {\n const marker = this.model.connection.marker\n\n if (marker) {\n return `url(#${hashCode(JSON.stringify(marker))})`\n }\n\n return ''\n })\n\n protected readonly defaultColor = 'rgb(177, 177, 183)'\n\n protected getContext() {\n return {\n $implicit: {\n path: this.path,\n marker: this.markerUrl\n }\n }\n }\n}\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\nimport { Marker } from '../../interfaces/marker.interface';\n\n@Component({\n selector: 'defs[flowDefs]',\n templateUrl: './defs.component.html',\n styleUrls: ['./defs.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class DefsComponent {\n @Input({ required: true })\n public markers: Map<number, Marker> = new Map()\n\n protected readonly defaultColor = 'rgb(177, 177, 183)'\n}\n","<svg:marker\n *ngFor=\"let marker of markers | keyvalue\"\n [attr.id]=\"marker.key\"\n [attr.markerWidth]=\"marker.value.width ?? 16.5\"\n [attr.markerHeight]=\"marker.value.height ?? 16.5\"\n [attr.orient]=\"marker.value.orient ?? 'auto-start-reverse'\"\n viewBox=\"-10 -10 20 20\"\n [attr.markerUnits]=\"marker.value.markerUnits ?? 'userSpaceOnUse'\"\n refX=\"0\"\n refY=\"0\"\n>\n <polyline\n *ngIf=\"marker.value.type === 'arrow-closed' || !marker.value.type\"\n class=\"marker__arrow_closed\"\n [style.stroke]=\"marker.value.color ?? defaultColor\"\n [style.stroke-width]=\"marker.value.strokeWidth ?? 2\"\n [style.fill]=\"marker.value.color ?? defaultColor\"\n points=\"-5,-4 1,0 -5,4 -5,-4\"\n />\n\n <polyline\n *ngIf=\"marker.value.type === 'arrow'\"\n class=\"marker__arrow_default\"\n [style.stroke]=\"marker.value.color ?? defaultColor\"\n [style.stroke-width]=\"marker.value.strokeWidth ?? 2\"\n points=\"-5,-4 0,0 -5,4\"\n />\n</svg:marker>\n","import { Directive, HostListener, inject } from '@angular/core';\nimport { FlowStatusService } from '../services/flow-status.service';\n\n// TODO: too general purpose nane\n@Directive({ selector: 'svg[rootSvgContext]' })\nexport class RootSvgContextDirective {\n private flowStatusService = inject(FlowStatusService)\n\n // TODO: check for multiple instances on page\n @HostListener('document:mouseup')\n protected resetConnection() {\n const status = this.flowStatusService.status()\n\n if (status.state === 'connection-start') {\n this.flowStatusService.setIdleStatus()\n }\n }\n}\n","import { AfterContentInit, ChangeDetectionStrategy, Component, ContentChild, EventEmitter, Injector, Input, OnChanges, Output, Signal, SimpleChanges, ViewChild, computed, effect, inject, runInInjectionContext } from '@angular/core';\nimport { Node } from '../../interfaces/node.interface';\nimport { MapContextDirective } from '../../directives/map-context.directive';\nimport { DraggableService } from '../../services/draggable.service';\nimport { NodeModel } from '../../models/node.model';\nimport { ViewportService } from '../../services/viewport.service';\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { Edge } from '../../interfaces/edge.interface';\nimport { EdgeModel } from '../../models/edge.model';\nimport { ConnectionTemplateDirective, EdgeLabelHtmlTemplateDirective, EdgeTemplateDirective, HandleTemplateDirective, NodeHtmlTemplateDirective } from '../../directives/template.directive';\nimport { HandlePositions } from '../../interfaces/handle-positions.interface';\nimport { addNodesToEdges } from '../../utils/add-nodes-to-edges';\nimport { FlowModel } from '../../models/flow.model';\nimport { skip } from 'rxjs';\nimport { Point } from '../../interfaces/point.interface';\nimport { ViewportState } from '../../interfaces/viewport.interface';\nimport { FlowStatusService } from '../../services/flow-status.service';\nimport { ConnectionControllerDirective } from '../../directives/connection-controller.directive';\nimport { FlowEntitiesService } from '../../services/flow-entities.service';\nimport { ConnectionSettings } from '../../interfaces/connection-settings.interface';\nimport { ConnectionModel } from '../../models/connection.model';\nimport { ReferenceKeeper } from '../../utils/reference-keeper';\nimport { NodesChangeService } from '../../services/node-changes.service';\nimport { EdgeChangesService } from '../../services/edge-changes.service';\nimport { NodeChange } from '../../types/node-change.type';\nimport { ChangesControllerDirective } from '../../directives/changes-controller.directive';\nimport { EdgeChange } from '../../types/edge-change.type';\n\nconst connectionControllerHostDirective = {\n directive: ConnectionControllerDirective,\n outputs: ['onConnect']\n}\n\nconst changesControllerHostDirective = {\n directive: ChangesControllerDirective,\n outputs: ['onNodesChange', 'onEdgesChange']\n}\n\n@Component({\n selector: 'vflow',\n templateUrl: './vflow.component.html',\n styleUrls: ['./vflow.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n DraggableService,\n ViewportService,\n FlowStatusService,\n FlowEntitiesService,\n NodesChangeService,\n EdgeChangesService\n ],\n hostDirectives: [\n connectionControllerHostDirective,\n changesControllerHostDirective\n ]\n})\nexport class VflowComponent {\n // #region DI\n protected viewportService = inject(ViewportService)\n protected flowEntitiesService = inject(FlowEntitiesService)\n protected nodesChangeService = inject(NodesChangeService)\n protected edgesChangeService = inject(EdgeChangesService)\n protected injector = inject(Injector)\n // #endregion\n\n // #region SETTINGS\n\n /**\n * Size for flow view\n *\n * accepts\n * - absolute size in format [width, height] or\n * - 'auto' to compute size based on parent element size\n */\n @Input()\n public set view(view: [number, number] | 'auto') {\n this.flowModel.view.set(view)\n }\n\n /**\n * Minimum zoom value\n */\n @Input()\n public minZoom = 0.5\n\n /**\n * Maximum zoom value\n */\n @Input()\n public maxZoom = 3\n\n /**\n * Object that controls flow direction.\n *\n * @example if you want to archieve right to left direction\n * then you need to pass these positions { source: 'left', target: 'right' }\n *\n * ! Be carefult using this field, it may depricate in future releases !\n */\n @Input()\n public set handlePositions(handlePositions: HandlePositions) {\n this.flowModel.handlePositions.set(handlePositions)\n }\n\n /**\n * Background color for flow\n */\n @Input()\n public background: string = '#FFFFFF'\n\n /**\n * Settings for connection (it renders when user tries to create edge between nodes)\n *\n * @see `ConnectionSettings`\n */\n @Input({ transform: (settings: ConnectionSettings) => new ConnectionModel(settings) })\n public set connection(connection: ConnectionModel) { this.flowEntitiesService.connection.set(connection) }\n\n public get connection() { return this.flowEntitiesService.connection() }\n // #endregion\n\n // #region MAIN_INPUTS\n /**\n * Data for rendered nodes\n */\n @Input({ required: true })\n public set nodes(newNodes: Node[]) {\n const newModels = runInInjectionContext(this.injector,\n () => ReferenceKeeper.nodes(newNodes, this.flowEntitiesService.nodes())\n )\n\n // TODO better to solve this by DI\n bindFlowToNodes(this.flowModel, newModels)\n\n // quick and dirty binding nodes to edges\n addNodesToEdges(newModels, this.flowEntitiesService.edges())\n\n this.flowEntitiesService.nodes.set(newModels)\n }\n\n /**\n * @internal\n */\n protected get nodeModels() { return this.flowEntitiesService.nodes() }\n\n /**\n * Data for rendered edges\n */\n @Input()\n public set edges(newEdges: Edge[]) {\n const newModels = ReferenceKeeper.edges(newEdges, this.flowEntitiesService.edges())\n\n // quick and dirty binding nodes to edges\n addNodesToEdges(this.nodeModels, newModels)\n\n this.flowEntitiesService.edges.set(newModels)\n }\n\n protected get edgeModels() { return this.flowEntitiesService.validEdges() }\n // #endregion\n\n // #region TEMPLATES\n @ContentChild(NodeHtmlTemplateDirective)\n protected nodeHtmlDirective?: NodeHtmlTemplateDirective\n\n @ContentChild(EdgeTemplateDirective)\n protected edgeTemplateDirective?: EdgeTemplateDirective\n\n @ContentChild(EdgeLabelHtmlTemplateDirective)\n protected edgeLabelHtmlDirective?: EdgeLabelHtmlTemplateDirective\n\n @ContentChild(ConnectionTemplateDirective)\n protected connectionTemplateDirective?: ConnectionTemplateDirective\n\n @ContentChild(HandleTemplateDirective)\n protected handleTemplateDirective?: HandleTemplateDirective\n // #endregion\n\n // #region DIRECTIVES\n @ViewChild(MapContextDirective)\n protected mapContext!: MapContextDirective\n // #endregion\n\n // #region SIGNAL_API\n /**\n * Signal for reading viewport change\n */\n public readonly viewport = this.viewportService.readableViewport.asReadonly()\n\n /**\n * Signal for reading nodes change\n */\n public readonly nodesChange =\n toSignal(this.nodesChangeService.changes$, { initialValue: [] as NodeChange[] })\n\n /**\n * Signal to reading edges change\n */\n public readonly edgesChange =\n toSignal(this.edgesChangeService.changes$, { initialValue: [] as EdgeChange[] })\n // #endregion\n\n // #region RX_API\n /**\n * Observable with viewport change\n */\n public readonly viewportChange$ = toObservable(this.viewportService.readableViewport)\n .pipe(skip(1)) // skip default value that set by signal\n\n /**\n * Observable with nodes change\n */\n public readonly nodesChange$ = this.nodesChangeService.changes$\n\n /**\n * Observable with nodes change\n */\n public readonly edgesChange$ = this.edgesChangeService.changes$\n // #endregion\n\n // TODO: probably better to make it injectable\n protected flowModel = new FlowModel()\n\n protected markers = this.flowEntitiesService.markers\n\n // #region METHODS_API\n /**\n * Change viewport to specified state\n *\n * @param viewport viewport state\n */\n public viewportTo(viewport: ViewportState): void {\n this.viewportService.writableViewport.set({ changeType: 'absolute', state: viewport })\n }\n\n /**\n * Change zoom\n *\n * @param zoom zoom value\n */\n public zoomTo(zoom: number): void {\n this.viewportService.writableViewport.set({ changeType: 'absolute', state: { zoom } })\n }\n\n /**\n * Move to specified coordinate\n *\n * @param point point where to move\n */\n public panTo(point: Point): void {\n this.viewportService.writableViewport.set({ changeType: 'absolute', state: point })\n }\n\n /**\n * Get node by id\n *\n * @param id node id\n */\n public getNode<T = unknown>(id: string): Node<T> | undefined {\n return this.flowEntitiesService.getNode<T>(id)?.node\n }\n // #endregion\n\n protected trackNodes(idx: number, { node }: NodeModel) {\n return node.id\n }\n\n protected trackEdges(idx: number, { edge }: EdgeModel) {\n return edge.id\n }\n}\n\nfunction bindFlowToNodes(flow: FlowModel, nodes: NodeModel[]) {\n nodes.forEach(n => n.bindFlow(flow))\n}\n\n","<svg:svg\n rootSvgRef\n rootSvgContext\n class=\"root-svg\"\n #flow\n [style.backgroundColor]=\"background\"\n [attr.width]=\"flowModel.flowWidth()\"\n [attr.height]=\"flowModel.flowHeight()\"\n>\n <defs [markers]=\"markers()\" flowDefs />\n\n <svg:g\n mapContext\n spacePointContext\n [minZoom]=\"minZoom\"\n [maxZoom]=\"maxZoom\"\n >\n <!-- Connection -->\n <svg:g\n connection\n [model]=\"connection\"\n [template]=\"connectionTemplateDirective?.templateRef\"\n />\n\n <!-- Edges -->\n <svg:g\n *ngFor=\"let model of edgeModels; trackBy: trackEdges\"\n edge\n [model]=\"model\"\n [edgeTemplate]=\"edgeTemplateDirective?.templateRef\"\n [edgeLabelHtmlTemplate]=\"edgeLabelHtmlDirective?.templateRef\"\n />\n\n <!-- Nodes -->\n <svg:g\n *ngFor=\"let model of nodeModels; trackBy: trackNodes\"\n node\n [nodeModel]=\"model\"\n [nodeHtmlTemplate]=\"nodeHtmlDirective?.templateRef\"\n [handleTemplate]=\"handleTemplateDirective?.templateRef\"\n [attr.transform]=\"model.pointTransform()\"\n />\n </svg:g>\n\n</svg:svg>\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { VflowComponent } from './components/vflow/vflow.component';\nimport { NodeComponent } from './components/node/node.component';\nimport { MapContextDirective } from './directives/map-context.directive';\nimport { EdgeComponent } from './components/edge/edge.component';\nimport { EdgeLabelComponent } from './components/edge-label/edge-label.component';\nimport { ConnectionTemplateDirective, EdgeLabelHtmlTemplateDirective, EdgeTemplateDirective, HandleTemplateDirective, NodeHtmlTemplateDirective } from './directives/template.directive';\nimport { ConnectionComponent } from './components/connection/connection.component';\nimport { SpacePointContextDirective } from './directives/space-point-context.directive';\nimport { RootSvgReferenceDirective } from './directives/reference.directive';\nimport { RootSvgContextDirective } from './directives/root-svg-context.directive';\nimport { DefsComponent } from './components/defs/defs.component';\n\nconst components = [\n VflowComponent,\n NodeComponent,\n EdgeComponent,\n EdgeLabelComponent,\n ConnectionComponent,\n DefsComponent\n]\n\nconst directives = [\n SpacePointContextDirective,\n MapContextDirective,\n RootSvgReferenceDirective,\n RootSvgContextDirective,\n]\n\nconst templateDirectives = [\n NodeHtmlTemplateDirective,\n EdgeLabelHtmlTemplateDirective,\n EdgeTemplateDirective,\n ConnectionTemplateDirective,\n HandleTemplateDirective\n]\n\n@NgModule({\n imports: [CommonModule],\n exports: [\n VflowComponent,\n ...templateDirectives\n ],\n declarations: [...components, ...directives, ...templateDirectives],\n})\nexport class VflowModule { }\n","// Modules\nexport * from './lib/vflow/vflow.module';\n\n// Interfaces\nexport * from './lib/vflow/interfaces/node.interface';\nexport * from './lib/vflow/interfaces/point.interface';\nexport * from './lib/vflow/interfaces/edge.interface';\nexport * from './lib/vflow/interfaces/edge-label.interface';\nexport * from './lib/vflow/interfaces/connection.interface';\nexport * from './lib/vflow/interfaces/connection.interface';\nexport * from './lib/vflow/interfaces/connection-settings.interface';\nexport * from './lib/vflow/interfaces/handle-positions.interface';\nexport * from './lib/vflow/interfaces/marker.interface';\nexport { ViewportState } from './lib/vflow/interfaces/viewport.interface';\n\n// Types\nexport * from './lib/vflow/types/node-change.type';\nexport * from './lib/vflow/types/edge-change.type';\nexport * from './lib/vflow/types/position.type';\n\n// Components\nexport * from './lib/vflow/components/vflow/vflow.component';\n\n// Directives\nexport * from './lib/vflow/directives/template.directive';\nexport * from './lib/vflow/directives/connection-controller.directive';\nexport * from './lib/vflow/directives/changes-controller.directive';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["path","d3Path","i2.EdgeLabelComponent","i1.ConnectionControllerDirective","i2.ChangesControllerDirective","i3","i4.NodeComponent","i5.EdgeComponent","i6.ConnectionComponent","i7.DefsComponent","i8.SpacePointContextDirective","i9.MapContextDirective","i10.RootSvgReferenceDirective","i11.RootSvgContextDirective"],"mappings":"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"}
@@ -37,33 +37,98 @@ export declare class VflowComponent {
37
37
  number,
38
38
  number
39
39
  ] | 'auto');
40
+ /**
41
+ * Minimum zoom value
42
+ */
40
43
  minZoom: number;
44
+ /**
45
+ * Maximum zoom value
46
+ */
41
47
  maxZoom: number;
48
+ /**
49
+ * Object that controls flow direction.
50
+ *
51
+ * @example if you want to archieve right to left direction
52
+ * then you need to pass these positions { source: 'left', target: 'right' }
53
+ *
54
+ * ! Be carefult using this field, it may depricate in future releases !
55
+ */
42
56
  set handlePositions(handlePositions: HandlePositions);
57
+ /**
58
+ * Background color for flow
59
+ */
43
60
  background: string;
61
+ /**
62
+ * Settings for connection (it renders when user tries to create edge between nodes)
63
+ *
64
+ * @see `ConnectionSettings`
65
+ */
44
66
  set connection(connection: ConnectionModel);
45
67
  get connection(): ConnectionModel;
68
+ /**
69
+ * Data for rendered nodes
70
+ */
46
71
  set nodes(newNodes: Node[]);
47
- get nodeModels(): NodeModel<unknown>[];
72
+ /**
73
+ * Data for rendered edges
74
+ */
48
75
  set edges(newEdges: Edge[]);
49
- get edgeModels(): EdgeModel[];
76
+ protected get edgeModels(): EdgeModel[];
50
77
  protected nodeHtmlDirective?: NodeHtmlTemplateDirective;
51
78
  protected edgeTemplateDirective?: EdgeTemplateDirective;
52
79
  protected edgeLabelHtmlDirective?: EdgeLabelHtmlTemplateDirective;
53
80
  protected connectionTemplateDirective?: ConnectionTemplateDirective;
54
81
  protected handleTemplateDirective?: HandleTemplateDirective;
55
82
  protected mapContext: MapContextDirective;
83
+ /**
84
+ * Signal for reading viewport change
85
+ */
56
86
  readonly viewport: Signal<ViewportState>;
87
+ /**
88
+ * Signal for reading nodes change
89
+ */
57
90
  readonly nodesChange: Signal<NodeChange[]>;
91
+ /**
92
+ * Signal to reading edges change
93
+ */
58
94
  readonly edgesChange: Signal<EdgeChange[]>;
59
- readonly viewportChanges$: import("rxjs").Observable<ViewportState>;
95
+ /**
96
+ * Observable with viewport change
97
+ */
98
+ readonly viewportChange$: import("rxjs").Observable<ViewportState>;
99
+ /**
100
+ * Observable with nodes change
101
+ */
60
102
  readonly nodesChange$: import("rxjs").Observable<NodeChange[]>;
103
+ /**
104
+ * Observable with nodes change
105
+ */
61
106
  readonly edgesChange$: import("rxjs").Observable<EdgeChange[]>;
62
107
  protected flowModel: FlowModel;
63
108
  protected markers: Signal<Map<number, import("ngx-vflow").Marker>>;
109
+ /**
110
+ * Change viewport to specified state
111
+ *
112
+ * @param viewport viewport state
113
+ */
64
114
  viewportTo(viewport: ViewportState): void;
115
+ /**
116
+ * Change zoom
117
+ *
118
+ * @param zoom zoom value
119
+ */
65
120
  zoomTo(zoom: number): void;
121
+ /**
122
+ * Move to specified coordinate
123
+ *
124
+ * @param point point where to move
125
+ */
66
126
  panTo(point: Point): void;
127
+ /**
128
+ * Get node by id
129
+ *
130
+ * @param id node id
131
+ */
67
132
  getNode<T = unknown>(id: string): Node<T> | undefined;
68
133
  protected trackNodes(idx: number, { node }: NodeModel): string;
69
134
  protected trackEdges(idx: number, { edge }: EdgeModel): string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ngx-vflow",
3
- "version": "0.1.6",
3
+ "version": "0.1.8",
4
4
  "license": "MIT",
5
5
  "peerDependencies": {
6
6
  "@angular/common": "^16.2.0 || 17.x",