ngx-vflow 1.16.3 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (181) hide show
  1. package/README.md +35 -69
  2. package/fesm2022/ngx-vflow-testing.mjs +77 -67
  3. package/fesm2022/ngx-vflow-testing.mjs.map +1 -1
  4. package/fesm2022/ngx-vflow.mjs +926 -559
  5. package/fesm2022/ngx-vflow.mjs.map +1 -1
  6. package/lib/vflow/components/custom-node-base/custom-node-base.component.d.ts +1 -1
  7. package/lib/vflow/components/vflow/vflow.component.d.ts +18 -9
  8. package/lib/vflow/directives/auto-pan.directive.d.ts +16 -0
  9. package/lib/vflow/directives/changes-controller.directive.d.ts +13 -87
  10. package/lib/vflow/directives/connection-controller.directive.d.ts +8 -10
  11. package/lib/vflow/directives/space-point-context.directive.d.ts +2 -1
  12. package/lib/vflow/interfaces/component-node-event.interface.d.ts +1 -2
  13. package/lib/vflow/interfaces/connection-events.interface.d.ts +66 -0
  14. package/lib/vflow/interfaces/connection-settings.interface.d.ts +7 -1
  15. package/lib/vflow/interfaces/connection.interface.d.ts +0 -5
  16. package/lib/vflow/interfaces/curve-factory.interface.d.ts +2 -2
  17. package/lib/vflow/interfaces/edge-label.interface.d.ts +0 -4
  18. package/lib/vflow/interfaces/edge.interface.d.ts +36 -8
  19. package/lib/vflow/interfaces/node.interface.d.ts +44 -63
  20. package/lib/vflow/interfaces/selection-strategy.interface.d.ts +16 -0
  21. package/lib/vflow/interfaces/template-context.interface.d.ts +8 -3
  22. package/lib/vflow/models/connection.model.d.ts +1 -1
  23. package/lib/vflow/models/edge.model.d.ts +20 -23
  24. package/lib/vflow/models/handle.model.d.ts +1 -1
  25. package/lib/vflow/models/node.model.d.ts +4 -7
  26. package/lib/vflow/public-components/custom-node/custom-node.component.d.ts +1 -1
  27. package/lib/vflow/public-components/custom-template-edge/custom-template-edge.component.d.ts +2 -1
  28. package/lib/vflow/public-components/minimap/minimap.component.d.ts +1 -1
  29. package/lib/vflow/services/draggable.service.d.ts +3 -0
  30. package/lib/vflow/services/flow-entities.service.d.ts +2 -2
  31. package/lib/vflow/services/flow-settings.service.d.ts +3 -0
  32. package/lib/vflow/services/flow-status.service.d.ts +35 -7
  33. package/lib/vflow/services/selection.service.d.ts +4 -1
  34. package/lib/vflow/strategies/default-selection.strategy.d.ts +6 -0
  35. package/lib/vflow/strategies/manual-selection.strategy.d.ts +5 -0
  36. package/lib/vflow/types/selection-mode.type.d.ts +1 -0
  37. package/lib/vflow/types/unwrap-signal.type.d.ts +4 -0
  38. package/lib/vflow/utils/adjust-direction.d.ts +2 -6
  39. package/lib/vflow/utils/identity-checker/reference-identity-checker.d.ts +2 -2
  40. package/lib/vflow/utils/is-vflow-component.d.ts +0 -2
  41. package/lib/vflow/utils/signals/to-lazy-signal.d.ts +4 -4
  42. package/package.json +3 -7
  43. package/public-api.d.ts +3 -2
  44. package/testing/component-mocks/vflow-mock.component.d.ts +8 -6
  45. package/testing/directive-mocks/connection-controller-mock.directive.d.ts +8 -6
  46. package/esm2022/lib/vflow/components/alignment-helper/alignment-helper.component.mjs +0 -103
  47. package/esm2022/lib/vflow/components/background/background.component.mjs +0 -121
  48. package/esm2022/lib/vflow/components/connection/connection.component.mjs +0 -157
  49. package/esm2022/lib/vflow/components/custom-node-base/custom-node-base.component.mjs +0 -57
  50. package/esm2022/lib/vflow/components/default-node/default-node.component.mjs +0 -16
  51. package/esm2022/lib/vflow/components/defs/defs.component.mjs +0 -16
  52. package/esm2022/lib/vflow/components/edge/edge.component.mjs +0 -54
  53. package/esm2022/lib/vflow/components/edge-label/edge-label.component.mjs +0 -76
  54. package/esm2022/lib/vflow/components/node/node.component.mjs +0 -107
  55. package/esm2022/lib/vflow/components/preview-flow/draw-node.mjs +0 -100
  56. package/esm2022/lib/vflow/components/preview-flow/preview-flow.component.mjs +0 -62
  57. package/esm2022/lib/vflow/components/vflow/vflow.component.mjs +0 -437
  58. package/esm2022/lib/vflow/constants/magic-number-to-fix-glitch-in-chrome.constant.mjs +0 -4
  59. package/esm2022/lib/vflow/decorators/microtask.decorator.mjs +0 -11
  60. package/esm2022/lib/vflow/directives/changes-controller.directive.mjs +0 -165
  61. package/esm2022/lib/vflow/directives/connection-controller.directive.mjs +0 -145
  62. package/esm2022/lib/vflow/directives/drag-handle.directive.mjs +0 -28
  63. package/esm2022/lib/vflow/directives/flow-size-controller.directive.mjs +0 -40
  64. package/esm2022/lib/vflow/directives/handle-size-controller.directive.mjs +0 -41
  65. package/esm2022/lib/vflow/directives/map-context.directive.mjs +0 -116
  66. package/esm2022/lib/vflow/directives/node-handles-controller.directive.mjs +0 -33
  67. package/esm2022/lib/vflow/directives/node-resize-controller.directive.mjs +0 -37
  68. package/esm2022/lib/vflow/directives/pointer.directive.mjs +0 -84
  69. package/esm2022/lib/vflow/directives/reference.directive.mjs +0 -17
  70. package/esm2022/lib/vflow/directives/root-pointer.directive.mjs +0 -58
  71. package/esm2022/lib/vflow/directives/root-svg-context.directive.mjs +0 -35
  72. package/esm2022/lib/vflow/directives/selectable.directive.mjs +0 -48
  73. package/esm2022/lib/vflow/directives/space-point-context.directive.mjs +0 -42
  74. package/esm2022/lib/vflow/directives/template.directive.mjs +0 -119
  75. package/esm2022/lib/vflow/interfaces/alignment-helper-settings.interface.mjs +0 -2
  76. package/esm2022/lib/vflow/interfaces/box.mjs +0 -2
  77. package/esm2022/lib/vflow/interfaces/component-node-event.interface.mjs +0 -2
  78. package/esm2022/lib/vflow/interfaces/connection-settings.interface.mjs +0 -2
  79. package/esm2022/lib/vflow/interfaces/connection.interface.mjs +0 -2
  80. package/esm2022/lib/vflow/interfaces/connection.internal.interface.mjs +0 -2
  81. package/esm2022/lib/vflow/interfaces/contextable.interface.mjs +0 -2
  82. package/esm2022/lib/vflow/interfaces/curve-factory.interface.mjs +0 -2
  83. package/esm2022/lib/vflow/interfaces/edge-label.interface.mjs +0 -2
  84. package/esm2022/lib/vflow/interfaces/edge.interface.mjs +0 -2
  85. package/esm2022/lib/vflow/interfaces/fit-view-options.interface.mjs +0 -2
  86. package/esm2022/lib/vflow/interfaces/flow-entity.interface.mjs +0 -2
  87. package/esm2022/lib/vflow/interfaces/intersecting-nodes-options.interface.mjs +0 -2
  88. package/esm2022/lib/vflow/interfaces/marker.interface.mjs +0 -2
  89. package/esm2022/lib/vflow/interfaces/node-preview.interface.mjs +0 -2
  90. package/esm2022/lib/vflow/interfaces/node.interface.mjs +0 -53
  91. package/esm2022/lib/vflow/interfaces/optimization.interface.mjs +0 -7
  92. package/esm2022/lib/vflow/interfaces/point.interface.mjs +0 -2
  93. package/esm2022/lib/vflow/interfaces/rect.mjs +0 -10
  94. package/esm2022/lib/vflow/interfaces/template-context.interface.mjs +0 -2
  95. package/esm2022/lib/vflow/interfaces/viewport.interface.mjs +0 -2
  96. package/esm2022/lib/vflow/math/edge-path/bezier-path.mjs +0 -66
  97. package/esm2022/lib/vflow/math/edge-path/smooth-step-path.mjs +0 -226
  98. package/esm2022/lib/vflow/math/edge-path/straigh-path.mjs +0 -12
  99. package/esm2022/lib/vflow/math/point-on-line-by-ratio.mjs +0 -12
  100. package/esm2022/lib/vflow/models/connection.model.mjs +0 -31
  101. package/esm2022/lib/vflow/models/edge-label.model.mjs +0 -8
  102. package/esm2022/lib/vflow/models/edge.model.mjs +0 -208
  103. package/esm2022/lib/vflow/models/handle.model.mjs +0 -98
  104. package/esm2022/lib/vflow/models/minimap.model.mjs +0 -7
  105. package/esm2022/lib/vflow/models/node.model.mjs +0 -181
  106. package/esm2022/lib/vflow/models/toolbar.model.mjs +0 -36
  107. package/esm2022/lib/vflow/public-components/custom-dynamic-node/custom-dynamic-node.component.mjs +0 -25
  108. package/esm2022/lib/vflow/public-components/custom-node/custom-node.component.mjs +0 -24
  109. package/esm2022/lib/vflow/public-components/custom-template-edge/custom-template-edge.component.mjs +0 -29
  110. package/esm2022/lib/vflow/public-components/handle/handle.component.mjs +0 -53
  111. package/esm2022/lib/vflow/public-components/minimap/minimap.component.mjs +0 -108
  112. package/esm2022/lib/vflow/public-components/node-toolbar/node-toolbar.component.mjs +0 -73
  113. package/esm2022/lib/vflow/public-components/resizable/resizable.component.mjs +0 -272
  114. package/esm2022/lib/vflow/services/component-event-bus.service.mjs +0 -18
  115. package/esm2022/lib/vflow/services/draggable.service.mjs +0 -124
  116. package/esm2022/lib/vflow/services/edge-changes.service.mjs +0 -43
  117. package/esm2022/lib/vflow/services/edge-rendering.service.mjs +0 -40
  118. package/esm2022/lib/vflow/services/flow-entities.service.mjs +0 -56
  119. package/esm2022/lib/vflow/services/flow-rendering.service.mjs +0 -41
  120. package/esm2022/lib/vflow/services/flow-settings.service.mjs +0 -33
  121. package/esm2022/lib/vflow/services/flow-status.service.mjs +0 -49
  122. package/esm2022/lib/vflow/services/handle.service.mjs +0 -30
  123. package/esm2022/lib/vflow/services/keyboard.service.mjs +0 -47
  124. package/esm2022/lib/vflow/services/node-accessor.service.mjs +0 -16
  125. package/esm2022/lib/vflow/services/node-changes.service.mjs +0 -41
  126. package/esm2022/lib/vflow/services/node-rendering.service.mjs +0 -66
  127. package/esm2022/lib/vflow/services/overlays.service.mjs +0 -35
  128. package/esm2022/lib/vflow/services/preview-flow-render-strategy.service.mjs +0 -21
  129. package/esm2022/lib/vflow/services/selection.service.mjs +0 -54
  130. package/esm2022/lib/vflow/services/viewport.service.mjs +0 -64
  131. package/esm2022/lib/vflow/types/background.type.mjs +0 -2
  132. package/esm2022/lib/vflow/types/connection-mode.type.mjs +0 -2
  133. package/esm2022/lib/vflow/types/edge-change.type.mjs +0 -2
  134. package/esm2022/lib/vflow/types/handle-type.type.mjs +0 -2
  135. package/esm2022/lib/vflow/types/keyboard-action.type.mjs +0 -2
  136. package/esm2022/lib/vflow/types/node-change.type.mjs +0 -2
  137. package/esm2022/lib/vflow/types/position.type.mjs +0 -2
  138. package/esm2022/lib/vflow/types/viewport-change-type.type.mjs +0 -2
  139. package/esm2022/lib/vflow/utils/add-nodes-to-edges.mjs +0 -11
  140. package/esm2022/lib/vflow/utils/adjust-direction.mjs +0 -30
  141. package/esm2022/lib/vflow/utils/align-number.mjs +0 -4
  142. package/esm2022/lib/vflow/utils/assert-injector.mjs +0 -27
  143. package/esm2022/lib/vflow/utils/event.mjs +0 -4
  144. package/esm2022/lib/vflow/utils/get-os.mjs +0 -24
  145. package/esm2022/lib/vflow/utils/get-overlapping-area.mjs +0 -6
  146. package/esm2022/lib/vflow/utils/get-space-points.mjs +0 -25
  147. package/esm2022/lib/vflow/utils/hash.mjs +0 -7
  148. package/esm2022/lib/vflow/utils/id.mjs +0 -5
  149. package/esm2022/lib/vflow/utils/identity-checker/reference-identity-checker.mjs +0 -28
  150. package/esm2022/lib/vflow/utils/is-callable.mjs +0 -10
  151. package/esm2022/lib/vflow/utils/is-defined.mjs +0 -4
  152. package/esm2022/lib/vflow/utils/is-group-node.mjs +0 -4
  153. package/esm2022/lib/vflow/utils/is-vflow-component.mjs +0 -9
  154. package/esm2022/lib/vflow/utils/nodes.mjs +0 -60
  155. package/esm2022/lib/vflow/utils/resizable.mjs +0 -11
  156. package/esm2022/lib/vflow/utils/round.mjs +0 -2
  157. package/esm2022/lib/vflow/utils/signals/extended-computed.mjs +0 -15
  158. package/esm2022/lib/vflow/utils/signals/to-lazy-signal.mjs +0 -35
  159. package/esm2022/lib/vflow/utils/to-unified-node.mjs +0 -24
  160. package/esm2022/lib/vflow/utils/transform-background.mjs +0 -4
  161. package/esm2022/lib/vflow/utils/viewport.mjs +0 -51
  162. package/esm2022/lib/vflow/vflow.mjs +0 -29
  163. package/esm2022/ngx-vflow.mjs +0 -5
  164. package/esm2022/public-api.mjs +0 -55
  165. package/esm2022/testing/component-mocks/custom-template-edge-mock.component.mjs +0 -16
  166. package/esm2022/testing/component-mocks/handle-mock.component.mjs +0 -26
  167. package/esm2022/testing/component-mocks/minimap-mock.component.mjs +0 -24
  168. package/esm2022/testing/component-mocks/node-toolbar-mock.component.mjs +0 -23
  169. package/esm2022/testing/component-mocks/resizable-mock.component.mjs +0 -27
  170. package/esm2022/testing/component-mocks/vflow-mock.component.mjs +0 -299
  171. package/esm2022/testing/directive-mocks/connection-controller-mock.directive.mjs +0 -29
  172. package/esm2022/testing/directive-mocks/drag-handle-mock.directive.mjs +0 -11
  173. package/esm2022/testing/directive-mocks/selectable-mock.directive.mjs +0 -14
  174. package/esm2022/testing/directive-mocks/template-mock.directive.mjs +0 -101
  175. package/esm2022/testing/ngx-vflow-testing.mjs +0 -5
  176. package/esm2022/testing/provide-custom-node-mocks.mjs +0 -60
  177. package/esm2022/testing/public-api.mjs +0 -13
  178. package/esm2022/testing/types.mjs +0 -2
  179. package/esm2022/testing/vflow-mocks.mjs +0 -28
  180. package/lib/vflow/public-components/custom-dynamic-node/custom-dynamic-node.component.d.ts +0 -13
  181. package/lib/vflow/utils/to-unified-node.d.ts +0 -2
@@ -1,57 +0,0 @@
1
- import { DestroyRef, Directive, EventEmitter, inject, signal, OutputEmitterRef } from '@angular/core';
2
- import { merge, Observable, tap } from 'rxjs';
3
- import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
4
- import { ComponentEventBusService } from '../../services/component-event-bus.service';
5
- import { NodeAccessorService } from '../../services/node-accessor.service';
6
- import * as i0 from "@angular/core";
7
- export class CustomNodeBaseComponent {
8
- constructor() {
9
- this.eventBus = inject(ComponentEventBusService);
10
- this.nodeService = inject(NodeAccessorService);
11
- this.destroyRef = inject(DestroyRef);
12
- /**
13
- * Signal with selected state of node
14
- */
15
- this.selected = this.nodeService.model().selected;
16
- this.data = signal(undefined);
17
- }
18
- ngOnInit() {
19
- this.trackEvents().pipe(takeUntilDestroyed(this.destroyRef)).subscribe();
20
- }
21
- trackEvents() {
22
- const props = Object.getOwnPropertyNames(this);
23
- const emittersOrRefs = new Map();
24
- for (const prop of props) {
25
- const field = this[prop];
26
- if (field instanceof EventEmitter) {
27
- emittersOrRefs.set(field, prop);
28
- }
29
- if (field instanceof OutputEmitterRef) {
30
- emittersOrRefs.set(outputRefToObservable(field), prop);
31
- }
32
- }
33
- return merge(...Array.from(emittersOrRefs.keys()).map((emitter) => emitter.pipe(tap((event) => {
34
- this.eventBus.pushEvent({
35
- nodeId: this.nodeService.model()?.rawNode.id ?? '',
36
- eventName: emittersOrRefs.get(emitter),
37
- eventPayload: event,
38
- });
39
- }))));
40
- }
41
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CustomNodeBaseComponent, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
42
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: CustomNodeBaseComponent, ngImport: i0 }); }
43
- }
44
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CustomNodeBaseComponent, decorators: [{
45
- type: Directive
46
- }] });
47
- function outputRefToObservable(ref) {
48
- return new Observable((subscriber) => {
49
- const subscription = ref.subscribe((value) => {
50
- subscriber.next(value);
51
- });
52
- return () => {
53
- subscription.unsubscribe();
54
- };
55
- });
56
- }
57
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLW5vZGUtYmFzZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdmZsb3ctbGliL3NyYy9saWIvdmZsb3cvY29tcG9uZW50cy9jdXN0b20tbm9kZS1iYXNlL2N1c3RvbS1ub2RlLWJhc2UuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBVSxNQUFNLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlHLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM5QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUN0RixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQzs7QUFHM0UsTUFBTSxPQUFnQix1QkFBdUI7SUFEN0M7UUFFVSxhQUFRLEdBQUcsTUFBTSxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDNUMsZ0JBQVcsR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUV4QyxlQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRTFDOztXQUVHO1FBQ0ksYUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFHLENBQUMsUUFBUSxDQUFDO1FBRTlDLFNBQUksR0FBRyxNQUFNLENBQWdCLFNBQVMsQ0FBQyxDQUFDO0tBb0NoRDtJQWxDUSxRQUFRO1FBQ2IsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUMzRSxDQUFDO0lBRU8sV0FBVztRQUNqQixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFL0MsTUFBTSxjQUFjLEdBQUcsSUFBSSxHQUFHLEVBQStCLENBQUM7UUFDOUQsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUN6QixNQUFNLEtBQUssR0FBSSxJQUFnQyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRXRELElBQUksS0FBSyxZQUFZLFlBQVksRUFBRSxDQUFDO2dCQUNsQyxjQUFjLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNsQyxDQUFDO1lBRUQsSUFBSSxLQUFLLFlBQVksZ0JBQWdCLEVBQUUsQ0FBQztnQkFDdEMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUN6RCxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUNWLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUNuRCxPQUFPLENBQUMsSUFBSSxDQUNWLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ1osSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUM7Z0JBQ3RCLE1BQU0sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxFQUFFLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRTtnQkFDbEQsU0FBUyxFQUFFLGNBQWMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFFO2dCQUN2QyxZQUFZLEVBQUUsS0FBSzthQUNwQixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FDSCxDQUNGLENBQ0YsQ0FBQztJQUNKLENBQUM7K0dBOUNtQix1QkFBdUI7bUdBQXZCLHVCQUF1Qjs7NEZBQXZCLHVCQUF1QjtrQkFENUMsU0FBUzs7QUFrRFYsU0FBUyxxQkFBcUIsQ0FBQyxHQUE4QjtJQUMzRCxPQUFPLElBQUksVUFBVSxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUU7UUFDbkMsTUFBTSxZQUFZLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQzNDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekIsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLEdBQUcsRUFBRTtZQUNWLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUM3QixDQUFDLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEZXN0cm95UmVmLCBEaXJlY3RpdmUsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBpbmplY3QsIHNpZ25hbCwgT3V0cHV0RW1pdHRlclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgbWVyZ2UsIE9ic2VydmFibGUsIHRhcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgQ29tcG9uZW50RXZlbnRCdXNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY29tcG9uZW50LWV2ZW50LWJ1cy5zZXJ2aWNlJztcbmltcG9ydCB7IE5vZGVBY2Nlc3NvclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9ub2RlLWFjY2Vzc29yLnNlcnZpY2UnO1xuXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDdXN0b21Ob2RlQmFzZUNvbXBvbmVudDxUID0gYW55PiBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHByaXZhdGUgZXZlbnRCdXMgPSBpbmplY3QoQ29tcG9uZW50RXZlbnRCdXNTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBub2RlU2VydmljZSA9IGluamVjdChOb2RlQWNjZXNzb3JTZXJ2aWNlKTtcblxuICBwcm90ZWN0ZWQgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcblxuICAvKipcbiAgICogU2lnbmFsIHdpdGggc2VsZWN0ZWQgc3RhdGUgb2Ygbm9kZVxuICAgKi9cbiAgcHVibGljIHNlbGVjdGVkID0gdGhpcy5ub2RlU2VydmljZS5tb2RlbCgpIS5zZWxlY3RlZDtcblxuICBwdWJsaWMgZGF0YSA9IHNpZ25hbDxUIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnRyYWNrRXZlbnRzKCkucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSkuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwcml2YXRlIHRyYWNrRXZlbnRzKCkge1xuICAgIGNvbnN0IHByb3BzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcyk7XG5cbiAgICBjb25zdCBlbWl0dGVyc09yUmVmcyA9IG5ldyBNYXA8T2JzZXJ2YWJsZTx1bmtub3duPiwgc3RyaW5nPigpO1xuICAgIGZvciAoY29uc3QgcHJvcCBvZiBwcm9wcykge1xuICAgICAgY29uc3QgZmllbGQgPSAodGhpcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbcHJvcF07XG5cbiAgICAgIGlmIChmaWVsZCBpbnN0YW5jZW9mIEV2ZW50RW1pdHRlcikge1xuICAgICAgICBlbWl0dGVyc09yUmVmcy5zZXQoZmllbGQsIHByb3ApO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmllbGQgaW5zdGFuY2VvZiBPdXRwdXRFbWl0dGVyUmVmKSB7XG4gICAgICAgIGVtaXR0ZXJzT3JSZWZzLnNldChvdXRwdXRSZWZUb09ic2VydmFibGUoZmllbGQpLCBwcm9wKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWVyZ2UoXG4gICAgICAuLi5BcnJheS5mcm9tKGVtaXR0ZXJzT3JSZWZzLmtleXMoKSkubWFwKChlbWl0dGVyKSA9PlxuICAgICAgICBlbWl0dGVyLnBpcGUoXG4gICAgICAgICAgdGFwKChldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5ldmVudEJ1cy5wdXNoRXZlbnQoe1xuICAgICAgICAgICAgICBub2RlSWQ6IHRoaXMubm9kZVNlcnZpY2UubW9kZWwoKT8ucmF3Tm9kZS5pZCA/PyAnJyxcbiAgICAgICAgICAgICAgZXZlbnROYW1lOiBlbWl0dGVyc09yUmVmcy5nZXQoZW1pdHRlcikhLFxuICAgICAgICAgICAgICBldmVudFBheWxvYWQ6IGV2ZW50LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSksXG4gICAgICAgICksXG4gICAgICApLFxuICAgICk7XG4gIH1cbn1cblxuZnVuY3Rpb24gb3V0cHV0UmVmVG9PYnNlcnZhYmxlKHJlZjogT3V0cHV0RW1pdHRlclJlZjx1bmtub3duPikge1xuICByZXR1cm4gbmV3IE9ic2VydmFibGUoKHN1YnNjcmliZXIpID0+IHtcbiAgICBjb25zdCBzdWJzY3JpcHRpb24gPSByZWYuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xuICAgICAgc3Vic2NyaWJlci5uZXh0KHZhbHVlKTtcbiAgICB9KTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9O1xuICB9KTtcbn1cbiJdfQ==
@@ -1,16 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, input } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- export class DefaultNodeComponent {
4
- constructor() {
5
- this.selected = input(false);
6
- }
7
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DefaultNodeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
8
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "17.3.12", type: DefaultNodeComponent, isStandalone: true, selector: "default-node", inputs: { selected: { classPropertyName: "selected", publicName: "selected", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.selected": "selected()" } }, ngImport: i0, template: "<ng-content />\n", styles: [":host{border:1.5px solid #1b262c;border-radius:5px;display:flex;align-items:center;justify-content:center;color:#000;background-color:#fff}:host(.selected){border-width:2px}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
9
- }
10
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DefaultNodeComponent, decorators: [{
11
- type: Component,
12
- args: [{ standalone: true, selector: 'default-node', host: {
13
- '[class.selected]': 'selected()',
14
- }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-content />\n", styles: [":host{border:1.5px solid #1b262c;border-radius:5px;display:flex;align-items:center;justify-content:center;color:#000;background-color:#fff}:host(.selected){border-width:2px}\n"] }]
15
- }] });
16
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC1ub2RlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC12Zmxvdy1saWIvc3JjL2xpYi92Zmxvdy9jb21wb25lbnRzL2RlZmF1bHQtbm9kZS9kZWZhdWx0LW5vZGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXZmbG93LWxpYi9zcmMvbGliL3ZmbG93L2NvbXBvbmVudHMvZGVmYXVsdC1ub2RlL2RlZmF1bHQtbm9kZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFZMUUsTUFBTSxPQUFPLG9CQUFvQjtJQVZqQztRQVdTLGFBQVEsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDaEM7K0dBRlksb0JBQW9CO21HQUFwQixvQkFBb0IsK1FDWmpDLGtCQUNBOzs0RkRXYSxvQkFBb0I7a0JBVmhDLFNBQVM7aUNBQ0ksSUFBSSxZQUNOLGNBQWMsUUFHbEI7d0JBQ0osa0JBQWtCLEVBQUUsWUFBWTtxQkFDakMsbUJBQ2dCLHVCQUF1QixDQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBpbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc2VsZWN0b3I6ICdkZWZhdWx0LW5vZGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGVmYXVsdC1ub2RlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbYC4vZGVmYXVsdC1ub2RlLmNvbXBvbmVudC5zY3NzYF0sXG4gIGhvc3Q6IHtcbiAgICAnW2NsYXNzLnNlbGVjdGVkXSc6ICdzZWxlY3RlZCgpJyxcbiAgfSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIERlZmF1bHROb2RlQ29tcG9uZW50IHtcbiAgcHVibGljIHNlbGVjdGVkID0gaW5wdXQoZmFsc2UpO1xufVxuIiwiPG5nLWNvbnRlbnQgLz5cbiJdfQ==
@@ -1,16 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, input } from '@angular/core';
2
- import { KeyValuePipe } from '@angular/common';
3
- import * as i0 from "@angular/core";
4
- export class DefsComponent {
5
- constructor() {
6
- this.markers = input.required();
7
- this.defaultColor = 'rgb(177, 177, 183)';
8
- }
9
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DefsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
10
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: DefsComponent, isStandalone: true, selector: "defs[flowDefs]", inputs: { markers: { classPropertyName: "markers", publicName: "markers", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "@for (marker of markers() | keyvalue; track marker) {\n <svg:marker\n viewBox=\"-10 -10 20 20\"\n refX=\"0\"\n refY=\"0\"\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 [attr.markerUnits]=\"marker.value.markerUnits ?? 'userSpaceOnUse'\">\n @if (marker.value.type === 'arrow-closed' || !marker.value.type) {\n <polyline\n class=\"marker__arrow_closed\"\n points=\"-5,-4 1,0 -5,4 -5,-4\"\n [style.stroke]=\"marker.value.color ?? defaultColor\"\n [style.stroke-width]=\"marker.value.strokeWidth ?? 2\"\n [style.fill]=\"marker.value.color ?? defaultColor\" />\n }\n\n @if (marker.value.type === 'arrow') {\n <polyline\n class=\"marker__arrow_default\"\n points=\"-5,-4 0,0 -5,4\"\n [style.stroke]=\"marker.value.color ?? defaultColor\"\n [style.stroke-width]=\"marker.value.strokeWidth ?? 2\" />\n }\n </svg:marker>\n}\n", styles: [".marker__arrow_default{stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;fill:none}.marker__arrow_closed{stroke-linecap:round;stroke-linejoin:round}\n"], dependencies: [{ kind: "pipe", type: KeyValuePipe, name: "keyvalue" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
11
- }
12
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DefsComponent, decorators: [{
13
- type: Component,
14
- args: [{ standalone: true, selector: 'defs[flowDefs]', changeDetection: ChangeDetectionStrategy.OnPush, imports: [KeyValuePipe], template: "@for (marker of markers() | keyvalue; track marker) {\n <svg:marker\n viewBox=\"-10 -10 20 20\"\n refX=\"0\"\n refY=\"0\"\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 [attr.markerUnits]=\"marker.value.markerUnits ?? 'userSpaceOnUse'\">\n @if (marker.value.type === 'arrow-closed' || !marker.value.type) {\n <polyline\n class=\"marker__arrow_closed\"\n points=\"-5,-4 1,0 -5,4 -5,-4\"\n [style.stroke]=\"marker.value.color ?? defaultColor\"\n [style.stroke-width]=\"marker.value.strokeWidth ?? 2\"\n [style.fill]=\"marker.value.color ?? defaultColor\" />\n }\n\n @if (marker.value.type === 'arrow') {\n <polyline\n class=\"marker__arrow_default\"\n points=\"-5,-4 0,0 -5,4\"\n [style.stroke]=\"marker.value.color ?? defaultColor\"\n [style.stroke-width]=\"marker.value.strokeWidth ?? 2\" />\n }\n </svg:marker>\n}\n", styles: [".marker__arrow_default{stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;fill:none}.marker__arrow_closed{stroke-linecap:round;stroke-linejoin:round}\n"] }]
15
- }] });
16
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdmZsb3ctbGliL3NyYy9saWIvdmZsb3cvY29tcG9uZW50cy9kZWZzL2RlZnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXZmbG93LWxpYi9zcmMvbGliL3ZmbG93L2NvbXBvbmVudHMvZGVmcy9kZWZzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7QUFVL0MsTUFBTSxPQUFPLGFBQWE7SUFSMUI7UUFTUyxZQUFPLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBdUIsQ0FBQztRQUVwQyxpQkFBWSxHQUFHLG9CQUFvQixDQUFDO0tBQ3hEOytHQUpZLGFBQWE7bUdBQWIsYUFBYSxtTkNaMUIseWpDQTRCQSxxTkRsQlksWUFBWTs7NEZBRVgsYUFBYTtrQkFSekIsU0FBUztpQ0FDSSxJQUFJLFlBQ04sZ0JBQWdCLG1CQUdULHVCQUF1QixDQUFDLE1BQU0sV0FDdEMsQ0FBQyxZQUFZLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBpbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWFya2VyIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9tYXJrZXIuaW50ZXJmYWNlJztcbmltcG9ydCB7IEtleVZhbHVlUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzZWxlY3RvcjogJ2RlZnNbZmxvd0RlZnNdJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RlZnMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kZWZzLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBpbXBvcnRzOiBbS2V5VmFsdWVQaXBlXSxcbn0pXG5leHBvcnQgY2xhc3MgRGVmc0NvbXBvbmVudCB7XG4gIHB1YmxpYyBtYXJrZXJzID0gaW5wdXQucmVxdWlyZWQ8TWFwPG51bWJlciwgTWFya2VyPj4oKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVmYXVsdENvbG9yID0gJ3JnYigxNzcsIDE3NywgMTgzKSc7XG59XG4iLCJAZm9yIChtYXJrZXIgb2YgbWFya2VycygpIHwga2V5dmFsdWU7IHRyYWNrIG1hcmtlcikge1xuICA8c3ZnOm1hcmtlclxuICAgIHZpZXdCb3g9XCItMTAgLTEwIDIwIDIwXCJcbiAgICByZWZYPVwiMFwiXG4gICAgcmVmWT1cIjBcIlxuICAgIFthdHRyLmlkXT1cIm1hcmtlci5rZXlcIlxuICAgIFthdHRyLm1hcmtlcldpZHRoXT1cIm1hcmtlci52YWx1ZS53aWR0aCA/PyAxNi41XCJcbiAgICBbYXR0ci5tYXJrZXJIZWlnaHRdPVwibWFya2VyLnZhbHVlLmhlaWdodCA/PyAxNi41XCJcbiAgICBbYXR0ci5vcmllbnRdPVwibWFya2VyLnZhbHVlLm9yaWVudCA/PyAnYXV0by1zdGFydC1yZXZlcnNlJ1wiXG4gICAgW2F0dHIubWFya2VyVW5pdHNdPVwibWFya2VyLnZhbHVlLm1hcmtlclVuaXRzID8/ICd1c2VyU3BhY2VPblVzZSdcIj5cbiAgICBAaWYgKG1hcmtlci52YWx1ZS50eXBlID09PSAnYXJyb3ctY2xvc2VkJyB8fCAhbWFya2VyLnZhbHVlLnR5cGUpIHtcbiAgICAgIDxwb2x5bGluZVxuICAgICAgICBjbGFzcz1cIm1hcmtlcl9fYXJyb3dfY2xvc2VkXCJcbiAgICAgICAgcG9pbnRzPVwiLTUsLTQgMSwwIC01LDQgLTUsLTRcIlxuICAgICAgICBbc3R5bGUuc3Ryb2tlXT1cIm1hcmtlci52YWx1ZS5jb2xvciA/PyBkZWZhdWx0Q29sb3JcIlxuICAgICAgICBbc3R5bGUuc3Ryb2tlLXdpZHRoXT1cIm1hcmtlci52YWx1ZS5zdHJva2VXaWR0aCA/PyAyXCJcbiAgICAgICAgW3N0eWxlLmZpbGxdPVwibWFya2VyLnZhbHVlLmNvbG9yID8/IGRlZmF1bHRDb2xvclwiIC8+XG4gICAgfVxuXG4gICAgQGlmIChtYXJrZXIudmFsdWUudHlwZSA9PT0gJ2Fycm93Jykge1xuICAgICAgPHBvbHlsaW5lXG4gICAgICAgIGNsYXNzPVwibWFya2VyX19hcnJvd19kZWZhdWx0XCJcbiAgICAgICAgcG9pbnRzPVwiLTUsLTQgMCwwIC01LDRcIlxuICAgICAgICBbc3R5bGUuc3Ryb2tlXT1cIm1hcmtlci52YWx1ZS5jb2xvciA/PyBkZWZhdWx0Q29sb3JcIlxuICAgICAgICBbc3R5bGUuc3Ryb2tlLXdpZHRoXT1cIm1hcmtlci52YWx1ZS5zdHJva2VXaWR0aCA/PyAyXCIgLz5cbiAgICB9XG4gIDwvc3ZnOm1hcmtlcj5cbn1cbiJdfQ==
@@ -1,54 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, Injector, computed, inject, input } from '@angular/core';
2
- import { NgTemplateOutlet } from '@angular/common';
3
- import { SelectionService } from '../../services/selection.service';
4
- import { FlowSettingsService } from '../../services/flow-settings.service';
5
- import { EdgeLabelComponent } from '../edge-label/edge-label.component';
6
- import { ConnectionControllerDirective } from '../../directives/connection-controller.directive';
7
- import { FlowStatusService } from '../../services/flow-status.service';
8
- import { EdgeRenderingService } from '../../services/edge-rendering.service';
9
- import { PointerDirective } from '../../directives/pointer.directive';
10
- import * as i0 from "@angular/core";
11
- export class EdgeComponent {
12
- constructor() {
13
- this.injector = inject(Injector);
14
- this.selectionService = inject(SelectionService);
15
- this.flowSettingsService = inject(FlowSettingsService);
16
- this.flowStatusService = inject(FlowStatusService);
17
- this.edgeRenderingService = inject(EdgeRenderingService);
18
- // TODO remove dependency from this directive
19
- this.connectionController = inject(ConnectionControllerDirective, { optional: true });
20
- this.model = input.required();
21
- this.edgeTemplate = input();
22
- this.edgeLabelHtmlTemplate = input();
23
- this.isReconnecting = computed(() => {
24
- const status = this.flowStatusService.status();
25
- const isReconnecting = status.state === 'reconnection-start' || status.state === 'reconnection-validation';
26
- return isReconnecting && status.payload.oldEdge === this.model();
27
- });
28
- }
29
- select() {
30
- if (this.flowSettingsService.entitiesSelectable()) {
31
- this.selectionService.select(this.model());
32
- }
33
- }
34
- pull() {
35
- if (this.flowSettingsService.elevateEdgesOnSelect()) {
36
- this.edgeRenderingService.pull(this.model());
37
- }
38
- }
39
- startReconnection(event, handle) {
40
- // ignore drag by stopping propagation
41
- event.stopPropagation();
42
- this.connectionController?.startReconnection(handle, this.model());
43
- }
44
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EdgeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
45
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: EdgeComponent, isStandalone: true, selector: "g[edge]", inputs: { model: { classPropertyName: "model", publicName: "model", isSignal: true, isRequired: true, transformFunction: null }, edgeTemplate: { classPropertyName: "edgeTemplate", publicName: "edgeTemplate", isSignal: true, isRequired: false, transformFunction: null }, edgeLabelHtmlTemplate: { classPropertyName: "edgeLabelHtmlTemplate", publicName: "edgeLabelHtmlTemplate", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.visibility": "isReconnecting() ? \"hidden\" : \"visible\"" }, classAttribute: "selectable" }, ngImport: i0, template: "@if (model().type === 'default') {\n <svg:path\n class=\"edge\"\n [attr.d]=\"model().path().path\"\n [attr.marker-start]=\"model().markerStartUrl()\"\n [attr.marker-end]=\"model().markerEndUrl()\"\n [class.edge_selected]=\"model().selected()\" />\n\n <svg:path class=\"interactive-edge\" [attr.d]=\"model().path().path\" (click)=\"select(); pull()\" />\n}\n\n@if (model().type === 'template' && edgeTemplate()) {\n @if (edgeTemplate(); as edgeTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"edgeTemplate\"\n [ngTemplateOutletContext]=\"model().context\"\n [ngTemplateOutletInjector]=\"injector\" />\n }\n}\n\n@if (model().edgeLabels.start; as label) {\n @if (model().path().labelPoints?.start; as point) {\n <svg:g edgeLabel [model]=\"label\" [point]=\"point\" [edgeModel]=\"model()\" [htmlTemplate]=\"edgeLabelHtmlTemplate()\" />\n }\n}\n\n@if (model().edgeLabels.center; as label) {\n @if (model().path().labelPoints?.center; as point) {\n <svg:g edgeLabel [model]=\"label\" [point]=\"point\" [edgeModel]=\"model()\" [htmlTemplate]=\"edgeLabelHtmlTemplate()\" />\n }\n}\n\n@if (model().edgeLabels.end; as label) {\n @if (model().path().labelPoints?.end; as point) {\n <svg:g edgeLabel [model]=\"label\" [point]=\"point\" [edgeModel]=\"model()\" [htmlTemplate]=\"edgeLabelHtmlTemplate()\" />\n }\n}\n\n@if (model().sourceHandle() && model().targetHandle()) {\n @if (model().reconnectable === true || model().reconnectable === 'source') {\n <svg:circle\n class=\"reconnect-handle\"\n r=\"10\"\n [attr.cx]=\"model().sourceHandle()!.pointAbsolute().x\"\n [attr.cy]=\"model().sourceHandle()!.pointAbsolute().y\"\n (pointerStart)=\"startReconnection($event, model().targetHandle()!)\" />\n }\n\n @if (model().reconnectable === true || model().reconnectable === 'target') {\n <svg:circle\n class=\"reconnect-handle\"\n r=\"10\"\n [attr.cx]=\"model().targetHandle()!.pointAbsolute().x\"\n [attr.cy]=\"model().targetHandle()!.pointAbsolute().y\"\n (pointerStart)=\"startReconnection($event, model().sourceHandle()!)\" />\n }\n}\n", styles: [".edge{fill:none;stroke-width:2;stroke:#b1b1b7}.edge_selected{stroke-width:2.5;stroke:#0f4c75}.interactive-edge{fill:none;stroke-width:20;stroke:transparent}.reconnect-handle{fill:transparent;cursor:move}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: EdgeLabelComponent, selector: "g[edgeLabel]", inputs: ["model", "edgeModel", "point", "htmlTemplate"] }, { kind: "directive", type: PointerDirective, selector: "[pointerStart], [pointerEnd], [pointerOver], [pointerOut]", outputs: ["pointerOver", "pointerOut", "pointerStart", "pointerEnd"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
46
- }
47
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EdgeComponent, decorators: [{
48
- type: Component,
49
- args: [{ standalone: true, selector: 'g[edge]', changeDetection: ChangeDetectionStrategy.OnPush, host: {
50
- class: 'selectable',
51
- '[style.visibility]': 'isReconnecting() ? "hidden" : "visible"',
52
- }, imports: [NgTemplateOutlet, EdgeLabelComponent, PointerDirective], template: "@if (model().type === 'default') {\n <svg:path\n class=\"edge\"\n [attr.d]=\"model().path().path\"\n [attr.marker-start]=\"model().markerStartUrl()\"\n [attr.marker-end]=\"model().markerEndUrl()\"\n [class.edge_selected]=\"model().selected()\" />\n\n <svg:path class=\"interactive-edge\" [attr.d]=\"model().path().path\" (click)=\"select(); pull()\" />\n}\n\n@if (model().type === 'template' && edgeTemplate()) {\n @if (edgeTemplate(); as edgeTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"edgeTemplate\"\n [ngTemplateOutletContext]=\"model().context\"\n [ngTemplateOutletInjector]=\"injector\" />\n }\n}\n\n@if (model().edgeLabels.start; as label) {\n @if (model().path().labelPoints?.start; as point) {\n <svg:g edgeLabel [model]=\"label\" [point]=\"point\" [edgeModel]=\"model()\" [htmlTemplate]=\"edgeLabelHtmlTemplate()\" />\n }\n}\n\n@if (model().edgeLabels.center; as label) {\n @if (model().path().labelPoints?.center; as point) {\n <svg:g edgeLabel [model]=\"label\" [point]=\"point\" [edgeModel]=\"model()\" [htmlTemplate]=\"edgeLabelHtmlTemplate()\" />\n }\n}\n\n@if (model().edgeLabels.end; as label) {\n @if (model().path().labelPoints?.end; as point) {\n <svg:g edgeLabel [model]=\"label\" [point]=\"point\" [edgeModel]=\"model()\" [htmlTemplate]=\"edgeLabelHtmlTemplate()\" />\n }\n}\n\n@if (model().sourceHandle() && model().targetHandle()) {\n @if (model().reconnectable === true || model().reconnectable === 'source') {\n <svg:circle\n class=\"reconnect-handle\"\n r=\"10\"\n [attr.cx]=\"model().sourceHandle()!.pointAbsolute().x\"\n [attr.cy]=\"model().sourceHandle()!.pointAbsolute().y\"\n (pointerStart)=\"startReconnection($event, model().targetHandle()!)\" />\n }\n\n @if (model().reconnectable === true || model().reconnectable === 'target') {\n <svg:circle\n class=\"reconnect-handle\"\n r=\"10\"\n [attr.cx]=\"model().targetHandle()!.pointAbsolute().x\"\n [attr.cy]=\"model().targetHandle()!.pointAbsolute().y\"\n (pointerStart)=\"startReconnection($event, model().sourceHandle()!)\" />\n }\n}\n", styles: [".edge{fill:none;stroke-width:2;stroke:#b1b1b7}.edge_selected{stroke-width:2.5;stroke:#0f4c75}.interactive-edge{fill:none;stroke-width:20;stroke:transparent}.reconnect-handle{fill:transparent;cursor:move}\n"] }]
53
- }] });
54
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRnZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdmZsb3ctbGliL3NyYy9saWIvdmZsb3cvY29tcG9uZW50cy9lZGdlL2VkZ2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXZmbG93LWxpYi9zcmMvbGliL3ZmbG93L2NvbXBvbmVudHMvZWRnZS9lZGdlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFlLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ILE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBSW5ELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBRWpHLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDOztBQWN0RSxNQUFNLE9BQU8sYUFBYTtJQVoxQjtRQWFZLGFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDOUIscUJBQWdCLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDNUMsd0JBQW1CLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDbEQsc0JBQWlCLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDOUMseUJBQW9CLEdBQUcsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFFNUQsNkNBQTZDO1FBQ3JDLHlCQUFvQixHQUFHLE1BQU0sQ0FBQyw2QkFBNkIsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRWxGLFVBQUssR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFhLENBQUM7UUFFcEMsaUJBQVksR0FBRyxLQUFLLEVBQTRCLENBQUM7UUFFakQsMEJBQXFCLEdBQUcsS0FBSyxFQUFvQixDQUFDO1FBRS9DLG1CQUFjLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUN2QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDL0MsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLEtBQUssS0FBSyxvQkFBb0IsSUFBSSxNQUFNLENBQUMsS0FBSyxLQUFLLHlCQUF5QixDQUFDO1lBRTNHLE9BQU8sY0FBYyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNuRSxDQUFDLENBQUMsQ0FBQztLQW9CSjtJQWxCUSxNQUFNO1FBQ1gsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxDQUFDO1lBQ2xELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDN0MsQ0FBQztJQUNILENBQUM7SUFFTSxJQUFJO1FBQ1QsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsb0JBQW9CLEVBQUUsRUFBRSxDQUFDO1lBQ3BELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDL0MsQ0FBQztJQUNILENBQUM7SUFFUyxpQkFBaUIsQ0FBQyxLQUFZLEVBQUUsTUFBbUI7UUFDM0Qsc0NBQXNDO1FBQ3RDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUV4QixJQUFJLENBQUMsb0JBQW9CLEVBQUUsaUJBQWlCLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7K0dBeENVLGFBQWE7bUdBQWIsYUFBYSxzbkJDMUIxQiwybEVBeURBLHVRRGpDWSxnQkFBZ0Isb0pBQUUsa0JBQWtCLGtIQUFFLGdCQUFnQjs7NEZBRXJELGFBQWE7a0JBWnpCLFNBQVM7aUNBQ0ksSUFBSSxZQUNOLFNBQVMsbUJBR0YsdUJBQXVCLENBQUMsTUFBTSxRQUN6Qzt3QkFDSixLQUFLLEVBQUUsWUFBWTt3QkFDbkIsb0JBQW9CLEVBQUUseUNBQXlDO3FCQUNoRSxXQUNRLENBQUMsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsZ0JBQWdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBJbmplY3RvciwgVGVtcGxhdGVSZWYsIGNvbXB1dGVkLCBpbmplY3QsIGlucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuaW1wb3J0IHsgRWRnZU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2VkZ2UubW9kZWwnO1xuaW1wb3J0IHsgRWRnZUNvbnRleHQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3RlbXBsYXRlLWNvbnRleHQuaW50ZXJmYWNlJztcbmltcG9ydCB7IFNlbGVjdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9zZWxlY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBGbG93U2V0dGluZ3NTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZmxvdy1zZXR0aW5ncy5zZXJ2aWNlJztcbmltcG9ydCB7IEVkZ2VMYWJlbENvbXBvbmVudCB9IGZyb20gJy4uL2VkZ2UtbGFiZWwvZWRnZS1sYWJlbC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29ubmVjdGlvbkNvbnRyb2xsZXJEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL2Nvbm5lY3Rpb24tY29udHJvbGxlci5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSGFuZGxlTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvaGFuZGxlLm1vZGVsJztcbmltcG9ydCB7IEZsb3dTdGF0dXNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZmxvdy1zdGF0dXMuc2VydmljZSc7XG5pbXBvcnQgeyBFZGdlUmVuZGVyaW5nU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2VkZ2UtcmVuZGVyaW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgUG9pbnRlckRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvcG9pbnRlci5kaXJlY3RpdmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc2VsZWN0b3I6ICdnW2VkZ2VdJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2VkZ2UuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9lZGdlLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBob3N0OiB7XG4gICAgY2xhc3M6ICdzZWxlY3RhYmxlJyxcbiAgICAnW3N0eWxlLnZpc2liaWxpdHldJzogJ2lzUmVjb25uZWN0aW5nKCkgPyBcImhpZGRlblwiIDogXCJ2aXNpYmxlXCInLFxuICB9LFxuICBpbXBvcnRzOiBbTmdUZW1wbGF0ZU91dGxldCwgRWRnZUxhYmVsQ29tcG9uZW50LCBQb2ludGVyRGlyZWN0aXZlXSxcbn0pXG5leHBvcnQgY2xhc3MgRWRnZUNvbXBvbmVudCB7XG4gIHByb3RlY3RlZCBpbmplY3RvciA9IGluamVjdChJbmplY3Rvcik7XG4gIHByaXZhdGUgc2VsZWN0aW9uU2VydmljZSA9IGluamVjdChTZWxlY3Rpb25TZXJ2aWNlKTtcbiAgcHJpdmF0ZSBmbG93U2V0dGluZ3NTZXJ2aWNlID0gaW5qZWN0KEZsb3dTZXR0aW5nc1NlcnZpY2UpO1xuICBwcml2YXRlIGZsb3dTdGF0dXNTZXJ2aWNlID0gaW5qZWN0KEZsb3dTdGF0dXNTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBlZGdlUmVuZGVyaW5nU2VydmljZSA9IGluamVjdChFZGdlUmVuZGVyaW5nU2VydmljZSk7XG5cbiAgLy8gVE9ETyByZW1vdmUgZGVwZW5kZW5jeSBmcm9tIHRoaXMgZGlyZWN0aXZlXG4gIHByaXZhdGUgY29ubmVjdGlvbkNvbnRyb2xsZXIgPSBpbmplY3QoQ29ubmVjdGlvbkNvbnRyb2xsZXJEaXJlY3RpdmUsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG5cbiAgcHVibGljIG1vZGVsID0gaW5wdXQucmVxdWlyZWQ8RWRnZU1vZGVsPigpO1xuXG4gIHB1YmxpYyBlZGdlVGVtcGxhdGUgPSBpbnB1dDxUZW1wbGF0ZVJlZjxFZGdlQ29udGV4dD4+KCk7XG5cbiAgcHVibGljIGVkZ2VMYWJlbEh0bWxUZW1wbGF0ZSA9IGlucHV0PFRlbXBsYXRlUmVmPGFueT4+KCk7XG5cbiAgcHJvdGVjdGVkIGlzUmVjb25uZWN0aW5nID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IHN0YXR1cyA9IHRoaXMuZmxvd1N0YXR1c1NlcnZpY2Uuc3RhdHVzKCk7XG4gICAgY29uc3QgaXNSZWNvbm5lY3RpbmcgPSBzdGF0dXMuc3RhdGUgPT09ICdyZWNvbm5lY3Rpb24tc3RhcnQnIHx8IHN0YXR1cy5zdGF0ZSA9PT0gJ3JlY29ubmVjdGlvbi12YWxpZGF0aW9uJztcblxuICAgIHJldHVybiBpc1JlY29ubmVjdGluZyAmJiBzdGF0dXMucGF5bG9hZC5vbGRFZGdlID09PSB0aGlzLm1vZGVsKCk7XG4gIH0pO1xuXG4gIHB1YmxpYyBzZWxlY3QoKSB7XG4gICAgaWYgKHRoaXMuZmxvd1NldHRpbmdzU2VydmljZS5lbnRpdGllc1NlbGVjdGFibGUoKSkge1xuICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLnNlbGVjdCh0aGlzLm1vZGVsKCkpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBwdWxsKCkge1xuICAgIGlmICh0aGlzLmZsb3dTZXR0aW5nc1NlcnZpY2UuZWxldmF0ZUVkZ2VzT25TZWxlY3QoKSkge1xuICAgICAgdGhpcy5lZGdlUmVuZGVyaW5nU2VydmljZS5wdWxsKHRoaXMubW9kZWwoKSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXJ0UmVjb25uZWN0aW9uKGV2ZW50OiBFdmVudCwgaGFuZGxlOiBIYW5kbGVNb2RlbCkge1xuICAgIC8vIGlnbm9yZSBkcmFnIGJ5IHN0b3BwaW5nIHByb3BhZ2F0aW9uXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICB0aGlzLmNvbm5lY3Rpb25Db250cm9sbGVyPy5zdGFydFJlY29ubmVjdGlvbihoYW5kbGUsIHRoaXMubW9kZWwoKSk7XG4gIH1cbn1cbiIsIkBpZiAobW9kZWwoKS50eXBlID09PSAnZGVmYXVsdCcpIHtcbiAgPHN2ZzpwYXRoXG4gICAgY2xhc3M9XCJlZGdlXCJcbiAgICBbYXR0ci5kXT1cIm1vZGVsKCkucGF0aCgpLnBhdGhcIlxuICAgIFthdHRyLm1hcmtlci1zdGFydF09XCJtb2RlbCgpLm1hcmtlclN0YXJ0VXJsKClcIlxuICAgIFthdHRyLm1hcmtlci1lbmRdPVwibW9kZWwoKS5tYXJrZXJFbmRVcmwoKVwiXG4gICAgW2NsYXNzLmVkZ2Vfc2VsZWN0ZWRdPVwibW9kZWwoKS5zZWxlY3RlZCgpXCIgLz5cblxuICA8c3ZnOnBhdGggY2xhc3M9XCJpbnRlcmFjdGl2ZS1lZGdlXCIgW2F0dHIuZF09XCJtb2RlbCgpLnBhdGgoKS5wYXRoXCIgKGNsaWNrKT1cInNlbGVjdCgpOyBwdWxsKClcIiAvPlxufVxuXG5AaWYgKG1vZGVsKCkudHlwZSA9PT0gJ3RlbXBsYXRlJyAmJiBlZGdlVGVtcGxhdGUoKSkge1xuICBAaWYgKGVkZ2VUZW1wbGF0ZSgpOyBhcyBlZGdlVGVtcGxhdGUpIHtcbiAgICA8bmctY29udGFpbmVyXG4gICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJlZGdlVGVtcGxhdGVcIlxuICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIm1vZGVsKCkuY29udGV4dFwiXG4gICAgICBbbmdUZW1wbGF0ZU91dGxldEluamVjdG9yXT1cImluamVjdG9yXCIgLz5cbiAgfVxufVxuXG5AaWYgKG1vZGVsKCkuZWRnZUxhYmVscy5zdGFydDsgYXMgbGFiZWwpIHtcbiAgQGlmIChtb2RlbCgpLnBhdGgoKS5sYWJlbFBvaW50cz8uc3RhcnQ7IGFzIHBvaW50KSB7XG4gICAgPHN2ZzpnIGVkZ2VMYWJlbCBbbW9kZWxdPVwibGFiZWxcIiBbcG9pbnRdPVwicG9pbnRcIiBbZWRnZU1vZGVsXT1cIm1vZGVsKClcIiBbaHRtbFRlbXBsYXRlXT1cImVkZ2VMYWJlbEh0bWxUZW1wbGF0ZSgpXCIgLz5cbiAgfVxufVxuXG5AaWYgKG1vZGVsKCkuZWRnZUxhYmVscy5jZW50ZXI7IGFzIGxhYmVsKSB7XG4gIEBpZiAobW9kZWwoKS5wYXRoKCkubGFiZWxQb2ludHM/LmNlbnRlcjsgYXMgcG9pbnQpIHtcbiAgICA8c3ZnOmcgZWRnZUxhYmVsIFttb2RlbF09XCJsYWJlbFwiIFtwb2ludF09XCJwb2ludFwiIFtlZGdlTW9kZWxdPVwibW9kZWwoKVwiIFtodG1sVGVtcGxhdGVdPVwiZWRnZUxhYmVsSHRtbFRlbXBsYXRlKClcIiAvPlxuICB9XG59XG5cbkBpZiAobW9kZWwoKS5lZGdlTGFiZWxzLmVuZDsgYXMgbGFiZWwpIHtcbiAgQGlmIChtb2RlbCgpLnBhdGgoKS5sYWJlbFBvaW50cz8uZW5kOyBhcyBwb2ludCkge1xuICAgIDxzdmc6ZyBlZGdlTGFiZWwgW21vZGVsXT1cImxhYmVsXCIgW3BvaW50XT1cInBvaW50XCIgW2VkZ2VNb2RlbF09XCJtb2RlbCgpXCIgW2h0bWxUZW1wbGF0ZV09XCJlZGdlTGFiZWxIdG1sVGVtcGxhdGUoKVwiIC8+XG4gIH1cbn1cblxuQGlmIChtb2RlbCgpLnNvdXJjZUhhbmRsZSgpICYmIG1vZGVsKCkudGFyZ2V0SGFuZGxlKCkpIHtcbiAgQGlmIChtb2RlbCgpLnJlY29ubmVjdGFibGUgPT09IHRydWUgfHwgbW9kZWwoKS5yZWNvbm5lY3RhYmxlID09PSAnc291cmNlJykge1xuICAgIDxzdmc6Y2lyY2xlXG4gICAgICBjbGFzcz1cInJlY29ubmVjdC1oYW5kbGVcIlxuICAgICAgcj1cIjEwXCJcbiAgICAgIFthdHRyLmN4XT1cIm1vZGVsKCkuc291cmNlSGFuZGxlKCkhLnBvaW50QWJzb2x1dGUoKS54XCJcbiAgICAgIFthdHRyLmN5XT1cIm1vZGVsKCkuc291cmNlSGFuZGxlKCkhLnBvaW50QWJzb2x1dGUoKS55XCJcbiAgICAgIChwb2ludGVyU3RhcnQpPVwic3RhcnRSZWNvbm5lY3Rpb24oJGV2ZW50LCBtb2RlbCgpLnRhcmdldEhhbmRsZSgpISlcIiAvPlxuICB9XG5cbiAgQGlmIChtb2RlbCgpLnJlY29ubmVjdGFibGUgPT09IHRydWUgfHwgbW9kZWwoKS5yZWNvbm5lY3RhYmxlID09PSAndGFyZ2V0Jykge1xuICAgIDxzdmc6Y2lyY2xlXG4gICAgICBjbGFzcz1cInJlY29ubmVjdC1oYW5kbGVcIlxuICAgICAgcj1cIjEwXCJcbiAgICAgIFthdHRyLmN4XT1cIm1vZGVsKCkudGFyZ2V0SGFuZGxlKCkhLnBvaW50QWJzb2x1dGUoKS54XCJcbiAgICAgIFthdHRyLmN5XT1cIm1vZGVsKCkudGFyZ2V0SGFuZGxlKCkhLnBvaW50QWJzb2x1dGUoKS55XCJcbiAgICAgIChwb2ludGVyU3RhcnQpPVwic3RhcnRSZWNvbm5lY3Rpb24oJGV2ZW50LCBtb2RlbCgpLnNvdXJjZUhhbmRsZSgpISlcIiAvPlxuICB9XG59XG4iXX0=
@@ -1,76 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, DestroyRef, NgZone, computed, inject, input, viewChild, } from '@angular/core';
2
- import { NgTemplateOutlet } from '@angular/common';
3
- import { resizable } from '../../utils/resizable';
4
- import { startWith, tap } from 'rxjs';
5
- import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
6
- import { MAGIC_NUMBER_TO_FIX_GLITCH_IN_CHROME } from '../../constants/magic-number-to-fix-glitch-in-chrome.constant';
7
- import { FlowSettingsService } from '../../services/flow-settings.service';
8
- import * as i0 from "@angular/core";
9
- export class EdgeLabelComponent {
10
- constructor() {
11
- this.zone = inject(NgZone);
12
- this.destroyRef = inject(DestroyRef);
13
- this.settingsService = inject(FlowSettingsService);
14
- // TODO: too many inputs
15
- this.model = input.required();
16
- this.edgeModel = input.required();
17
- this.point = input({ x: 0, y: 0 });
18
- this.htmlTemplate = input();
19
- this.edgeLabelWrapperRef = viewChild.required('edgeLabelWrapper');
20
- /**
21
- * Centered point of label
22
- *
23
- * TODO: maybe put it into EdgeLabelModel
24
- */
25
- this.edgeLabelPoint = computed(() => {
26
- const point = this.point();
27
- const { width, height } = this.model().size();
28
- return {
29
- x: point.x - width / 2,
30
- y: point.y - height / 2,
31
- };
32
- });
33
- this.edgeLabelStyle = computed(() => {
34
- const label = this.model().edgeLabel;
35
- if (label.type === 'default' && label.style) {
36
- const flowBackground = this.settingsService.background();
37
- let color = 'transparent';
38
- if (flowBackground.type === 'dots') {
39
- color = flowBackground.backgroundColor ?? '#fff';
40
- }
41
- if (flowBackground.type === 'solid') {
42
- color = flowBackground.color;
43
- }
44
- label.style.backgroundColor = label.style.backgroundColor ?? color;
45
- return label.style;
46
- }
47
- return null;
48
- });
49
- }
50
- ngAfterViewInit() {
51
- const labelElement = this.edgeLabelWrapperRef().nativeElement;
52
- resizable([labelElement], this.zone)
53
- .pipe(startWith(null), tap(() => {
54
- const width = labelElement.clientWidth + MAGIC_NUMBER_TO_FIX_GLITCH_IN_CHROME;
55
- const height = labelElement.clientHeight + MAGIC_NUMBER_TO_FIX_GLITCH_IN_CHROME;
56
- this.model().size.set({ width, height });
57
- }), takeUntilDestroyed(this.destroyRef))
58
- .subscribe();
59
- }
60
- // TODO: move to model with Contextable interface
61
- getLabelContext() {
62
- return {
63
- $implicit: {
64
- edge: this.edgeModel().edge,
65
- label: this.model().edgeLabel,
66
- },
67
- };
68
- }
69
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EdgeLabelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
70
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: EdgeLabelComponent, isStandalone: true, selector: "g[edgeLabel]", inputs: { model: { classPropertyName: "model", publicName: "model", isSignal: true, isRequired: true, transformFunction: null }, edgeModel: { classPropertyName: "edgeModel", publicName: "edgeModel", isSignal: true, isRequired: true, transformFunction: null }, point: { classPropertyName: "point", publicName: "point", isSignal: true, isRequired: false, transformFunction: null }, htmlTemplate: { classPropertyName: "htmlTemplate", publicName: "htmlTemplate", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "edgeLabelWrapperRef", first: true, predicate: ["edgeLabelWrapper"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (model(); as model) {\n @if (model.edgeLabel.type === 'html-template' && htmlTemplate()) {\n @if (htmlTemplate(); as htmlTemplate) {\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 <div #edgeLabelWrapper class=\"edge-label-wrapper\">\n <ng-container *ngTemplateOutlet=\"htmlTemplate; context: getLabelContext()\" />\n </div>\n </svg:foreignObject>\n }\n }\n\n @if (model.edgeLabel.type === 'default') {\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 <div #edgeLabelWrapper class=\"edge-label-wrapper\" [style]=\"edgeLabelStyle()\">\n {{ model.edgeLabel.text }}\n </div>\n </svg:foreignObject>\n }\n}\n", styles: [".edge-label-wrapper{width:max-content;margin-top:1px;margin-left:1px}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
71
- }
72
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EdgeLabelComponent, decorators: [{
73
- type: Component,
74
- args: [{ standalone: true, selector: 'g[edgeLabel]', changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgTemplateOutlet], template: "@if (model(); as model) {\n @if (model.edgeLabel.type === 'html-template' && htmlTemplate()) {\n @if (htmlTemplate(); as htmlTemplate) {\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 <div #edgeLabelWrapper class=\"edge-label-wrapper\">\n <ng-container *ngTemplateOutlet=\"htmlTemplate; context: getLabelContext()\" />\n </div>\n </svg:foreignObject>\n }\n }\n\n @if (model.edgeLabel.type === 'default') {\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 <div #edgeLabelWrapper class=\"edge-label-wrapper\" [style]=\"edgeLabelStyle()\">\n {{ model.edgeLabel.text }}\n </div>\n </svg:foreignObject>\n }\n}\n", styles: [".edge-label-wrapper{width:max-content;margin-top:1px;margin-left:1px}\n"] }]
75
- }] });
76
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRnZS1sYWJlbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdmZsb3ctbGliL3NyYy9saWIvdmZsb3cvY29tcG9uZW50cy9lZGdlLWxhYmVsL2VkZ2UtbGFiZWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXZmbG93LWxpYi9zcmMvbGliL3ZmbG93L2NvbXBvbmVudHMvZWRnZS1sYWJlbC9lZGdlLWxhYmVsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFVBQVUsRUFFVixNQUFNLEVBRU4sUUFBUSxFQUNSLE1BQU0sRUFDTixLQUFLLEVBQ0wsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBR3ZCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsb0NBQW9DLEVBQUUsTUFBTSwrREFBK0QsQ0FBQztBQUNySCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQzs7QUF5QjNFLE1BQU0sT0FBTyxrQkFBa0I7SUFyQi9CO1FBc0JVLFNBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEIsZUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNoQyxvQkFBZSxHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBRXRELHdCQUF3QjtRQUNqQixVQUFLLEdBQUcsS0FBSyxDQUFDLFFBQVEs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a0JBQWtCO21HQUFsQixrQkFBa0IsNHRCQzdDL0IsczhCQTJCQSxpSURnQlksZ0JBQWdCOzs0RkFFZixrQkFBa0I7a0JBckI5QixTQUFTO2lDQUNJLElBQUksWUFDTixjQUFjLG1CQWdCUCx1QkFBdUIsQ0FBQyxNQUFNLFdBQ3RDLENBQUMsZ0JBQWdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBEZXN0cm95UmVmLFxuICBFbGVtZW50UmVmLFxuICBOZ1pvbmUsXG4gIFRlbXBsYXRlUmVmLFxuICBjb21wdXRlZCxcbiAgaW5qZWN0LFxuICBpbnB1dCxcbiAgdmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEVkZ2VMYWJlbE1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2VkZ2UtbGFiZWwubW9kZWwnO1xuaW1wb3J0IHsgRWRnZU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2VkZ2UubW9kZWwnO1xuaW1wb3J0IHsgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyByZXNpemFibGUgfSBmcm9tICcuLi8uLi91dGlscy9yZXNpemFibGUnO1xuaW1wb3J0IHsgc3RhcnRXaXRoLCB0YXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IE1BR0lDX05VTUJFUl9UT19GSVhfR0xJVENIX0lOX0NIUk9NRSB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy9tYWdpYy1udW1iZXItdG8tZml4LWdsaXRjaC1pbi1jaHJvbWUuY29uc3RhbnQnO1xuaW1wb3J0IHsgRmxvd1NldHRpbmdzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2Zsb3ctc2V0dGluZ3Muc2VydmljZSc7XG5pbXBvcnQgeyBIdG1sRWRnZUxhYmVsQ29udGV4dCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvdGVtcGxhdGUtY29udGV4dC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSHRtbFRlbXBsYXRlRWRnZUxhYmVsIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9lZGdlLWxhYmVsLmludGVyZmFjZSc7XG5cbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzZWxlY3RvcjogJ2dbZWRnZUxhYmVsXScsXG4gIHRlbXBsYXRlVXJsOiAnLi9lZGdlLWxhYmVsLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVzOiBbXG4gICAgYFxuICAgICAgLmVkZ2UtbGFiZWwtd3JhcHBlciB7XG4gICAgICAgIHdpZHRoOiBtYXgtY29udGVudDtcblxuICAgICAgICAvKlxuICAgICAgICB0aGlzIGlzIGEgZml4IGZvciBidWcgaW4gY2hyb21lLCBmb3Igc29tZSByZWFzb24gaWYgdGhlIGRpdiBmdWxseSBtYXRjaGVzIHRoZSBzaXplXG4gICAgICAgIG9mIGZvcmVpZ25PYmplY3QgdGhlcmUgYXJlIG9jY3VycyBzb21lIHZpc3VhbCBhcnRpZmFjdHMgYXJvdW5kIHRoaXMgZGl2XG4gICAgICAgKi9cbiAgICAgICAgbWFyZ2luLXRvcDogMXB4O1xuICAgICAgICBtYXJnaW4tbGVmdDogMXB4O1xuICAgICAgfVxuICAgIGAsXG4gIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBpbXBvcnRzOiBbTmdUZW1wbGF0ZU91dGxldF0sXG59KVxuZXhwb3J0IGNsYXNzIEVkZ2VMYWJlbENvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xuICBwcml2YXRlIHpvbmUgPSBpbmplY3QoTmdab25lKTtcbiAgcHJpdmF0ZSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICBwcml2YXRlIHNldHRpbmdzU2VydmljZSA9IGluamVjdChGbG93U2V0dGluZ3NTZXJ2aWNlKTtcblxuICAvLyBUT0RPOiB0b28gbWFueSBpbnB1dHNcbiAgcHVibGljIG1vZGVsID0gaW5wdXQucmVxdWlyZWQ8RWRnZUxhYmVsTW9kZWw+KCk7XG5cbiAgcHVibGljIGVkZ2VNb2RlbCA9IGlucHV0LnJlcXVpcmVkPEVkZ2VNb2RlbD4oKTtcblxuICBwdWJsaWMgcG9pbnQgPSBpbnB1dCh7IHg6IDAsIHk6IDAgfSk7XG5cbiAgcHVibGljIGh0bWxUZW1wbGF0ZSA9IGlucHV0PFRlbXBsYXRlUmVmPGFueT4+KCk7XG5cbiAgcHVibGljIGVkZ2VMYWJlbFdyYXBwZXJSZWYgPSB2aWV3Q2hpbGQucmVxdWlyZWQ8RWxlbWVudFJlZjxFbGVtZW50Pj4oJ2VkZ2VMYWJlbFdyYXBwZXInKTtcblxuICAvKipcbiAgICogQ2VudGVyZWQgcG9pbnQgb2YgbGFiZWxcbiAgICpcbiAgICogVE9ETzogbWF5YmUgcHV0IGl0IGludG8gRWRnZUxhYmVsTW9kZWxcbiAgICovXG4gIHByb3RlY3RlZCBlZGdlTGFiZWxQb2ludCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBwb2ludCA9IHRoaXMucG9pbnQoKTtcblxuICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gdGhpcy5tb2RlbCgpLnNpemUoKTtcblxuICAgIHJldHVybiB7XG4gICAgICB4OiBwb2ludC54IC0gd2lkdGggLyAyLFxuICAgICAgeTogcG9pbnQueSAtIGhlaWdodCAvIDIsXG4gICAgfTtcbiAgfSk7XG5cbiAgcHJvdGVjdGVkIGVkZ2VMYWJlbFN0eWxlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGxhYmVsID0gdGhpcy5tb2RlbCgpLmVkZ2VMYWJlbDtcblxuICAgIGlmIChsYWJlbC50eXBlID09PSAnZGVmYXVsdCcgJiYgbGFiZWwuc3R5bGUpIHtcbiAgICAgIGNvbnN0IGZsb3dCYWNrZ3JvdW5kID0gdGhpcy5zZXR0aW5nc1NlcnZpY2UuYmFja2dyb3VuZCgpO1xuXG4gICAgICBsZXQgY29sb3IgPSAndHJhbnNwYXJlbnQnO1xuXG4gICAgICBpZiAoZmxvd0JhY2tncm91bmQudHlwZSA9PT0gJ2RvdHMnKSB7XG4gICAgICAgIGNvbG9yID0gZmxvd0JhY2tncm91bmQuYmFja2dyb3VuZENvbG9yID8/ICcjZmZmJztcbiAgICAgIH1cblxuICAgICAgaWYgKGZsb3dCYWNrZ3JvdW5kLnR5cGUgPT09ICdzb2xpZCcpIHtcbiAgICAgICAgY29sb3IgPSBmbG93QmFja2dyb3VuZC5jb2xvcjtcbiAgICAgIH1cblxuICAgICAgbGFiZWwuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gbGFiZWwuc3R5bGUuYmFja2dyb3VuZENvbG9yID8/IGNvbG9yO1xuXG4gICAgICByZXR1cm4gbGFiZWwuc3R5bGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH0pO1xuXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgY29uc3QgbGFiZWxFbGVtZW50ID0gdGhpcy5lZGdlTGFiZWxXcmFwcGVyUmVmKCkubmF0aXZlRWxlbWVudDtcblxuICAgIHJlc2l6YWJsZShbbGFiZWxFbGVtZW50XSwgdGhpcy56b25lKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHN0YXJ0V2l0aChudWxsKSxcbiAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICBjb25zdCB3aWR0aCA9IGxhYmVsRWxlbWVudC5jbGllbnRXaWR0aCArIE1BR0lDX05VTUJFUl9UT19GSVhfR0xJVENIX0lOX0NIUk9NRTtcbiAgICAgICAgICBjb25zdCBoZWlnaHQgPSBsYWJlbEVsZW1lbnQuY2xpZW50SGVpZ2h0ICsgTUFHSUNfTlVNQkVSX1RPX0ZJWF9HTElUQ0hfSU5fQ0hST01FO1xuXG4gICAgICAgICAgdGhpcy5tb2RlbCgpLnNpemUuc2V0KHsgd2lkdGgsIGhlaWdodCB9KTtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgLy8gVE9ETzogbW92ZSB0byBtb2RlbCB3aXRoIENvbnRleHRhYmxlIGludGVyZmFjZVxuICBwcm90ZWN0ZWQgZ2V0TGFiZWxDb250ZXh0KCk6IEh0bWxFZGdlTGFiZWxDb250ZXh0IHtcbiAgICByZXR1cm4ge1xuICAgICAgJGltcGxpY2l0OiB7XG4gICAgICAgIGVkZ2U6IHRoaXMuZWRnZU1vZGVsKCkuZWRnZSxcbiAgICAgICAgbGFiZWw6IHRoaXMubW9kZWwoKS5lZGdlTGFiZWwgYXMgSHRtbFRlbXBsYXRlRWRnZUxhYmVsLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG59XG4iLCJAaWYgKG1vZGVsKCk7IGFzIG1vZGVsKSB7XG4gIEBpZiAobW9kZWwuZWRnZUxhYmVsLnR5cGUgPT09ICdodG1sLXRlbXBsYXRlJyAmJiBodG1sVGVtcGxhdGUoKSkge1xuICAgIEBpZiAoaHRtbFRlbXBsYXRlKCk7IGFzIGh0bWxUZW1wbGF0ZSkge1xuICAgICAgPHN2Zzpmb3JlaWduT2JqZWN0XG4gICAgICAgIFthdHRyLnhdPVwiZWRnZUxhYmVsUG9pbnQoKS54XCJcbiAgICAgICAgW2F0dHIueV09XCJlZGdlTGFiZWxQb2ludCgpLnlcIlxuICAgICAgICBbYXR0ci53aWR0aF09XCJtb2RlbC5zaXplKCkud2lkdGhcIlxuICAgICAgICBbYXR0ci5oZWlnaHRdPVwibW9kZWwuc2l6ZSgpLmhlaWdodFwiPlxuICAgICAgICA8ZGl2ICNlZGdlTGFiZWxXcmFwcGVyIGNsYXNzPVwiZWRnZS1sYWJlbC13cmFwcGVyXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImh0bWxUZW1wbGF0ZTsgY29udGV4dDogZ2V0TGFiZWxDb250ZXh0KClcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvc3ZnOmZvcmVpZ25PYmplY3Q+XG4gICAgfVxuICB9XG5cbiAgQGlmIChtb2RlbC5lZGdlTGFiZWwudHlwZSA9PT0gJ2RlZmF1bHQnKSB7XG4gICAgPHN2Zzpmb3JlaWduT2JqZWN0XG4gICAgICBbYXR0ci54XT1cImVkZ2VMYWJlbFBvaW50KCkueFwiXG4gICAgICBbYXR0ci55XT1cImVkZ2VMYWJlbFBvaW50KCkueVwiXG4gICAgICBbYXR0ci53aWR0aF09XCJtb2RlbC5zaXplKCkud2lkdGhcIlxuICAgICAgW2F0dHIuaGVpZ2h0XT1cIm1vZGVsLnNpemUoKS5oZWlnaHRcIj5cbiAgICAgIDxkaXYgI2VkZ2VMYWJlbFdyYXBwZXIgY2xhc3M9XCJlZGdlLWxhYmVsLXdyYXBwZXJcIiBbc3R5bGVdPVwiZWRnZUxhYmVsU3R5bGUoKVwiPlxuICAgICAgICB7eyBtb2RlbC5lZGdlTGFiZWwudGV4dCB9fVxuICAgICAgPC9kaXY+XG4gICAgPC9zdmc6Zm9yZWlnbk9iamVjdD5cbiAgfVxufVxuIl19
@@ -1,107 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, ElementRef, Injector, computed, effect, inject, input, } from '@angular/core';
2
- import { DraggableService } from '../../services/draggable.service';
3
- import { FlowStatusService } from '../../services/flow-status.service';
4
- import { HandleService } from '../../services/handle.service';
5
- import { NodeRenderingService } from '../../services/node-rendering.service';
6
- import { FlowSettingsService } from '../../services/flow-settings.service';
7
- import { SelectionService } from '../../services/selection.service';
8
- import { ConnectionControllerDirective } from '../../directives/connection-controller.directive';
9
- import { NodeAccessorService } from '../../services/node-accessor.service';
10
- import { OverlaysService } from '../../services/overlays.service';
11
- import { HandleSizeControllerDirective } from '../../directives/handle-size-controller.directive';
12
- import { NgTemplateOutlet, NgComponentOutlet, AsyncPipe } from '@angular/common';
13
- import { DefaultNodeComponent } from '../default-node/default-node.component';
14
- import { PointerDirective } from '../../directives/pointer.directive';
15
- // TODO: fix loading of these by @defer (should work in Angular 18+)
16
- // public components that uses in default node (loaded by defer)
17
- import { ResizableComponent } from '../../public-components/resizable/resizable.component';
18
- import { HandleComponent } from '../../public-components/handle/handle.component';
19
- import { NodeHandlesControllerDirective } from '../../directives/node-handles-controller.directive';
20
- import { NodeResizeControllerDirective } from '../../directives/node-resize-controller.directive';
21
- import * as i0 from "@angular/core";
22
- export class NodeComponent {
23
- constructor() {
24
- this.injector = inject(Injector);
25
- this.handleService = inject(HandleService);
26
- this.draggableService = inject(DraggableService);
27
- this.flowStatusService = inject(FlowStatusService);
28
- this.nodeRenderingService = inject(NodeRenderingService);
29
- this.flowSettingsService = inject(FlowSettingsService);
30
- this.selectionService = inject(SelectionService);
31
- this.hostRef = inject(ElementRef);
32
- this.nodeAccessor = inject(NodeAccessorService);
33
- this.overlaysService = inject(OverlaysService);
34
- // TODO remove dependency from this directive
35
- this.connectionController = inject(ConnectionControllerDirective, { optional: true });
36
- this.model = input.required();
37
- this.nodeTemplate = input();
38
- this.nodeSvgTemplate = input();
39
- this.groupNodeTemplate = input();
40
- this.showMagnet = computed(() => this.flowStatusService.status().state === 'connection-start' ||
41
- this.flowStatusService.status().state === 'connection-validation' ||
42
- this.flowStatusService.status().state === 'reconnection-start' ||
43
- this.flowStatusService.status().state === 'reconnection-validation');
44
- this.toolbars = computed(() => this.overlaysService.nodeToolbarsMap().get(this.model()));
45
- }
46
- ngOnInit() {
47
- this.model().isVisible.set(true);
48
- this.nodeAccessor.model.set(this.model());
49
- this.handleService.node.set(this.model());
50
- effect(() => {
51
- if (this.model().draggable()) {
52
- this.draggableService.enable(this.hostRef.nativeElement, this.model());
53
- }
54
- else {
55
- this.draggableService.disable(this.hostRef.nativeElement);
56
- }
57
- }, { injector: this.injector });
58
- }
59
- ngOnDestroy() {
60
- this.model().isVisible.set(false);
61
- this.draggableService.destroy(this.hostRef.nativeElement);
62
- }
63
- startConnection(event, handle) {
64
- // ignore drag by stopping propagation
65
- event.stopPropagation();
66
- this.connectionController?.startConnection(handle);
67
- }
68
- validateConnection(handle) {
69
- this.connectionController?.validateConnection(handle);
70
- }
71
- resetValidateConnection(targetHandle) {
72
- this.connectionController?.resetValidateConnection(targetHandle);
73
- }
74
- endConnection() {
75
- this.connectionController?.endConnection();
76
- }
77
- pullNode() {
78
- if (this.flowSettingsService.elevateNodesOnSelect()) {
79
- this.nodeRenderingService.pullNode(this.model());
80
- }
81
- }
82
- selectNode() {
83
- if (this.flowSettingsService.entitiesSelectable()) {
84
- this.selectionService.select(this.model());
85
- }
86
- }
87
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NodeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
88
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: NodeComponent, isStandalone: true, selector: "g[node]", inputs: { model: { classPropertyName: "model", publicName: "model", isSignal: true, isRequired: true, transformFunction: null }, nodeTemplate: { classPropertyName: "nodeTemplate", publicName: "nodeTemplate", isSignal: true, isRequired: false, transformFunction: null }, nodeSvgTemplate: { classPropertyName: "nodeSvgTemplate", publicName: "nodeSvgTemplate", isSignal: true, isRequired: false, transformFunction: null }, groupNodeTemplate: { classPropertyName: "groupNodeTemplate", publicName: "groupNodeTemplate", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "vflow-node" }, providers: [HandleService, NodeAccessorService], ngImport: i0, template: "<!-- Default node -->\n@if (model().rawNode.type === 'default') {\n <svg:foreignObject\n class=\"selectable\"\n [attr.width]=\"model().foWidth()\"\n [attr.height]=\"model().foHeight()\"\n (click)=\"pullNode(); selectNode()\">\n <default-node\n nodeHandlesController\n [selected]=\"model().selected()\"\n [style.width]=\"model().styleWidth()\"\n [style.height]=\"model().styleHeight()\"\n [style.max-width]=\"model().styleWidth()\"\n [style.max-height]=\"model().styleHeight()\">\n <div [outerHTML]=\"model().text()\"></div>\n\n <handle type=\"source\" position=\"right\" />\n <handle type=\"target\" position=\"left\" />\n </default-node>\n </svg:foreignObject>\n}\n\n<!-- HTML Template node -->\n@if (model().rawNode.type === 'html-template' && nodeTemplate()) {\n <svg:foreignObject\n class=\"selectable\"\n [attr.width]=\"model().foWidth()\"\n [attr.height]=\"model().foHeight()\"\n (click)=\"pullNode()\">\n <div\n nodeHandlesController\n nodeResizeController\n class=\"wrapper\"\n [style.width]=\"model().styleWidth()\"\n [style.height]=\"model().styleHeight()\">\n <ng-container\n [ngTemplateOutlet]=\"nodeTemplate() ?? null\"\n [ngTemplateOutletContext]=\"model().context\"\n [ngTemplateOutletInjector]=\"injector\" />\n </div>\n </svg:foreignObject>\n}\n\n<!-- SVG Template node -->\n@if (model().rawNode.type === 'svg-template' && nodeSvgTemplate()) {\n <svg:g class=\"selectable\" nodeHandlesController (click)=\"pullNode()\">\n <ng-container\n [ngTemplateOutlet]=\"nodeSvgTemplate() ?? null\"\n [ngTemplateOutletContext]=\"model().context\"\n [ngTemplateOutletInjector]=\"injector\" />\n </svg:g>\n}\n\n<!-- Component node -->\n@if (model().isComponentType) {\n @if (model().componentInstance$ | async; as component) {\n <svg:foreignObject\n class=\"selectable\"\n [attr.width]=\"model().foWidth()\"\n [attr.height]=\"model().foHeight()\"\n (click)=\"pullNode()\">\n <div\n nodeHandlesController\n nodeResizeController\n class=\"wrapper\"\n [style.width]=\"model().styleWidth()\"\n [style.height]=\"model().styleHeight()\">\n <ng-container\n [ngComponentOutlet]=\"$any(component)\"\n [ngComponentOutletInputs]=\"model().componentTypeInputs\"\n [ngComponentOutletInjector]=\"injector\" />\n </div>\n </svg:foreignObject>\n }\n}\n\n<!-- Default group node -->\n@if (model().rawNode.type === 'default-group') {\n <svg:rect\n class=\"default-group-node\"\n rx=\"5\"\n ry=\"5\"\n [resizable]=\"model().resizable()\"\n [gap]=\"3\"\n [resizerColor]=\"model().color()\"\n [class.default-group-node_selected]=\"model().selected()\"\n [attr.width]=\"model().size().width\"\n [attr.height]=\"model().size().height\"\n [style.stroke]=\"model().color()\"\n [style.fill]=\"model().color()\"\n (click)=\"pullNode(); selectNode()\" />\n}\n\n<!-- Template group node -->\n@if (model().rawNode.type === 'template-group' && groupNodeTemplate()) {\n <svg:g class=\"selectable\" nodeHandlesController (click)=\"pullNode()\">\n <ng-container\n [ngTemplateOutlet]=\"groupNodeTemplate() ?? null\"\n [ngTemplateOutletContext]=\"model().context\"\n [ngTemplateOutletInjector]=\"injector\" />\n </svg:g>\n}\n\n<!-- Resizer -->\n@if (model().resizerTemplate(); as template) {\n @if (model().resizable()) {\n <ng-template [ngTemplateOutlet]=\"template\" />\n }\n}\n\n<!-- Handles -->\n@for (handle of model().handles(); track handle) {\n @if (handle.template === undefined) {\n <svg:circle\n class=\"default-handle\"\n r=\"5\"\n [attr.cx]=\"handle.hostOffset().x\"\n [attr.cy]=\"handle.hostOffset().y\"\n [attr.stroke-width]=\"handle.strokeWidth\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection()\" />\n }\n\n @if (handle.template === null) {\n <svg:g\n [handleSizeController]=\"handle\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection()\" />\n }\n\n @if (handle.template) {\n <svg:g\n [handleSizeController]=\"handle\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection()\">\n <ng-container *ngTemplateOutlet=\"handle.template; context: handle.templateContext\" />\n </svg:g>\n }\n\n @if (showMagnet()) {\n <svg:circle\n class=\"magnet\"\n [attr.r]=\"model().magnetRadius\"\n [attr.cx]=\"handle.hostOffset().x\"\n [attr.cy]=\"handle.hostOffset().y\"\n (pointerEnd)=\"endConnection(); resetValidateConnection(handle)\"\n (pointerOver)=\"validateConnection(handle)\"\n (pointerOut)=\"resetValidateConnection(handle)\" />\n }\n}\n\n<!-- Toolbar -->\n@for (toolbar of toolbars(); track toolbar) {\n <svg:foreignObject\n [attr.width]=\"toolbar.size().width\"\n [attr.height]=\"toolbar.size().height\"\n [attr.transform]=\"toolbar.transform()\">\n <ng-container [ngTemplateOutlet]=\"toolbar.template()\" />\n </svg:foreignObject>\n}\n", styles: [".magnet{opacity:0}.wrapper{display:table-cell}.default-group-node{stroke-width:1.5px;fill-opacity:.05}.default-group-node_selected{stroke-width:2px}.default-handle{stroke:#fff;fill:#1b262c}\n"], dependencies: [{ kind: "directive", type: PointerDirective, selector: "[pointerStart], [pointerEnd], [pointerOver], [pointerOut]", outputs: ["pointerOver", "pointerOut", "pointerStart", "pointerEnd"] }, { kind: "component", type: DefaultNodeComponent, selector: "default-node", inputs: ["selected"] }, { kind: "component", type: HandleComponent, selector: "handle", inputs: ["position", "type", "id", "template", "offsetX", "offsetY"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "component", type: ResizableComponent, selector: "[resizable]", inputs: ["resizable", "resizerColor", "gap"] }, { kind: "directive", type: HandleSizeControllerDirective, selector: "[handleSizeController]", inputs: ["handleSizeController"] }, { kind: "directive", type: NodeHandlesControllerDirective, selector: "[nodeHandlesController]" }, { kind: "directive", type: NodeResizeControllerDirective, selector: "[nodeResizeController]" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
89
- }
90
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NodeComponent, decorators: [{
91
- type: Component,
92
- args: [{ standalone: true, selector: 'g[node]', changeDetection: ChangeDetectionStrategy.OnPush, providers: [HandleService, NodeAccessorService], host: {
93
- class: 'vflow-node',
94
- }, imports: [
95
- PointerDirective,
96
- DefaultNodeComponent,
97
- HandleComponent,
98
- NgTemplateOutlet,
99
- NgComponentOutlet,
100
- ResizableComponent,
101
- HandleSizeControllerDirective,
102
- NodeHandlesControllerDirective,
103
- NodeResizeControllerDirective,
104
- AsyncPipe,
105
- ], template: "<!-- Default node -->\n@if (model().rawNode.type === 'default') {\n <svg:foreignObject\n class=\"selectable\"\n [attr.width]=\"model().foWidth()\"\n [attr.height]=\"model().foHeight()\"\n (click)=\"pullNode(); selectNode()\">\n <default-node\n nodeHandlesController\n [selected]=\"model().selected()\"\n [style.width]=\"model().styleWidth()\"\n [style.height]=\"model().styleHeight()\"\n [style.max-width]=\"model().styleWidth()\"\n [style.max-height]=\"model().styleHeight()\">\n <div [outerHTML]=\"model().text()\"></div>\n\n <handle type=\"source\" position=\"right\" />\n <handle type=\"target\" position=\"left\" />\n </default-node>\n </svg:foreignObject>\n}\n\n<!-- HTML Template node -->\n@if (model().rawNode.type === 'html-template' && nodeTemplate()) {\n <svg:foreignObject\n class=\"selectable\"\n [attr.width]=\"model().foWidth()\"\n [attr.height]=\"model().foHeight()\"\n (click)=\"pullNode()\">\n <div\n nodeHandlesController\n nodeResizeController\n class=\"wrapper\"\n [style.width]=\"model().styleWidth()\"\n [style.height]=\"model().styleHeight()\">\n <ng-container\n [ngTemplateOutlet]=\"nodeTemplate() ?? null\"\n [ngTemplateOutletContext]=\"model().context\"\n [ngTemplateOutletInjector]=\"injector\" />\n </div>\n </svg:foreignObject>\n}\n\n<!-- SVG Template node -->\n@if (model().rawNode.type === 'svg-template' && nodeSvgTemplate()) {\n <svg:g class=\"selectable\" nodeHandlesController (click)=\"pullNode()\">\n <ng-container\n [ngTemplateOutlet]=\"nodeSvgTemplate() ?? null\"\n [ngTemplateOutletContext]=\"model().context\"\n [ngTemplateOutletInjector]=\"injector\" />\n </svg:g>\n}\n\n<!-- Component node -->\n@if (model().isComponentType) {\n @if (model().componentInstance$ | async; as component) {\n <svg:foreignObject\n class=\"selectable\"\n [attr.width]=\"model().foWidth()\"\n [attr.height]=\"model().foHeight()\"\n (click)=\"pullNode()\">\n <div\n nodeHandlesController\n nodeResizeController\n class=\"wrapper\"\n [style.width]=\"model().styleWidth()\"\n [style.height]=\"model().styleHeight()\">\n <ng-container\n [ngComponentOutlet]=\"$any(component)\"\n [ngComponentOutletInputs]=\"model().componentTypeInputs\"\n [ngComponentOutletInjector]=\"injector\" />\n </div>\n </svg:foreignObject>\n }\n}\n\n<!-- Default group node -->\n@if (model().rawNode.type === 'default-group') {\n <svg:rect\n class=\"default-group-node\"\n rx=\"5\"\n ry=\"5\"\n [resizable]=\"model().resizable()\"\n [gap]=\"3\"\n [resizerColor]=\"model().color()\"\n [class.default-group-node_selected]=\"model().selected()\"\n [attr.width]=\"model().size().width\"\n [attr.height]=\"model().size().height\"\n [style.stroke]=\"model().color()\"\n [style.fill]=\"model().color()\"\n (click)=\"pullNode(); selectNode()\" />\n}\n\n<!-- Template group node -->\n@if (model().rawNode.type === 'template-group' && groupNodeTemplate()) {\n <svg:g class=\"selectable\" nodeHandlesController (click)=\"pullNode()\">\n <ng-container\n [ngTemplateOutlet]=\"groupNodeTemplate() ?? null\"\n [ngTemplateOutletContext]=\"model().context\"\n [ngTemplateOutletInjector]=\"injector\" />\n </svg:g>\n}\n\n<!-- Resizer -->\n@if (model().resizerTemplate(); as template) {\n @if (model().resizable()) {\n <ng-template [ngTemplateOutlet]=\"template\" />\n }\n}\n\n<!-- Handles -->\n@for (handle of model().handles(); track handle) {\n @if (handle.template === undefined) {\n <svg:circle\n class=\"default-handle\"\n r=\"5\"\n [attr.cx]=\"handle.hostOffset().x\"\n [attr.cy]=\"handle.hostOffset().y\"\n [attr.stroke-width]=\"handle.strokeWidth\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection()\" />\n }\n\n @if (handle.template === null) {\n <svg:g\n [handleSizeController]=\"handle\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection()\" />\n }\n\n @if (handle.template) {\n <svg:g\n [handleSizeController]=\"handle\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection()\">\n <ng-container *ngTemplateOutlet=\"handle.template; context: handle.templateContext\" />\n </svg:g>\n }\n\n @if (showMagnet()) {\n <svg:circle\n class=\"magnet\"\n [attr.r]=\"model().magnetRadius\"\n [attr.cx]=\"handle.hostOffset().x\"\n [attr.cy]=\"handle.hostOffset().y\"\n (pointerEnd)=\"endConnection(); resetValidateConnection(handle)\"\n (pointerOver)=\"validateConnection(handle)\"\n (pointerOut)=\"resetValidateConnection(handle)\" />\n }\n}\n\n<!-- Toolbar -->\n@for (toolbar of toolbars(); track toolbar) {\n <svg:foreignObject\n [attr.width]=\"toolbar.size().width\"\n [attr.height]=\"toolbar.size().height\"\n [attr.transform]=\"toolbar.transform()\">\n <ng-container [ngTemplateOutlet]=\"toolbar.template()\" />\n </svg:foreignObject>\n}\n", styles: [".magnet{opacity:0}.wrapper{display:table-cell}.default-group-node{stroke-width:1.5px;fill-opacity:.05}.default-group-node_selected{stroke-width:2px}.default-handle{stroke:#fff;fill:#1b262c}\n"] }]
106
- }] });
107
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdmZsb3ctbGliL3NyYy9saWIvdmZsb3cvY29tcG9uZW50cy9ub2RlL25vZGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXZmbG93LWxpYi9zcmMvbGliL3ZmbG93L2NvbXBvbmVudHMvbm9kZS9ub2RlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFVBQVUsRUFDVixRQUFRLEVBSVIsUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLEVBQ04sS0FBSyxHQUNOLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRXBFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUU5RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUM3RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUNqRyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbEUsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFDbEcsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFp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UUFDbEIsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxDQUFDO1lBQ2xELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDN0MsQ0FBQztJQUNILENBQUM7K0dBdEZVLGFBQWE7bUdBQWIsYUFBYSxncUJBakJiLENBQUMsYUFBYSxFQUFFLG1CQUFtQixDQUFDLDBCQzVDakQsbWtLQWdLQSx5UEQvR0ksZ0JBQWdCLDRLQUNoQixvQkFBb0IsK0VBQ3BCLGVBQWUseUhBQ2YsZ0JBQWdCLG9KQUNoQixpQkFBaUIsb1BBQ2pCLGtCQUFrQixzR0FDbEIsNkJBQTZCLHFHQUM3Qiw4QkFBOEIsb0VBQzlCLDZCQUE2Qiw4REFDN0IsU0FBUzs7NEZBR0EsYUFBYTtrQkF2QnpCLFNBQVM7aUNBQ0ksSUFBSSxZQUNOLFNBQVMsbUJBR0YsdUJBQXVCLENBQUMsTUFBTSxhQUNwQyxDQUFDLGFBQWEsRUFBRSxtQkFBbUIsQ0FBQyxRQUN6Qzt3QkFDSixLQUFLLEVBQUUsWUFBWTtxQkFDcEIsV0FDUTt3QkFDUCxnQkFBZ0I7d0JBQ2hCLG9CQUFvQjt3QkFDcEIsZUFBZTt3QkFDZixnQkFBZ0I7d0JBQ2hCLGlCQUFpQjt3QkFDakIsa0JBQWtCO3dCQUNsQiw2QkFBNkI7d0JBQzdCLDhCQUE4Qjt3QkFDOUIsNkJBQTZCO3dCQUM3QixTQUFTO3FCQUNWIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgSW5qZWN0b3IsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBUZW1wbGF0ZVJlZixcbiAgY29tcHV0ZWQsXG4gIGVmZmVjdCxcbiAgaW5qZWN0LFxuICBpbnB1dCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEcmFnZ2FibGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZHJhZ2dhYmxlLnNlcnZpY2UnO1xuaW1wb3J0IHsgTm9kZU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL25vZGUubW9kZWwnO1xuaW1wb3J0IHsgRmxvd1N0YXR1c1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9mbG93LXN0YXR1cy5zZXJ2aWNlJztcbmltcG9ydCB7IEhhbmRsZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9oYW5kbGUuc2VydmljZSc7XG5pbXBvcnQgeyBIYW5kbGVNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9oYW5kbGUubW9kZWwnO1xuaW1wb3J0IHsgTm9kZVJlbmRlcmluZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9ub2RlLXJlbmRlcmluZy5zZXJ2aWNlJztcbmltcG9ydCB7IEZsb3dTZXR0aW5nc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9mbG93LXNldHRpbmdzLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2VsZWN0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3NlbGVjdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IENvbm5lY3Rpb25Db250cm9sbGVyRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9jb25uZWN0aW9uLWNvbnRyb2xsZXIuZGlyZWN0aXZlJztcbmltcG9ydCB7IE5vZGVBY2Nlc3NvclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9ub2RlLWFjY2Vzc29yLnNlcnZpY2UnO1xuaW1wb3J0IHsgT3ZlcmxheXNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvb3ZlcmxheXMuc2VydmljZSc7XG5pbXBvcnQgeyBIYW5kbGVTaXplQ29udHJvbGxlckRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvaGFuZGxlLXNpemUtY29udHJvbGxlci5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgTmdUZW1wbGF0ZU91dGxldCwgTmdDb21wb25lbnRPdXRsZXQsIEFzeW5jUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBEZWZhdWx0Tm9kZUNvbXBvbmVudCB9IGZyb20gJy4uL2RlZmF1bHQtbm9kZS9kZWZhdWx0LW5vZGUuY29tcG9uZW50JztcbmltcG9ydCB7IFBvaW50ZXJEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL3BvaW50ZXIuZGlyZWN0aXZlJztcblxuLy8gVE9ETzogZml4IGxvYWRpbmcgb2YgdGhlc2UgYnkgQGRlZmVyIChzaG91bGQgd29yayBpbiBBbmd1bGFyIDE4Kylcbi8vIHB1YmxpYyBjb21wb25lbnRzIHRoYXQgdXNlcyBpbiBkZWZhdWx0IG5vZGUgKGxvYWRlZCBieSBkZWZlcilcbmltcG9ydCB7IFJlc2l6YWJsZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL3B1YmxpYy1jb21wb25lbnRzL3Jlc2l6YWJsZS9yZXNpemFibGUuY29tcG9uZW50JztcbmltcG9ydCB7IEhhbmRsZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL3B1YmxpYy1jb21wb25lbnRzL2hhbmRsZS9oYW5kbGUuY29tcG9uZW50JztcbmltcG9ydCB7IE5vZGVIYW5kbGVzQ29udHJvbGxlckRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvbm9kZS1oYW5kbGVzLWNvbnRyb2xsZXIuZGlyZWN0aXZlJztcbmltcG9ydCB7IE5vZGVSZXNpemVDb250cm9sbGVyRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9ub2RlLXJlc2l6ZS1jb250cm9sbGVyLmRpcmVjdGl2ZSc7XG5cbmV4cG9ydCB0eXBlIEhhbmRsZVN0YXRlID0gJ3ZhbGlkJyB8ICdpbnZhbGlkJyB8ICdpZGxlJztcblxuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHNlbGVjdG9yOiAnZ1tub2RlXScsXG4gIHRlbXBsYXRlVXJsOiAnLi9ub2RlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbm9kZS5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgcHJvdmlkZXJzOiBbSGFuZGxlU2VydmljZSwgTm9kZUFjY2Vzc29yU2VydmljZV0sXG4gIGhvc3Q6IHtcbiAgICBjbGFzczogJ3ZmbG93LW5vZGUnLFxuICB9LFxuICBpbXBvcnRzOiBbXG4gICAgUG9pbnRlckRpcmVjdGl2ZSxcbiAgICBEZWZhdWx0Tm9kZUNvbXBvbmVudCxcbiAgICBIYW5kbGVDb21wb25lbnQsXG4gICAgTmdUZW1wbGF0ZU91dGxldCxcbiAgICBOZ0NvbXBvbmVudE91dGxldCxcbiAgICBSZXNpemFibGVDb21wb25lbnQsXG4gICAgSGFuZGxlU2l6ZUNvbnRyb2xsZXJEaXJlY3RpdmUsXG4gICAgTm9kZUhhbmRsZXNDb250cm9sbGVyRGlyZWN0aXZlLFxuICAgIE5vZGVSZXNpemVDb250cm9sbGVyRGlyZWN0aXZlLFxuICAgIEFzeW5jUGlwZSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgTm9kZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgcHJvdGVjdGVkIGluamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcbiAgcHJpdmF0ZSBoYW5kbGVTZXJ2aWNlID0gaW5qZWN0KEhhbmRsZVNlcnZpY2UpO1xuICBwcml2YXRlIGRyYWdnYWJsZVNlcnZpY2UgPSBpbmplY3QoRHJhZ2dhYmxlU2VydmljZSk7XG4gIHByaXZhdGUgZmxvd1N0YXR1c1NlcnZpY2UgPSBpbmplY3QoRmxvd1N0YXR1c1NlcnZpY2UpO1xuICBwcml2YXRlIG5vZGVSZW5kZXJpbmdTZXJ2aWNlID0gaW5qZWN0KE5vZGVSZW5kZXJpbmdTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBmbG93U2V0dGluZ3NTZXJ2aWNlID0gaW5qZWN0KEZsb3dTZXR0aW5nc1NlcnZpY2UpO1xuICBwcml2YXRlIHNlbGVjdGlvblNlcnZpY2UgPSBpbmplY3QoU2VsZWN0aW9uU2VydmljZSk7XG4gIHByaXZhdGUgaG9zdFJlZiA9IGluamVjdDxFbGVtZW50UmVmPFNWR0VsZW1lbnQ+PihFbGVtZW50UmVmKTtcbiAgcHJpdmF0ZSBub2RlQWNjZXNzb3IgPSBpbmplY3QoTm9kZUFjY2Vzc29yU2VydmljZSk7XG4gIHByaXZhdGUgb3ZlcmxheXNTZXJ2aWNlID0gaW5qZWN0KE92ZXJsYXlzU2VydmljZSk7XG5cbiAgLy8gVE9ETyByZW1vdmUgZGVwZW5kZW5jeSBmcm9tIHRoaXMgZGlyZWN0aXZlXG4gIHByaXZhdGUgY29ubmVjdGlvbkNvbnRyb2xsZXIgPSBpbmplY3QoQ29ubmVjdGlvbkNvbnRyb2xsZXJEaXJlY3RpdmUsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG5cbiAgcHVibGljIG1vZGVsID0gaW5wdXQucmVxdWlyZWQ8Tm9kZU1vZGVsPigpO1xuXG4gIHB1YmxpYyBub2RlVGVtcGxhdGUgPSBpbnB1dDxUZW1wbGF0ZVJlZjxhbnk+PigpO1xuXG4gIHB1YmxpYyBub2RlU3ZnVGVtcGxhdGUgPSBpbnB1dDxUZW1wbGF0ZVJlZjxhbnk+PigpO1xuXG4gIHB1YmxpYyBncm91cE5vZGVUZW1wbGF0ZSA9IGlucHV0PFRlbXBsYXRlUmVmPGFueT4+KCk7XG5cbiAgcHJvdGVjdGVkIHNob3dNYWduZXQgPSBjb21wdXRlZChcbiAgICAoKSA9PlxuICAgICAgdGhpcy5mbG93U3RhdHVzU2VydmljZS5zdGF0dXMoKS5zdGF0ZSA9PT0gJ2Nvbm5lY3Rpb24tc3RhcnQnIHx8XG4gICAgICB0aGlzLmZsb3dTdGF0dXNTZXJ2aWNlLnN0YXR1cygpLnN0YXRlID09PSAnY29ubmVjdGlvbi12YWxpZGF0aW9uJyB8fFxuICAgICAgdGhpcy5mbG93U3RhdHVzU2VydmljZS5zdGF0dXMoKS5zdGF0ZSA9PT0gJ3JlY29ubmVjdGlvbi1zdGFydCcgfHxcbiAgICAgIHRoaXMuZmxvd1N0YXR1c1NlcnZpY2Uuc3RhdHVzKCkuc3RhdGUgPT09ICdyZWNvbm5lY3Rpb24tdmFsaWRhdGlvbicsXG4gICk7XG5cbiAgcHJvdGVjdGVkIHRvb2xiYXJzID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5vdmVybGF5c1NlcnZpY2Uubm9kZVRvb2xiYXJzTWFwKCkuZ2V0KHRoaXMubW9kZWwoKSkpO1xuXG4gIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLm1vZGVsKCkuaXNWaXNpYmxlLnNldCh0cnVlKTtcblxuICAgIHRoaXMubm9kZUFjY2Vzc29yLm1vZGVsLnNldCh0aGlzLm1vZGVsKCkpO1xuICAgIHRoaXMuaGFuZGxlU2VydmljZS5ub2RlLnNldCh0aGlzLm1vZGVsKCkpO1xuXG4gICAgZWZmZWN0KFxuICAgICAgKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5tb2RlbCgpLmRyYWdnYWJsZSgpKSB7XG4gICAgICAgICAgdGhpcy5kcmFnZ2FibGVTZXJ2aWNlLmVuYWJsZSh0aGlzLmhvc3RSZWYubmF0aXZlRWxlbWVudCwgdGhpcy5tb2RlbCgpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmRyYWdnYWJsZVNlcnZpY2UuZGlzYWJsZSh0aGlzLmhvc3RSZWYubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7IGluamVjdG9yOiB0aGlzLmluamVjdG9yIH0sXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLm1vZGVsKCkuaXNWaXNpYmxlLnNldChmYWxzZSk7XG5cbiAgICB0aGlzLmRyYWdnYWJsZVNlcnZpY2UuZGVzdHJveSh0aGlzLmhvc3RSZWYubmF0aXZlRWxlbWVudCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhcnRDb25uZWN0aW9uKGV2ZW50OiBFdmVudCwgaGFuZGxlOiBIYW5kbGVNb2RlbCkge1xuICAgIC8vIGlnbm9yZSBkcmFnIGJ5IHN0b3BwaW5nIHByb3BhZ2F0aW9uXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICB0aGlzLmNvbm5lY3Rpb25Db250cm9sbGVyPy5zdGFydENvbm5lY3Rpb24oaGFuZGxlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCB2YWxpZGF0ZUNvbm5lY3Rpb24oaGFuZGxlOiBIYW5kbGVNb2RlbCkge1xuICAgIHRoaXMuY29ubmVjdGlvbkNvbnRyb2xsZXI/LnZhbGlkYXRlQ29ubmVjdGlvbihoYW5kbGUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlc2V0VmFsaWRhdGVDb25uZWN0aW9uKHRhcmdldEhhbmRsZTogSGFuZGxlTW9kZWwpIHtcbiAgICB0aGlzLmNvbm5lY3Rpb25Db250cm9sbGVyPy5yZXNldFZhbGlkYXRlQ29ubmVjdGlvbih0YXJnZXRIYW5kbGUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGVuZENvbm5lY3Rpb24oKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uQ29udHJvbGxlcj8uZW5kQ29ubmVjdGlvbigpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHB1bGxOb2RlKCkge1xuICAgIGlmICh0aGlzLmZsb3dTZXR0aW5nc1NlcnZpY2UuZWxldmF0ZU5vZGVzT25TZWxlY3QoKSkge1xuICAgICAgdGhpcy5ub2RlUmVuZGVyaW5nU2VydmljZS5wdWxsTm9kZSh0aGlzLm1vZGVsKCkpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBzZWxlY3ROb2RlKCkge1xuICAgIGlmICh0aGlzLmZsb3dTZXR0aW5nc1NlcnZpY2UuZW50aXRpZXNTZWxlY3RhYmxlKCkpIHtcbiAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5zZWxlY3QodGhpcy5tb2RlbCgpKTtcbiAgICB9XG4gIH1cbn1cbiIsIjwhLS0gRGVmYXVsdCBub2RlIC0tPlxuQGlmIChtb2RlbCgpLnJhd05vZGUudHlwZSA9PT0gJ2RlZmF1bHQnKSB7XG4gIDxzdmc6Zm9yZWlnbk9iamVjdFxuICAgIGNsYXNzPVwic2VsZWN0YWJsZVwiXG4gICAgW2F0dHIud2lkdGhdPVwibW9kZWwoKS5mb1dpZHRoKClcIlxuICAgIFthdHRyLmhlaWdodF09XCJtb2RlbCgpLmZvSGVpZ2h0KClcIlxuICAgIChjbGljayk9XCJwdWxsTm9kZSgpOyBzZWxlY3ROb2RlKClcIj5cbiAgICA8ZGVmYXVsdC1ub2RlXG4gICAgICBub2RlSGFuZGxlc0NvbnRyb2xsZXJcbiAgICAgIFtzZWxlY3RlZF09XCJtb2RlbCgpLnNlbGVjdGVkKClcIlxuICAgICAgW3N0eWxlLndpZHRoXT1cIm1vZGVsKCkuc3R5bGVXaWR0aCgpXCJcbiAgICAgIFtzdHlsZS5oZWlnaHRdPVwibW9kZWwoKS5zdHlsZUhlaWdodCgpXCJcbiAgICAgIFtzdHlsZS5tYXgtd2lkdGhdPVwibW9kZWwoKS5zdHlsZVdpZHRoKClcIlxuICAgICAgW3N0eWxlLm1heC1oZWlnaHRdPVwibW9kZWwoKS5zdHlsZUhlaWdodCgpXCI+XG4gICAgICA8ZGl2IFtvdXRlckhUTUxdPVwibW9kZWwoKS50ZXh0KClcIj48L2Rpdj5cblxuICAgICAgPGhhbmRsZSB0eXBlPVwic291cmNlXCIgcG9zaXRpb249XCJyaWdodFwiIC8+XG4gICAgICA8aGFuZGxlIHR5cGU9XCJ0YXJnZXRcIiBwb3NpdGlvbj1cImxlZnRcIiAvPlxuICAgIDwvZGVmYXVsdC1ub2RlPlxuICA8L3N2Zzpmb3JlaWduT2JqZWN0PlxufVxuXG48IS0tIEhUTUwgVGVtcGxhdGUgbm9kZSAtLT5cbkBpZiAobW9kZWwoKS5yYXdOb2RlLnR5cGUgPT09ICdodG1sLXRlbXBsYXRlJyAmJiBub2RlVGVtcGxhdGUoKSkge1xuICA8c3ZnOmZvcmVpZ25PYmplY3RcbiAgICBjbGFzcz1cInNlbGVjdGFibGVcIlxuICAgIFthdHRyLndpZHRoXT1cIm1vZGVsKCkuZm9XaWR0aCgpXCJcbiAgICBbYXR0ci5oZWlnaHRdPVwibW9kZWwoKS5mb0hlaWdodCgpXCJcbiAgICAoY2xpY2spPVwicHVsbE5vZGUoKVwiPlxuICAgIDxkaXZcbiAgICAgIG5vZGVIYW5kbGVzQ29udHJvbGxlclxuICAgICAgbm9kZVJlc2l6ZUNvbnRyb2xsZXJcbiAgICAgIGNsYXNzPVwid3JhcHBlclwiXG4gICAgICBbc3R5bGUud2lkdGhdPVwibW9kZWwoKS5zdHlsZVdpZHRoKClcIlxuICAgICAgW3N0eWxlLmhlaWdodF09XCJtb2RlbCgpLnN0eWxlSGVpZ2h0KClcIj5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwibm9kZVRlbXBsYXRlKCkgPz8gbnVsbFwiXG4gICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJtb2RlbCgpLmNvbnRleHRcIlxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldEluamVjdG9yXT1cImluamVjdG9yXCIgLz5cbiAgICA8L2Rpdj5cbiAgPC9zdmc6Zm9yZWlnbk9iamVjdD5cbn1cblxuPCEtLSBTVkcgVGVtcGxhdGUgbm9kZSAtLT5cbkBpZiAobW9kZWwoKS5yYXdOb2RlLnR5cGUgPT09ICdzdmctdGVtcGxhdGUnICYmIG5vZGVTdmdUZW1wbGF0ZSgpKSB7XG4gIDxzdmc6ZyBjbGFzcz1cInNlbGVjdGFibGVcIiBub2RlSGFuZGxlc0NvbnRyb2xsZXIgKGNsaWNrKT1cInB1bGxOb2RlKClcIj5cbiAgICA8bmctY29udGFpbmVyXG4gICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJub2RlU3ZnVGVtcGxhdGUoKSA/PyBudWxsXCJcbiAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJtb2RlbCgpLmNvbnRleHRcIlxuICAgICAgW25nVGVtcGxhdGVPdXRsZXRJbmplY3Rvcl09XCJpbmplY3RvclwiIC8+XG4gIDwvc3ZnOmc+XG59XG5cbjwhLS0gQ29tcG9uZW50IG5vZGUgLS0+XG5AaWYgKG1vZGVsKCkuaXNDb21wb25lbnRUeXBlKSB7XG4gIEBpZiAobW9kZWwoKS5jb21wb25lbnRJbnN0YW5jZSQgfCBhc3luYzsgYXMgY29tcG9uZW50KSB7XG4gICAgPHN2Zzpmb3JlaWduT2JqZWN0XG4gICAgICBjbGFzcz1cInNlbGVjdGFibGVcIlxuICAgICAgW2F0dHIud2lkdGhdPVwibW9kZWwoKS5mb1dpZHRoKClcIlxuICAgICAgW2F0dHIuaGVpZ2h0XT1cIm1vZGVsKCkuZm9IZWlnaHQoKVwiXG4gICAgICAoY2xpY2spPVwicHVsbE5vZGUoKVwiPlxuICAgICAgPGRpdlxuICAgICAgICBub2RlSGFuZGxlc0NvbnRyb2xsZXJcbiAgICAgICAgbm9kZVJlc2l6ZUNvbnRyb2xsZXJcbiAgICAgICAgY2xhc3M9XCJ3cmFwcGVyXCJcbiAgICAgICAgW3N0eWxlLndpZHRoXT1cIm1vZGVsKCkuc3R5bGVXaWR0aCgpXCJcbiAgICAgICAgW3N0eWxlLmhlaWdodF09XCJtb2RlbCgpLnN0eWxlSGVpZ2h0KClcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgIFtuZ0NvbXBvbmVudE91dGxldF09XCIkYW55KGNvbXBvbmVudClcIlxuICAgICAgICAgIFtuZ0NvbXBvbmVudE91dGxldElucHV0c109XCJtb2RlbCgpLmNvbXBvbmVudFR5cGVJbnB1dHNcIlxuICAgICAgICAgIFtuZ0NvbXBvbmVudE91dGxldEluamVjdG9yXT1cImluamVjdG9yXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgIDwvc3ZnOmZvcmVpZ25PYmplY3Q+XG4gIH1cbn1cblxuPCEtLSBEZWZhdWx0IGdyb3VwIG5vZGUgLS0+XG5AaWYgKG1vZGVsKCkucmF3Tm9kZS50eXBlID09PSAnZGVmYXVsdC1ncm91cCcpIHtcbiAgPHN2ZzpyZWN0XG4gICAgY2xhc3M9XCJkZWZhdWx0LWdyb3VwLW5vZGVcIlxuICAgIHJ4PVwiNVwiXG4gICAgcnk9XCI1XCJcbiAgICBbcmVzaXphYmxlXT1cIm1vZGVsKCkucmVzaXphYmxlKClcIlxuICAgIFtnYXBdPVwiM1wiXG4gICAgW3Jlc2l6ZXJDb2xvcl09XCJtb2RlbCgpLmNvbG9yKClcIlxuICAgIFtjbGFzcy5kZWZhdWx0LWdyb3VwLW5vZGVfc2VsZWN0ZWRdPVwibW9kZWwoKS5zZWxlY3RlZCgpXCJcbiAgICBbYXR0ci53aWR0aF09XCJtb2RlbCgpLnNpemUoKS53aWR0aFwiXG4gICAgW2F0dHIuaGVpZ2h0XT1cIm1vZGVsKCkuc2l6ZSgpLmhlaWdodFwiXG4gICAgW3N0eWxlLnN0cm9rZV09XCJtb2RlbCgpLmNvbG9yKClcIlxuICAgIFtzdHlsZS5maWxsXT1cIm1vZGVsKCkuY29sb3IoKVwiXG4gICAgKGNsaWNrKT1cInB1bGxOb2RlKCk7IHNlbGVjdE5vZGUoKVwiIC8+XG59XG5cbjwhLS0gVGVtcGxhdGUgZ3JvdXAgbm9kZSAgLS0+XG5AaWYgKG1vZGVsKCkucmF3Tm9kZS50eXBlID09PSAndGVtcGxhdGUtZ3JvdXAnICYmIGdyb3VwTm9kZVRlbXBsYXRlKCkpIHtcbiAgPHN2ZzpnIGNsYXNzPVwic2VsZWN0YWJsZVwiIG5vZGVIYW5kbGVzQ29udHJvbGxlciAoY2xpY2spPVwicHVsbE5vZGUoKVwiPlxuICAgIDxuZy1jb250YWluZXJcbiAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImdyb3VwTm9kZVRlbXBsYXRlKCkgPz8gbnVsbFwiXG4gICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwibW9kZWwoKS5jb250ZXh0XCJcbiAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0SW5qZWN0b3JdPVwiaW5qZWN0b3JcIiAvPlxuICA8L3N2ZzpnPlxufVxuXG48IS0tIFJlc2l6ZXIgLS0+XG5AaWYgKG1vZGVsKCkucmVzaXplclRlbXBsYXRlKCk7IGFzIHRlbXBsYXRlKSB7XG4gIEBpZiAobW9kZWwoKS5yZXNpemFibGUoKSkge1xuICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJ0ZW1wbGF0ZVwiIC8+XG4gIH1cbn1cblxuPCEtLSBIYW5kbGVzIC0tPlxuQGZvciAoaGFuZGxlIG9mIG1vZGVsKCkuaGFuZGxlcygpOyB0cmFjayBoYW5kbGUpIHtcbiAgQGlmIChoYW5kbGUudGVtcGxhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgIDxzdmc6Y2lyY2xlXG4gICAgICBjbGFzcz1cImRlZmF1bHQtaGFuZGxlXCJcbiAgICAgIHI9XCI1XCJcbiAgICAgIFthdHRyLmN4XT1cImhhbmRsZS5ob3N0T2Zmc2V0KCkueFwiXG4gICAgICBbYXR0ci5jeV09XCJoYW5kbGUuaG9zdE9mZnNldCgpLnlcIlxuICAgICAgW2F0dHIuc3Ryb2tlLXdpZHRoXT1cImhhbmRsZS5zdHJva2VXaWR0aFwiXG4gICAgICAocG9pbnRlclN0YXJ0KT1cInN0YXJ0Q29ubmVjdGlvbigkZXZlbnQsIGhhbmRsZSlcIlxuICAgICAgKHBvaW50ZXJFbmQpPVwiZW5kQ29ubmVjdGlvbigpXCIgLz5cbiAgfVxuXG4gIEBpZiAoaGFuZGxlLnRlbXBsYXRlID09PSBudWxsKSB7XG4gICAgPHN2ZzpnXG4gICAgICBbaGFuZGxlU2l6ZUNvbnRyb2xsZXJdPVwiaGFuZGxlXCJcbiAgICAgIChwb2ludGVyU3RhcnQpPVwic3RhcnRDb25uZWN0aW9uKCRldmVudCwgaGFuZGxlKVwiXG4gICAgICAocG9pbnRlckVuZCk9XCJlbmRDb25uZWN0aW9uKClcIiAvPlxuICB9XG5cbiAgQGlmIChoYW5kbGUudGVtcGxhdGUpIHtcbiAgICA8c3ZnOmdcbiAgICAgIFtoYW5kbGVTaXplQ29udHJvbGxlcl09XCJoYW5kbGVcIlxuICAgICAgKHBvaW50ZXJTdGFydCk9XCJzdGFydENvbm5lY3Rpb24oJGV2ZW50LCBoYW5kbGUpXCJcbiAgICAgIChwb2ludGVyRW5kKT1cImVuZENvbm5lY3Rpb24oKVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImhhbmRsZS50ZW1wbGF0ZTsgY29udGV4dDogaGFuZGxlLnRlbXBsYXRlQ29udGV4dFwiIC8+XG4gICAgPC9zdmc6Zz5cbiAgfVxuXG4gIEBpZiAoc2hvd01hZ25ldCgpKSB7XG4gICAgPHN2ZzpjaXJjbGVcbiAgICAgIGNsYXNzPVwibWFnbmV0XCJcbiAgICAgIFthdHRyLnJdPVwibW9kZWwoKS5tYWduZXRSYWRpdXNcIlxuICAgICAgW2F0dHIuY3hdPVwiaGFuZGxlLmhvc3RPZmZzZXQoKS54XCJcbiAgICAgIFthdHRyLmN5XT1cImhhbmRsZS5ob3N0T2Zmc2V0KCkueVwiXG4gICAgICAocG9pbnRlckVuZCk9XCJlbmRDb25uZWN0aW9uKCk7IHJlc2V0VmFsaWRhdGVDb25uZWN0aW9uKGhhbmRsZSlcIlxuICAgICAgKHBvaW50ZXJPdmVyKT1cInZhbGlkYXRlQ29ubmVjdGlvbihoYW5kbGUpXCJcbiAgICAgIChwb2ludGVyT3V0KT1cInJlc2V0VmFsaWRhdGVDb25uZWN0aW9uKGhhbmRsZSlcIiAvPlxuICB9XG59XG5cbjwhLS0gVG9vbGJhciAtLT5cbkBmb3IgKHRvb2xiYXIgb2YgdG9vbGJhcnMoKTsgdHJhY2sgdG9vbGJhcikge1xuICA8c3ZnOmZvcmVpZ25PYmplY3RcbiAgICBbYXR0ci53aWR0aF09XCJ0b29sYmFyLnNpemUoKS53aWR0aFwiXG4gICAgW2F0dHIuaGVpZ2h0XT1cInRvb2xiYXIuc2l6ZSgpLmhlaWdodFwiXG4gICAgW2F0dHIudHJhbnNmb3JtXT1cInRvb2xiYXIudHJhbnNmb3JtKClcIj5cbiAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRvb2xiYXIudGVtcGxhdGUoKVwiIC8+XG4gIDwvc3ZnOmZvcmVpZ25PYmplY3Q+XG59XG4iXX0=
@@ -1,100 +0,0 @@
1
- export function drawNode(ctx, node) {
2
- if (Object.keys(node.preview().style).length) {
3
- drawStyledNode(ctx, node);
4
- return;
5
- }
6
- if (node.rawNode.type === 'default') {
7
- drawDefaultNode(ctx, node);
8
- return;
9
- }
10
- if (node.rawNode.type === 'default-group') {
11
- drawDefaultGroupNode(ctx, node);
12
- return;
13
- }
14
- drawUnknownNode(ctx, node);
15
- }
16
- function drawDefaultNode(ctx, node) {
17
- const point = node.globalPoint();
18
- const width = node.width();
19
- const height = node.height();
20
- borderRadius(ctx, node, 5);
21
- // Draw background (background-color: white)
22
- ctx.fillStyle = 'white';
23
- ctx.fill();
24
- // Draw border (border: 1.5px solid #1b262c)
25
- ctx.strokeStyle = '#1b262c';
26
- ctx.lineWidth = 1.5;
27
- ctx.stroke();
28
- // Draw centered text (color: black, justify-content: center)
29
- ctx.fillStyle = 'black';
30
- // TODO: use as in default node
31
- ctx.font = '14px Arial';
32
- ctx.textAlign = 'center';
33
- ctx.textBaseline = 'middle';
34
- const centerX = point.x + width / 2;
35
- const centerY = point.y + height / 2;
36
- ctx.fillText(node.text(), centerX, centerY);
37
- }
38
- function drawDefaultGroupNode(ctx, node) {
39
- const point = node.globalPoint();
40
- const width = node.width();
41
- const height = node.height();
42
- ctx.globalAlpha = 0.05;
43
- ctx.fillStyle = node.color();
44
- ctx.fillRect(point.x, point.y, width, height);
45
- ctx.globalAlpha = 1;
46
- ctx.strokeStyle = node.color();
47
- ctx.lineWidth = 1.5;
48
- ctx.strokeRect(point.x, point.y, width, height);
49
- }
50
- function drawStyledNode(ctx, node) {
51
- const point = node.globalPoint();
52
- const width = node.width();
53
- const height = node.height();
54
- const style = node.preview().style;
55
- if (style.borderRadius) {
56
- const radius = parseFloat(style.borderRadius);
57
- borderRadius(ctx, node, radius);
58
- }
59
- else {
60
- ctx.beginPath();
61
- ctx.rect(point.x, point.y, width, height);
62
- ctx.closePath();
63
- }
64
- if (style.backgroundColor) {
65
- ctx.fillStyle = style.backgroundColor;
66
- }
67
- if (style.borderColor) {
68
- ctx.strokeStyle = style.borderColor;
69
- }
70
- if (style.borderWidth) {
71
- ctx.lineWidth = parseFloat(style.borderWidth);
72
- }
73
- ctx.fill();
74
- ctx.stroke();
75
- }
76
- function drawUnknownNode(ctx, node) {
77
- const point = node.globalPoint();
78
- const width = node.width();
79
- const height = node.height();
80
- ctx.fillStyle = 'rgb(0 0 0 / 10%)';
81
- ctx.fillRect(point.x, point.y, width, height);
82
- }
83
- function borderRadius(ctx, node, radius) {
84
- const point = node.globalPoint();
85
- const width = node.width();
86
- const height = node.height();
87
- // Create rounded rectangle path
88
- ctx.beginPath();
89
- ctx.moveTo(point.x + radius, point.y);
90
- ctx.lineTo(point.x + width - radius, point.y);
91
- ctx.quadraticCurveTo(point.x + width, point.y, point.x + width, point.y + radius);
92
- ctx.lineTo(point.x + width, point.y + height - radius);
93
- ctx.quadraticCurveTo(point.x + width, point.y + height, point.x + width - radius, point.y + height);
94
- ctx.lineTo(point.x + radius, point.y + height);
95
- ctx.quadraticCurveTo(point.x, point.y + height, point.x, point.y + height - radius);
96
- ctx.lineTo(point.x, point.y + radius);
97
- ctx.quadraticCurveTo(point.x, point.y, point.x + radius, point.y);
98
- ctx.closePath();
99
- }
100
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhdy1ub2RlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXZmbG93LWxpYi9zcmMvbGliL3ZmbG93L2NvbXBvbmVudHMvcHJldmlldy1mbG93L2RyYXctbm9kZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLFVBQVUsUUFBUSxDQUFDLEdBQTZCLEVBQUUsSUFBZTtJQUNyRSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzdDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDMUIsT0FBTztJQUNULENBQUM7SUFFRCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3BDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDM0IsT0FBTztJQUNULENBQUM7SUFFRCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLGVBQWUsRUFBRSxDQUFDO1FBQzFDLG9CQUFvQixDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNoQyxPQUFPO0lBQ1QsQ0FBQztJQUVELGVBQWUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDN0IsQ0FBQztBQUVELFNBQVMsZUFBZSxDQUFDLEdBQTZCLEVBQUUsSUFBZTtJQUNyRSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDakMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzNCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUU3QixZQUFZLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUUzQiw0Q0FBNEM7SUFD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QUMsS0FBSyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5QyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxHQUFHLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO0lBQ2xGLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsR0FBRyxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUM7SUFDdkQsR0FBRyxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLEdBQUcsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO0lBQ3BHLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQztJQUMvQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxHQUFHLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDO0lBQ3BGLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO0lBQ3RDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsR0FBRyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLEdBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQztBQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTm9kZU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL25vZGUubW9kZWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gZHJhd05vZGUoY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsIG5vZGU6IE5vZGVNb2RlbCkge1xuICBpZiAoT2JqZWN0LmtleXMobm9kZS5wcmV2aWV3KCkuc3R5bGUpLmxlbmd0aCkge1xuICAgIGRyYXdTdHlsZWROb2RlKGN0eCwgbm9kZSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKG5vZGUucmF3Tm9kZS50eXBlID09PSAnZGVmYXVsdCcpIHtcbiAgICBkcmF3RGVmYXVsdE5vZGUoY3R4LCBub2RlKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAobm9kZS5yYXdOb2RlLnR5cGUgPT09ICdkZWZhdWx0LWdyb3VwJykge1xuICAgIGRyYXdEZWZhdWx0R3JvdXBOb2RlKGN0eCwgbm9kZSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZHJhd1Vua25vd25Ob2RlKGN0eCwgbm9kZSk7XG59XG5cbmZ1bmN0aW9uIGRyYXdEZWZhdWx0Tm9kZShjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCwgbm9kZTogTm9kZU1vZGVsKSB7XG4gIGNvbnN0IHBvaW50ID0gbm9kZS5nbG9iYWxQb2ludCgpO1xuICBjb25zdCB3aWR0aCA9IG5vZGUud2lkdGgoKTtcbiAgY29uc3QgaGVpZ2h0ID0gbm9kZS5oZWlnaHQoKTtcblxuICBib3JkZXJSYWRpdXMoY3R4LCBub2RlLCA1KTtcblxuICAvLyBEcmF3IGJhY2tncm91bmQgKGJhY2tncm91bmQtY29sb3I6IHdoaXRlKVxuICBjdHguZmlsbFN0eWxlID0gJ3doaXRlJztcbiAgY3R4LmZpbGwoKTtcblxuICAvLyBEcmF3IGJvcmRlciAoYm9yZGVyOiAxLjVweCBzb2xpZCAjMWIyNjJjKVxuICBjdHguc3Ryb2tlU3R5bGUgPSAnIzFiMjYyYyc7XG4gIGN0eC5saW5lV2lkdGggPSAxLjU7XG4gIGN0eC5zdHJva2UoKTtcblxuICAvLyBEcmF3IGNlbnRlcmVkIHRleHQgKGNvbG9yOiBibGFjaywganVzdGlmeS1jb250ZW50OiBjZW50ZXIpXG4gIGN0eC5maWxsU3R5bGUgPSAnYmxhY2snO1xuICAvLyBUT0RPOiB1c2UgYXMgaW4gZGVmYXVsdCBub2RlXG4gIGN0eC5mb250ID0gJzE0cHggQXJpYWwnO1xuICBjdHgudGV4dEFsaWduID0gJ2NlbnRlcic7XG4gIGN0eC50ZXh0QmFzZWxpbmUgPSAnbWlkZGxlJztcblxuICBjb25zdCBjZW50ZXJYID0gcG9pbnQueCArIHdpZHRoIC8gMjtcbiAgY29uc3QgY2VudGVyWSA9IHBvaW50LnkgKyBoZWlnaHQgLyAyO1xuICBjdHguZmlsbFRleHQobm9kZS50ZXh0KCksIGNlbnRlclgsIGNlbnRlclkpO1xufVxuXG5mdW5jdGlvbiBkcmF3RGVmYXVsdEdyb3VwTm9kZShjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCwgbm9kZTogTm9kZU1vZGVsKSB7XG4gIGNvbnN0IHBvaW50ID0gbm9kZS5nbG9iYWxQb2ludCgpO1xuICBjb25zdCB3aWR0aCA9IG5vZGUud2lkdGgoKTtcbiAgY29uc3QgaGVpZ2h0ID0gbm9kZS5oZWlnaHQoKTtcblxuICBjdHguZ2xvYmFsQWxwaGEgPSAwLjA1O1xuICBjdHguZmlsbFN0eWxlID0gbm9kZS5jb2xvcigpO1xuICBjdHguZmlsbFJlY3QocG9pbnQueCwgcG9pbnQueSwgd2lkdGgsIGhlaWdodCk7XG4gIGN0eC5nbG9iYWxBbHBoYSA9IDE7XG5cbiAgY3R4LnN0cm9rZVN0eWxlID0gbm9kZS5jb2xvcigpO1xuICBjdHgubGluZVdpZHRoID0gMS41O1xuICBjdHguc3Ryb2tlUmVjdChwb2ludC54LCBwb2ludC55LCB3aWR0aCwgaGVpZ2h0KTtcbn1cblxuZnVuY3Rpb24gZHJhd1N0eWxlZE5vZGUoY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsIG5vZGU6IE5vZGVNb2RlbCkge1xuICBjb25zdCBwb2ludCA9IG5vZGUuZ2xvYmFsUG9pbnQoKTtcbiAgY29uc3Qgd2lkdGggPSBub2RlLndpZHRoKCk7XG4gIGNvbnN0IGhlaWdodCA9IG5vZGUuaGVpZ2h0KCk7XG4gIGNvbnN0IHN0eWxlID0gbm9kZS5wcmV2aWV3KCkuc3R5bGU7XG5cbiAgaWYgKHN0eWxlLmJvcmRlclJhZGl1cykge1xuICAgIGNvbnN0IHJhZGl1cyA9IHBhcnNlRmxvYXQoc3R5bGUuYm9yZGVyUmFkaXVzKTtcbiAgICBib3JkZXJSYWRpdXMoY3R4LCBub2RlLCByYWRpdXMpO1xuICB9IGVsc2Uge1xuICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICBjdHgucmVjdChwb2ludC54LCBwb2ludC55LCB3aWR0aCwgaGVpZ2h0KTtcbiAgICBjdHguY2xvc2VQYXRoKCk7XG4gIH1cblxuICBpZiAoc3R5bGUuYmFja2dyb3VuZENvbG9yKSB7XG4gICAgY3R4LmZpbGxTdHlsZSA9IHN0eWxlLmJhY2tncm91bmRDb2xvcjtcbiAgfVxuXG4gIGlmIChzdHlsZS5ib3JkZXJDb2xvcikge1xuICAgIGN0eC5zdHJva2VTdHlsZSA9IHN0eWxlLmJvcmRlckNvbG9yO1xuICB9XG5cbiAgaWYgKHN0eWxlLmJvcmRlcldpZHRoKSB7XG4gICAgY3R4LmxpbmVXaWR0aCA9IHBhcnNlRmxvYXQoc3R5bGUuYm9yZGVyV2lkdGgpO1xuICB9XG5cbiAgY3R4LmZpbGwoKTtcbiAgY3R4LnN0cm9rZSgpO1xufVxuXG5mdW5jdGlvbiBkcmF3VW5rbm93bk5vZGUoY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsIG5vZGU6IE5vZGVNb2RlbCkge1xuICBjb25zdCBwb2ludCA9IG5vZGUuZ2xvYmFsUG9pbnQoKTtcbiAgY29uc3Qgd2lkdGggPSBub2RlLndpZHRoKCk7XG4gIGNvbnN0IGhlaWdodCA9IG5vZGUuaGVpZ2h0KCk7XG5cbiAgY3R4LmZpbGxTdHlsZSA9ICdyZ2IoMCAwIDAgLyAxMCUpJztcbiAgY3R4LmZpbGxSZWN0KHBvaW50LngsIHBvaW50LnksIHdpZHRoLCBoZWlnaHQpO1xufVxuXG5mdW5jdGlvbiBib3JkZXJSYWRpdXMoY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsIG5vZGU6IE5vZGVNb2RlbCwgcmFkaXVzOiBudW1iZXIpIHtcbiAgY29uc3QgcG9pbnQgPSBub2RlLmdsb2JhbFBvaW50KCk7XG4gIGNvbnN0IHdpZHRoID0gbm9kZS53aWR0aCgpO1xuICBjb25zdCBoZWlnaHQgPSBub2RlLmhlaWdodCgpO1xuXG4gIC8vIENyZWF0ZSByb3VuZGVkIHJlY3RhbmdsZSBwYXRoXG4gIGN0eC5iZWdpblBhdGgoKTtcbiAgY3R4Lm1vdmVUbyhwb2ludC54ICsgcmFkaXVzLCBwb2ludC55KTtcbiAgY3R4LmxpbmVUbyhwb2ludC54ICsgd2lkdGggLSByYWRpdXMsIHBvaW50LnkpO1xuICBjdHgucXVhZHJhdGljQ3VydmVUbyhwb2ludC54ICsgd2lkdGgsIHBvaW50LnksIHBvaW50LnggKyB3aWR0aCwgcG9pbnQueSArIHJhZGl1cyk7XG4gIGN0eC5saW5lVG8ocG9pbnQueCArIHdpZHRoLCBwb2ludC55ICsgaGVpZ2h0IC0gcmFkaXVzKTtcbiAgY3R4LnF1YWRyYXRpY0N1cnZlVG8ocG9pbnQueCArIHdpZHRoLCBwb2ludC55ICsgaGVpZ2h0LCBwb2ludC54ICsgd2lkdGggLSByYWRpdXMsIHBvaW50LnkgKyBoZWlnaHQpO1xuICBjdHgubGluZVRvKHBvaW50LnggKyByYWRpdXMsIHBvaW50LnkgKyBoZWlnaHQpO1xuICBjdHgucXVhZHJhdGljQ3VydmVUbyhwb2ludC54LCBwb2ludC55ICsgaGVpZ2h0LCBwb2ludC54LCBwb2ludC55ICsgaGVpZ2h0IC0gcmFkaXVzKTtcbiAgY3R4LmxpbmVUbyhwb2ludC54LCBwb2ludC55ICsgcmFkaXVzKTtcbiAgY3R4LnF1YWRyYXRpY0N1cnZlVG8ocG9pbnQueCwgcG9pbnQueSwgcG9pbnQueCArIHJhZGl1cywgcG9pbnQueSk7XG4gIGN0eC5jbG9zZVBhdGgoKTtcbn1cbiJdfQ==