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
package/public-api.d.ts CHANGED
@@ -5,7 +5,7 @@ export * from './lib/vflow/interfaces/edge.interface';
5
5
  export * from './lib/vflow/interfaces/edge-label.interface';
6
6
  export * from './lib/vflow/interfaces/connection.interface';
7
7
  export * from './lib/vflow/interfaces/connection.interface';
8
- export * from './lib/vflow/interfaces/connection-settings.interface';
8
+ export { ConnectionSettings, ConnectionValidatorFn } from './lib/vflow/interfaces/connection-settings.interface';
9
9
  export * from './lib/vflow/interfaces/marker.interface';
10
10
  export { ViewportState } from './lib/vflow/interfaces/viewport.interface';
11
11
  export * from './lib/vflow/interfaces/component-node-event.interface';
@@ -15,16 +15,17 @@ export * from './lib/vflow/interfaces/intersecting-nodes-options.interface';
15
15
  export * from './lib/vflow/interfaces/curve-factory.interface';
16
16
  export * from './lib/vflow/interfaces/node-preview.interface';
17
17
  export * from './lib/vflow/interfaces/alignment-helper-settings.interface';
18
+ export { ConnectEndEvent, ConnectStartEvent, ReconnectEndEvent, ReconnectEvent, ReconnectStartEvent, } from './lib/vflow/interfaces/connection-events.interface';
18
19
  export * from './lib/vflow/types/node-change.type';
19
20
  export * from './lib/vflow/types/edge-change.type';
20
21
  export * from './lib/vflow/types/position.type';
21
22
  export * from './lib/vflow/types/background.type';
22
23
  export * from './lib/vflow/types/connection-mode.type';
23
24
  export * from './lib/vflow/types/keyboard-action.type';
25
+ export * from './lib/vflow/types/selection-mode.type';
24
26
  export * from './lib/vflow/components/vflow/vflow.component';
25
27
  export * from './lib/vflow/public-components/handle/handle.component';
26
28
  export * from './lib/vflow/public-components/custom-node/custom-node.component';
27
- export * from './lib/vflow/public-components/custom-dynamic-node/custom-dynamic-node.component';
28
29
  export * from './lib/vflow/public-components/resizable/resizable.component';
29
30
  export * from './lib/vflow/public-components/minimap/minimap.component';
30
31
  export * from './lib/vflow/public-components/node-toolbar/node-toolbar.component';
@@ -1,11 +1,11 @@
1
1
  import { WritableSignal, OnInit } from '@angular/core';
2
- import { Node, DynamicNode, Edge, SpacePoint, Point, Background, KeyboardShortcuts, ViewportState, NodeChange, EdgeChange, FitViewOptions, VflowComponent, IntersectingNodesOptions, ɵConnectionModel as ConnectionModel, AlignmentHelperSettings } from 'ngx-vflow';
2
+ import { Node, Edge, SpacePoint, Point, Background, KeyboardShortcuts, ViewportState, NodeChange, EdgeChange, FitViewOptions, VflowComponent, IntersectingNodesOptions, ɵConnectionModel as ConnectionModel, AlignmentHelperSettings, SelectionMode } from 'ngx-vflow';
3
3
  import { ConnectionTemplateMockDirective, EdgeLabelHtmlTemplateMockDirective, EdgeTemplateMockDirective, GroupNodeTemplateMockDirective, NodeHtmlTemplateMockDirective } from '../directive-mocks/template-mock.directive';
4
4
  import { AsInterface } from '../types';
5
5
  import * as i0 from "@angular/core";
6
6
  import * as i1 from "ngx-vflow";
7
7
  export declare class VflowMockComponent implements AsInterface<VflowComponent>, OnInit {
8
- readonly nodes: Node[] | DynamicNode[];
8
+ readonly nodes: Node[];
9
9
  readonly edges: Edge[];
10
10
  readonly view: [
11
11
  number,
@@ -16,6 +16,7 @@ export declare class VflowMockComponent implements AsInterface<VflowComponent>,
16
16
  readonly background: Background | string;
17
17
  readonly optimization: Required<import("ngx-vflow").Optimization>;
18
18
  readonly entitiesSelectable = true;
19
+ readonly selectionMode: SelectionMode;
19
20
  readonly keyboardShortcuts: KeyboardShortcuts;
20
21
  readonly connection: ConnectionModel;
21
22
  readonly snapGrid: [
@@ -24,8 +25,9 @@ export declare class VflowMockComponent implements AsInterface<VflowComponent>,
24
25
  ];
25
26
  elevateNodesOnSelect: boolean;
26
27
  elevateEdgesOnSelect: boolean;
28
+ autoPan: boolean;
27
29
  alignmentHelper: import("@angular/core").InputSignal<boolean | AlignmentHelperSettings>;
28
- readonly onComponentNodeEvent: import("@angular/core").OutputEmitterRef<any>;
30
+ readonly componentNodeEvent: import("@angular/core").OutputEmitterRef<any>;
29
31
  protected nodeTemplateDirective: import("@angular/core").Signal<NodeHtmlTemplateMockDirective | undefined>;
30
32
  protected groupNodeTemplateDirective: import("@angular/core").Signal<GroupNodeTemplateMockDirective | undefined>;
31
33
  protected edgeTemplateDirective: import("@angular/core").Signal<EdgeTemplateMockDirective | undefined>;
@@ -50,12 +52,12 @@ export declare class VflowMockComponent implements AsInterface<VflowComponent>,
50
52
  documentPointToFlowPoint(point: Point, options: {
51
53
  spaces: true;
52
54
  }): SpacePoint[];
53
- getIntesectingNodes(nodeId: string, options?: IntersectingNodesOptions): Node[] | DynamicNode[];
55
+ getIntesectingNodes(nodeId: string, options?: IntersectingNodesOptions): Node[];
54
56
  toNodeSpace(nodeId: string, spaceNodeId: string): Point;
55
- getNode<T = unknown>(id: string): Node<T> | DynamicNode<T> | undefined;
57
+ getNode<T = unknown>(id: string): Node<T> | undefined;
56
58
  getDetachedEdges(): Edge[];
57
59
  protected createSignal<T>(value: T): WritableSignal<T>;
58
60
  static ɵfac: i0.ɵɵFactoryDeclaration<VflowMockComponent, never>;
59
- static ɵcmp: i0.ɵɵComponentDeclaration<VflowMockComponent, "vflow", never, { "nodes": { "alias": "nodes"; "required": true; }; "edges": { "alias": "edges"; "required": false; }; "view": { "alias": "view"; "required": false; }; "minZoom": { "alias": "minZoom"; "required": false; }; "maxZoom": { "alias": "maxZoom"; "required": false; }; "background": { "alias": "background"; "required": false; }; "optimization": { "alias": "optimization"; "required": false; }; "entitiesSelectable": { "alias": "entitiesSelectable"; "required": false; }; "keyboardShortcuts": { "alias": "keyboardShortcuts"; "required": false; }; "connection": { "alias": "connection"; "required": false; }; "snapGrid": { "alias": "snapGrid"; "required": false; }; "elevateNodesOnSelect": { "alias": "elevateNodesOnSelect"; "required": false; }; "elevateEdgesOnSelect": { "alias": "elevateEdgesOnSelect"; "required": false; }; "alignmentHelper": { "alias": "alignmentHelper"; "required": false; "isSignal": true; }; }, { "onComponentNodeEvent": "onComponentNodeEvent"; }, ["nodeTemplateDirective", "groupNodeTemplateDirective", "edgeTemplateDirective", "edgeLabelHtmlDirective", "connectionTemplateDirective"], ["*"], true, never>;
61
+ static ɵcmp: i0.ɵɵComponentDeclaration<VflowMockComponent, "vflow", never, { "nodes": { "alias": "nodes"; "required": true; }; "edges": { "alias": "edges"; "required": false; }; "view": { "alias": "view"; "required": false; }; "minZoom": { "alias": "minZoom"; "required": false; }; "maxZoom": { "alias": "maxZoom"; "required": false; }; "background": { "alias": "background"; "required": false; }; "optimization": { "alias": "optimization"; "required": false; }; "entitiesSelectable": { "alias": "entitiesSelectable"; "required": false; }; "selectionMode": { "alias": "selectionMode"; "required": false; }; "keyboardShortcuts": { "alias": "keyboardShortcuts"; "required": false; }; "connection": { "alias": "connection"; "required": false; }; "snapGrid": { "alias": "snapGrid"; "required": false; }; "elevateNodesOnSelect": { "alias": "elevateNodesOnSelect"; "required": false; }; "elevateEdgesOnSelect": { "alias": "elevateEdgesOnSelect"; "required": false; }; "autoPan": { "alias": "autoPan"; "required": false; }; "alignmentHelper": { "alias": "alignmentHelper"; "required": false; "isSignal": true; }; }, { "componentNodeEvent": "componentNodeEvent"; }, ["nodeTemplateDirective", "groupNodeTemplateDirective", "edgeTemplateDirective", "edgeLabelHtmlDirective", "connectionTemplateDirective"], ["*"], true, never>;
60
62
  static ngAcceptInputType_connection: i1.ConnectionSettings;
61
63
  }
@@ -1,17 +1,19 @@
1
- import { Connection, ReconnectionEvent } from 'ngx-vflow';
1
+ import { Connection, ReconnectEvent } from 'ngx-vflow';
2
2
  import { AsInterface } from '../types';
3
- import type { ConnectionControllerDirective, ɵHandleModel as HandleModel } from 'ngx-vflow';
3
+ import type { ConnectEndEvent, ConnectionControllerDirective, ConnectStartEvent, ɵHandleModel as HandleModel, ReconnectEndEvent, ReconnectStartEvent } from 'ngx-vflow';
4
4
  import * as i0 from "@angular/core";
5
5
  export declare class ConnectionControllerMockDirective implements AsInterface<ConnectionControllerDirective> {
6
+ readonly connectStart: import("@angular/core").OutputEmitterRef<ConnectStartEvent>;
6
7
  readonly connect: import("@angular/core").OutputEmitterRef<Connection>;
7
- readonly onConnect: import("@angular/core").OutputEmitterRef<Connection>;
8
- readonly reconnect: import("@angular/core").OutputEmitterRef<ReconnectionEvent>;
9
- readonly onReconnect: import("@angular/core").OutputEmitterRef<ReconnectionEvent>;
8
+ readonly connectEnd: import("@angular/core").OutputEmitterRef<ConnectEndEvent>;
9
+ readonly reconnectStart: import("@angular/core").OutputEmitterRef<ReconnectStartEvent>;
10
+ readonly reconnect: import("@angular/core").OutputEmitterRef<ReconnectEvent>;
11
+ readonly reconnectEnd: import("@angular/core").OutputEmitterRef<ReconnectEndEvent>;
10
12
  startConnection(handle: HandleModel): void;
11
13
  startReconnection(handle: HandleModel): void;
12
14
  validateConnection(handle: HandleModel): void;
13
15
  resetValidateConnection(targetHandle: HandleModel): void;
14
16
  endConnection(): void;
15
17
  static ɵfac: i0.ɵɵFactoryDeclaration<ConnectionControllerMockDirective, never>;
16
- static ɵdir: i0.ɵɵDirectiveDeclaration<ConnectionControllerMockDirective, "[connect], [onConnect]", never, {}, { "connect": "connect"; "onConnect": "onConnect"; "reconnect": "reconnect"; "onReconnect": "onReconnect"; }, never, never, true, never>;
18
+ static ɵdir: i0.ɵɵDirectiveDeclaration<ConnectionControllerMockDirective, "[connectStart], [connect], [connectEnd], [reconnectStart], [reconnect], [reconnectEnd]", never, {}, { "connectStart": "connectStart"; "connect": "connect"; "connectEnd": "connectEnd"; "reconnectStart": "reconnectStart"; "reconnect": "reconnect"; "reconnectEnd": "reconnectEnd"; }, never, never, true, never>;
17
19
  }
@@ -1,103 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';
2
- import { nodeToRect } from '../../utils/nodes';
3
- import { FlowStatusService, isNodeDragEndStatus, isNodeDragStartStatus } from '../../services/flow-status.service';
4
- import { rectToRectWithSides } from '../../interfaces/rect';
5
- import { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';
6
- import { filter, map, tap } from 'rxjs';
7
- import { extendedComputed } from '../../utils/signals/extended-computed';
8
- import { NodeRenderingService } from '../../services/node-rendering.service';
9
- import { getSpacePoints } from '../../utils/get-space-points';
10
- import * as i0 from "@angular/core";
11
- export class AlignmentHelperComponent {
12
- constructor() {
13
- this.nodeRenderingService = inject(NodeRenderingService);
14
- this.flowStatus = inject(FlowStatusService);
15
- this.tolerance = input(10);
16
- this.lineColor = input('#1b262c');
17
- this.isNodeDragging = computed(() => isNodeDragStartStatus(this.flowStatus.status()));
18
- this.intersections = extendedComputed((lastValue) => {
19
- const status = this.flowStatus.status();
20
- if (isNodeDragStartStatus(status)) {
21
- const node = status.payload.node;
22
- const d = rectToRectWithSides(nodeToRect(node));
23
- const otherRects = this.nodeRenderingService
24
- .viewportNodes()
25
- .filter((n) => n !== node)
26
- // do not check children of the dragged node
27
- .filter((n) => !node.children().includes(n))
28
- .map((n) => rectToRectWithSides(nodeToRect(n)));
29
- const lines = [];
30
- let snappedX = d.x;
31
- let snappedY = d.y;
32
- let closestXDiff = Infinity;
33
- let closestYDiff = Infinity;
34
- otherRects.forEach((o) => {
35
- const dCenterX = d.left + d.width / 2;
36
- const oCenterX = o.left + o.width / 2;
37
- for (const [dX, oX, snapX, isCenter] of [
38
- // center check
39
- [dCenterX, oCenterX, oCenterX - d.width / 2, true],
40
- [d.left, o.left, o.left, false],
41
- [d.left, o.right, o.right, false],
42
- [d.right, o.left, o.left - d.width, false],
43
- [d.right, o.right, o.right - d.width, false],
44
- ]) {
45
- const diff = Math.abs(dX - oX);
46
- if (diff <= this.tolerance()) {
47
- const y = Math.min(d.top, o.top);
48
- const y2 = Math.max(d.bottom, o.bottom);
49
- lines.push({ x: oX, y, x2: oX, y2, isCenter });
50
- if (diff < closestXDiff) {
51
- closestXDiff = diff;
52
- snappedX = snapX;
53
- }
54
- if (isCenter)
55
- break;
56
- }
57
- }
58
- const dCenterY = d.top + d.height / 2;
59
- const oCenterY = o.top + o.height / 2;
60
- for (const [dY, oY, snapY, isCenter] of [
61
- // center check
62
- [dCenterY, oCenterY, oCenterY - d.height / 2, true],
63
- [d.top, o.top, o.top, false],
64
- [d.top, o.bottom, o.bottom, false],
65
- [d.bottom, o.top, o.top - d.height, false],
66
- [d.bottom, o.bottom, o.bottom - d.height, false],
67
- ]) {
68
- const diff = Math.abs(dY - oY);
69
- if (diff <= this.tolerance()) {
70
- const x = Math.min(d.left, o.left);
71
- const x2 = Math.max(d.right, o.right);
72
- lines.push({ x, y: oY, x2, y2: oY, isCenter });
73
- if (diff < closestYDiff) {
74
- closestYDiff = diff;
75
- snappedY = snapY;
76
- }
77
- if (isCenter)
78
- break;
79
- }
80
- }
81
- });
82
- return { lines, snappedX, snappedY };
83
- }
84
- return lastValue;
85
- });
86
- toObservable(this.flowStatus.status)
87
- .pipe(filter(isNodeDragEndStatus), map((status) => status.payload.node), map((node) => [node, this.intersections()]), tap(([node, intersections]) => {
88
- if (intersections) {
89
- const snapped = { x: intersections.snappedX, y: intersections.snappedY };
90
- const parentIfExists = node.parent() ? [node.parent()] : [];
91
- node.setPoint(getSpacePoints(snapped, parentIfExists)[0]);
92
- }
93
- }), takeUntilDestroyed())
94
- .subscribe();
95
- }
96
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AlignmentHelperComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
97
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: AlignmentHelperComponent, isStandalone: true, selector: "g[alignmentHelper]", inputs: { tolerance: { classPropertyName: "tolerance", publicName: "tolerance", isSignal: true, isRequired: false, transformFunction: null }, lineColor: { classPropertyName: "lineColor", publicName: "lineColor", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@if (isNodeDragging()) {\n @if (intersections(); as intersections) {\n @for (intersection of intersections.lines; track $index) {\n <svg:line\n [attr.stroke]=\"lineColor()\"\n [attr.stroke-dasharray]=\"intersection.isCenter ? 4 : null\"\n [attr.x1]=\"intersection.x\"\n [attr.y1]=\"intersection.y\"\n [attr.x2]=\"intersection.x2\"\n [attr.y2]=\"intersection.y2\" />\n }\n }\n}\n", changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
98
- }
99
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AlignmentHelperComponent, decorators: [{
100
- type: Component,
101
- args: [{ selector: 'g[alignmentHelper]', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "@if (isNodeDragging()) {\n @if (intersections(); as intersections) {\n @for (intersection of intersections.lines; track $index) {\n <svg:line\n [attr.stroke]=\"lineColor()\"\n [attr.stroke-dasharray]=\"intersection.isCenter ? 4 : null\"\n [attr.x1]=\"intersection.x\"\n [attr.y1]=\"intersection.y\"\n [attr.x2]=\"intersection.x2\"\n [attr.y2]=\"intersection.y2\" />\n }\n }\n}\n" }]
102
- }], ctorParameters: () => [] });
103
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxpZ25tZW50LWhlbHBlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdmZsb3ctbGliL3NyYy9saWIvdmZsb3cvY29tcG9uZW50cy9hbGlnbm1lbnQtaGVscGVyL2FsaWdubWVudC1oZWxwZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXZmbG93LWxpYi9zcmMvbGliL3ZmbG93L2NvbXBvbmVudHMvYWxpZ25tZW50LWhlbHBlci9hbGlnbm1lbnQtaGVscGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUYsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxtQkFBbUIsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ25ILE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTVELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM5RSxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDeEMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDekUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDN0UsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDhCQUE4QixDQUFDOztBQWM5RCxNQUFNLE9BQU8sd0JBQXdCO0lBOEZuQztRQTdGUSx5QkFBb0IsR0FBRyxNQUFNLENBQUMsb0JBQW9CLENBQUMs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U3RyYXRlZ3ksIENvbXBvbmVudCwgY29tcHV0ZWQsIGluamVjdCwgaW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IG5vZGVUb1JlY3QgfSBmcm9tICcuLi8uLi91dGlscy9ub2Rlcyc7XG5pbXBvcnQgeyBGbG93U3RhdHVzU2VydmljZSwgaXNOb2RlRHJhZ0VuZFN0YXR1cywgaXNOb2RlRHJhZ1N0YXJ0U3RhdHVzIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZmxvdy1zdGF0dXMuc2VydmljZSc7XG5pbXBvcnQgeyByZWN0VG9SZWN0V2l0aFNpZGVzIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZWN0JztcbmltcG9ydCB7IEJveCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvYm94JztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCwgdG9PYnNlcnZhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgZmlsdGVyLCBtYXAsIHRhcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZXh0ZW5kZWRDb21wdXRlZCB9IGZyb20gJy4uLy4uL3V0aWxzL3NpZ25hbHMvZXh0ZW5kZWQtY29tcHV0ZWQnO1xuaW1wb3J0IHsgTm9kZVJlbmRlcmluZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9ub2RlLXJlbmRlcmluZy5zZXJ2aWNlJztcbmltcG9ydCB7IGdldFNwYWNlUG9pbnRzIH0gZnJvbSAnLi4vLi4vdXRpbHMvZ2V0LXNwYWNlLXBvaW50cyc7XG5cbmludGVyZmFjZSBJbnRlcnNlY3Rpb24ge1xuICBsaW5lczogKEJveCAmIHsgaXNDZW50ZXI6IGJvb2xlYW4gfSlbXTtcbiAgc25hcHBlZFg6IG51bWJlcjtcbiAgc25hcHBlZFk6IG51bWJlcjtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZ1thbGlnbm1lbnRIZWxwZXJdJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2FsaWdubWVudC1oZWxwZXIuY29tcG9uZW50Lmh0bWwnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgQWxpZ25tZW50SGVscGVyQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSBub2RlUmVuZGVyaW5nU2VydmljZSA9IGluamVjdChOb2RlUmVuZGVyaW5nU2VydmljZSk7XG4gIHByaXZhdGUgZmxvd1N0YXR1cyA9IGluamVjdChGbG93U3RhdHVzU2VydmljZSk7XG5cbiAgcmVhZG9ubHkgdG9sZXJhbmNlID0gaW5wdXQoMTApO1xuICByZWFkb25seSBsaW5lQ29sb3IgPSBpbnB1dCgnIzFiMjYyYycpO1xuXG4gIHByb3RlY3RlZCBpc05vZGVEcmFnZ2luZyA9IGNvbXB1dGVkKCgpID0+IGlzTm9kZURyYWdTdGFydFN0YXR1cyh0aGlzLmZsb3dTdGF0dXMuc3RhdHVzKCkpKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaW50ZXJzZWN0aW9ucyA9IGV4dGVuZGVkQ29tcHV0ZWQ8SW50ZXJzZWN0aW9uPigobGFzdFZhbHVlKSA9PiB7XG4gICAgY29uc3Qgc3RhdHVzID0gdGhpcy5mbG93U3RhdHVzLnN0YXR1cygpO1xuXG4gICAgaWYgKGlzTm9kZURyYWdTdGFydFN0YXR1cyhzdGF0dXMpKSB7XG4gICAgICBjb25zdCBub2RlID0gc3RhdHVzLnBheWxvYWQubm9kZTtcblxuICAgICAgY29uc3QgZCA9IHJlY3RUb1JlY3RXaXRoU2lkZXMobm9kZVRvUmVjdChub2RlKSk7XG4gICAgICBjb25zdCBvdGhlclJlY3RzID0gdGhpcy5ub2RlUmVuZGVyaW5nU2VydmljZVxuICAgICAgICAudmlld3BvcnROb2RlcygpXG4gICAgICAgIC5maWx0ZXIoKG4pID0+IG4gIT09IG5vZGUpXG4gICAgICAgIC8vIGRvIG5vdCBjaGVjayBjaGlsZHJlbiBvZiB0aGUgZHJhZ2dlZCBub2RlXG4gICAgICAgIC5maWx0ZXIoKG4pID0+ICFub2RlLmNoaWxkcmVuKCkuaW5jbHVkZXMobikpXG4gICAgICAgIC5tYXAoKG4pID0+IHJlY3RUb1JlY3RXaXRoU2lkZXMobm9kZVRvUmVjdChuKSkpO1xuXG4gICAgICBjb25zdCBsaW5lczogSW50ZXJzZWN0aW9uWydsaW5lcyddID0gW107XG5cbiAgICAgIGxldCBzbmFwcGVkWCA9IGQueDtcbiAgICAgIGxldCBzbmFwcGVkWSA9IGQueTtcbiAgICAgIGxldCBjbG9zZXN0WERpZmYgPSBJbmZpbml0eTtcbiAgICAgIGxldCBjbG9zZXN0WURpZmYgPSBJbmZpbml0eTtcblxuICAgICAgb3RoZXJSZWN0cy5mb3JFYWNoKChvKSA9PiB7XG4gICAgICAgIGNvbnN0IGRDZW50ZXJYID0gZC5sZWZ0ICsgZC53aWR0aCAvIDI7XG4gICAgICAgIGNvbnN0IG9DZW50ZXJYID0gby5sZWZ0ICsgby53aWR0aCAvIDI7XG5cbiAgICAgICAgZm9yIChjb25zdCBbZFgsIG9YLCBzbmFwWCwgaXNDZW50ZXJdIG9mIFtcbiAgICAgICAgICAvLyBjZW50ZXIgY2hlY2tcbiAgICAgICAgICBbZENlbnRlclgsIG9DZW50ZXJYLCBvQ2VudGVyWCAtIGQud2lkdGggLyAyLCB0cnVlXSBhcyBjb25zdCxcbiAgICAgICAgICBbZC5sZWZ0LCBvLmxlZnQsIG8ubGVmdCwgZmFsc2VdIGFzIGNvbnN0LFxuICAgICAgICAgIFtkLmxlZnQsIG8ucmlnaHQsIG8ucmlnaHQsIGZhbHNlXSBhcyBjb25zdCxcbiAgICAgICAgICBbZC5yaWdodCwgby5sZWZ0LCBvLmxlZnQgLSBkLndpZHRoLCBmYWxzZV0gYXMgY29uc3QsXG4gICAgICAgICAgW2QucmlnaHQsIG8ucmlnaHQsIG8ucmlnaHQgLSBkLndpZHRoLCBmYWxzZV0gYXMgY29uc3QsXG4gICAgICAgIF0pIHtcbiAgICAgICAgICBjb25zdCBkaWZmID0gTWF0aC5hYnMoZFggLSBvWCk7XG5cbiAgICAgICAgICBpZiAoZGlmZiA8PSB0aGlzLnRvbGVyYW5jZSgpKSB7XG4gICAgICAgICAgICBjb25zdCB5ID0gTWF0aC5taW4oZC50b3AsIG8udG9wKTtcbiAgICAgICAgICAgIGNvbnN0IHkyID0gTWF0aC5tYXgoZC5ib3R0b20sIG8uYm90dG9tKTtcblxuICAgICAgICAgICAgbGluZXMucHVzaCh7IHg6IG9YLCB5LCB4Mjogb1gsIHkyLCBpc0NlbnRlciB9KTtcblxuICAgICAgICAgICAgaWYgKGRpZmYgPCBjbG9zZXN0WERpZmYpIHtcbiAgICAgICAgICAgICAgY2xvc2VzdFhEaWZmID0gZGlmZjtcbiAgICAgICAgICAgICAgc25hcHBlZFggPSBzbmFwWDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlzQ2VudGVyKSBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkQ2VudGVyWSA9IGQudG9wICsgZC5oZWlnaHQgLyAyO1xuICAgICAgICBjb25zdCBvQ2VudGVyWSA9IG8udG9wICsgby5oZWlnaHQgLyAyO1xuXG4gICAgICAgIGZvciAoY29uc3QgW2RZLCBvWSwgc25hcFksIGlzQ2VudGVyXSBvZiBbXG4gICAgICAgICAgLy8gY2VudGVyIGNoZWNrXG4gICAgICAgICAgW2RDZW50ZXJZLCBvQ2VudGVyWSwgb0NlbnRlclkgLSBkLmhlaWdodCAvIDIsIHRydWVdIGFzIGNvbnN0LFxuICAgICAgICAgIFtkLnRvcCwgby50b3AsIG8udG9wLCBmYWxzZV0gYXMgY29uc3QsXG4gICAgICAgICAgW2QudG9wLCBvLmJvdHRvbSwgby5ib3R0b20sIGZhbHNlXSBhcyBjb25zdCxcbiAgICAgICAgICBbZC5ib3R0b20sIG8udG9wLCBvLnRvcCAtIGQuaGVpZ2h0LCBmYWxzZV0gYXMgY29uc3QsXG4gICAgICAgICAgW2QuYm90dG9tLCBvLmJvdHRvbSwgby5ib3R0b20gLSBkLmhlaWdodCwgZmFsc2VdIGFzIGNvbnN0LFxuICAgICAgICBdKSB7XG4gICAgICAgICAgY29uc3QgZGlmZiA9IE1hdGguYWJzKGRZIC0gb1kpO1xuXG4gICAgICAgICAgaWYgKGRpZmYgPD0gdGhpcy50b2xlcmFuY2UoKSkge1xuICAgICAgICAgICAgY29uc3QgeCA9IE1hdGgubWluKGQubGVmdCwgby5sZWZ0KTtcbiAgICAgICAgICAgIGNvbnN0IHgyID0gTWF0aC5tYXgoZC5yaWdodCwgby5yaWdodCk7XG5cbiAgICAgICAgICAgIGxpbmVzLnB1c2goeyB4LCB5OiBvWSwgeDIsIHkyOiBvWSwgaXNDZW50ZXIgfSk7XG5cbiAgICAgICAgICAgIGlmIChkaWZmIDwgY2xvc2VzdFlEaWZmKSB7XG4gICAgICAgICAgICAgIGNsb3Nlc3RZRGlmZiA9IGRpZmY7XG4gICAgICAgICAgICAgIHNuYXBwZWRZID0gc25hcFk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpc0NlbnRlcikgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHsgbGluZXMsIHNuYXBwZWRYLCBzbmFwcGVkWSB9O1xuICAgIH1cblxuICAgIHJldHVybiBsYXN0VmFsdWU7XG4gIH0pO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRvT2JzZXJ2YWJsZSh0aGlzLmZsb3dTdGF0dXMuc3RhdHVzKVxuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlcihpc05vZGVEcmFnRW5kU3RhdHVzKSxcbiAgICAgICAgbWFwKChzdGF0dXMpID0+IHN0YXR1cy5wYXlsb2FkLm5vZGUpLFxuICAgICAgICBtYXAoKG5vZGUpID0+IFtub2RlLCB0aGlzLmludGVyc2VjdGlvbnMoKV0gYXMgY29uc3QpLFxuICAgICAgICB0YXAoKFtub2RlLCBpbnRlcnNlY3Rpb25zXSkgPT4ge1xuICAgICAgICAgIGlmIChpbnRlcnNlY3Rpb25zKSB7XG4gICAgICAgICAgICBjb25zdCBzbmFwcGVkID0geyB4OiBpbnRlcnNlY3Rpb25zLnNuYXBwZWRYLCB5OiBpbnRlcnNlY3Rpb25zLnNuYXBwZWRZIH07XG4gICAgICAgICAgICBjb25zdCBwYXJlbnRJZkV4aXN0cyA9IG5vZGUucGFyZW50KCkgPyBbbm9kZS5wYXJlbnQoKSFdIDogW107XG5cbiAgICAgICAgICAgIG5vZGUuc2V0UG9pbnQoZ2V0U3BhY2VQb2ludHMoc25hcHBlZCwgcGFyZW50SWZFeGlzdHMpWzBdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQoKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxufVxuIiwiQGlmIChpc05vZGVEcmFnZ2luZygpKSB7XG4gIEBpZiAoaW50ZXJzZWN0aW9ucygpOyBhcyBpbnRlcnNlY3Rpb25zKSB7XG4gICAgQGZvciAoaW50ZXJzZWN0aW9uIG9mIGludGVyc2VjdGlvbnMubGluZXM7IHRyYWNrICRpbmRleCkge1xuICAgICAgPHN2ZzpsaW5lXG4gICAgICAgIFthdHRyLnN0cm9rZV09XCJsaW5lQ29sb3IoKVwiXG4gICAgICAgIFthdHRyLnN0cm9rZS1kYXNoYXJyYXldPVwiaW50ZXJzZWN0aW9uLmlzQ2VudGVyID8gNCA6IG51bGxcIlxuICAgICAgICBbYXR0ci54MV09XCJpbnRlcnNlY3Rpb24ueFwiXG4gICAgICAgIFthdHRyLnkxXT1cImludGVyc2VjdGlvbi55XCJcbiAgICAgICAgW2F0dHIueDJdPVwiaW50ZXJzZWN0aW9uLngyXCJcbiAgICAgICAgW2F0dHIueTJdPVwiaW50ZXJzZWN0aW9uLnkyXCIgLz5cbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -1,121 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, computed, effect, inject } from '@angular/core';
2
- import { ViewportService } from '../../services/viewport.service';
3
- import { RootSvgReferenceDirective } from '../../directives/reference.directive';
4
- import { id } from '../../utils/id';
5
- import { FlowSettingsService } from '../../services/flow-settings.service';
6
- import { toObservable } from '@angular/core/rxjs-interop';
7
- import { map, switchMap } from 'rxjs';
8
- import { toLazySignal } from '../../utils/signals/to-lazy-signal';
9
- import * as i0 from "@angular/core";
10
- const defaultBg = '#fff';
11
- const defaultGap = 20;
12
- const defaultDotSize = 2;
13
- const defaultDotColor = 'rgb(177, 177, 183)';
14
- const defaultImageScale = 0.1;
15
- const defaultRepeated = true;
16
- export class BackgroundComponent {
17
- constructor() {
18
- this.viewportService = inject(ViewportService);
19
- this.rootSvg = inject(RootSvgReferenceDirective).element;
20
- this.settingsService = inject(FlowSettingsService);
21
- this.backgroundSignal = this.settingsService.background;
22
- // DOTS PATTERN
23
- this.scaledGap = computed(() => {
24
- const background = this.backgroundSignal();
25
- if (background.type === 'dots') {
26
- const zoom = this.viewportService.readableViewport().zoom;
27
- return zoom * (background.gap ?? defaultGap);
28
- }
29
- return 0;
30
- });
31
- this.x = computed(() => this.viewportService.readableViewport().x % this.scaledGap());
32
- this.y = computed(() => this.viewportService.readableViewport().y % this.scaledGap());
33
- this.patternColor = computed(() => {
34
- const bg = this.backgroundSignal();
35
- if (bg.type === 'dots') {
36
- return bg.color ?? defaultDotColor;
37
- }
38
- return defaultDotColor;
39
- });
40
- this.patternSize = computed(() => {
41
- const background = this.backgroundSignal();
42
- if (background.type === 'dots') {
43
- return (this.viewportService.readableViewport().zoom * (background.size ?? defaultDotSize)) / 2;
44
- }
45
- return 0;
46
- });
47
- // IMAGE PATTERN
48
- this.bgImageSrc = computed(() => {
49
- const background = this.backgroundSignal();
50
- return background.type === 'image' ? background.src : '';
51
- });
52
- this.imageSize = toLazySignal(toObservable(this.backgroundSignal).pipe(switchMap(() => createImage(this.bgImageSrc())), map((image) => ({ width: image.naturalWidth, height: image.naturalHeight }))), { initialValue: { width: 0, height: 0 } });
53
- this.scaledImageWidth = computed(() => {
54
- const background = this.backgroundSignal();
55
- if (background.type === 'image') {
56
- const zoom = background.fixed ? 1 : this.viewportService.readableViewport().zoom;
57
- return this.imageSize().width * zoom * (background.scale ?? defaultImageScale);
58
- }
59
- return 0;
60
- });
61
- this.scaledImageHeight = computed(() => {
62
- const background = this.backgroundSignal();
63
- if (background.type === 'image') {
64
- const zoom = background.fixed ? 1 : this.viewportService.readableViewport().zoom;
65
- return this.imageSize().height * zoom * (background.scale ?? defaultImageScale);
66
- }
67
- return 0;
68
- });
69
- this.imageX = computed(() => {
70
- const background = this.backgroundSignal();
71
- if (background.type === 'image') {
72
- if (!background.repeat) {
73
- return background.fixed ? 0 : this.viewportService.readableViewport().x;
74
- }
75
- return background.fixed ? 0 : this.viewportService.readableViewport().x % this.scaledImageWidth();
76
- }
77
- return 0;
78
- });
79
- this.imageY = computed(() => {
80
- const background = this.backgroundSignal();
81
- if (background.type === 'image') {
82
- if (!background.repeat) {
83
- return background.fixed ? 0 : this.viewportService.readableViewport().y;
84
- }
85
- return background.fixed ? 0 : this.viewportService.readableViewport().y % this.scaledImageHeight();
86
- }
87
- return 0;
88
- });
89
- this.repeated = computed(() => {
90
- const background = this.backgroundSignal();
91
- return background.type === 'image' && (background.repeat ?? defaultRepeated);
92
- });
93
- // Without ID there will be pattern collision for several flows on the page
94
- // Later pattern ID may be exposed to API
95
- this.patternId = id();
96
- this.patternUrl = `url(#${this.patternId})`;
97
- effect(() => {
98
- const background = this.backgroundSignal();
99
- if (background.type === 'dots') {
100
- this.rootSvg.style.backgroundColor = background.backgroundColor ?? defaultBg;
101
- }
102
- if (background.type === 'solid') {
103
- this.rootSvg.style.backgroundColor = background.color;
104
- }
105
- });
106
- }
107
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BackgroundComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
108
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: BackgroundComponent, isStandalone: true, selector: "g[background]", ngImport: i0, template: "@if (backgroundSignal().type === 'dots') {\n <svg:pattern\n patternUnits=\"userSpaceOnUse\"\n [attr.id]=\"patternId\"\n [attr.x]=\"x()\"\n [attr.y]=\"y()\"\n [attr.width]=\"scaledGap()\"\n [attr.height]=\"scaledGap()\">\n <svg:circle\n [attr.cx]=\"patternSize()\"\n [attr.cy]=\"patternSize()\"\n [attr.r]=\"patternSize()\"\n [attr.fill]=\"patternColor()\" />\n </svg:pattern>\n\n <svg:rect x=\"0\" y=\"0\" width=\"100%\" height=\"100%\" [attr.fill]=\"patternUrl\" />\n}\n\n@if (backgroundSignal().type === 'image') {\n @if (repeated()) {\n <svg:pattern\n patternUnits=\"userSpaceOnUse\"\n [attr.id]=\"patternId\"\n [attr.x]=\"imageX()\"\n [attr.y]=\"imageY()\"\n [attr.width]=\"scaledImageWidth()\"\n [attr.height]=\"scaledImageHeight()\">\n <svg:image [attr.href]=\"bgImageSrc()\" [attr.width]=\"scaledImageWidth()\" [attr.height]=\"scaledImageHeight()\" />\n </svg:pattern>\n\n <svg:rect x=\"0\" y=\"0\" width=\"100%\" height=\"100%\" [attr.fill]=\"patternUrl\" />\n }\n\n @if (!repeated()) {\n <svg:image\n [attr.x]=\"imageX()\"\n [attr.y]=\"imageY()\"\n [attr.width]=\"scaledImageWidth()\"\n [attr.height]=\"scaledImageHeight()\"\n [attr.href]=\"bgImageSrc()\" />\n }\n}\n", changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
109
- }
110
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BackgroundComponent, decorators: [{
111
- type: Component,
112
- args: [{ standalone: true, selector: 'g[background]', changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (backgroundSignal().type === 'dots') {\n <svg:pattern\n patternUnits=\"userSpaceOnUse\"\n [attr.id]=\"patternId\"\n [attr.x]=\"x()\"\n [attr.y]=\"y()\"\n [attr.width]=\"scaledGap()\"\n [attr.height]=\"scaledGap()\">\n <svg:circle\n [attr.cx]=\"patternSize()\"\n [attr.cy]=\"patternSize()\"\n [attr.r]=\"patternSize()\"\n [attr.fill]=\"patternColor()\" />\n </svg:pattern>\n\n <svg:rect x=\"0\" y=\"0\" width=\"100%\" height=\"100%\" [attr.fill]=\"patternUrl\" />\n}\n\n@if (backgroundSignal().type === 'image') {\n @if (repeated()) {\n <svg:pattern\n patternUnits=\"userSpaceOnUse\"\n [attr.id]=\"patternId\"\n [attr.x]=\"imageX()\"\n [attr.y]=\"imageY()\"\n [attr.width]=\"scaledImageWidth()\"\n [attr.height]=\"scaledImageHeight()\">\n <svg:image [attr.href]=\"bgImageSrc()\" [attr.width]=\"scaledImageWidth()\" [attr.height]=\"scaledImageHeight()\" />\n </svg:pattern>\n\n <svg:rect x=\"0\" y=\"0\" width=\"100%\" height=\"100%\" [attr.fill]=\"patternUrl\" />\n }\n\n @if (!repeated()) {\n <svg:image\n [attr.x]=\"imageX()\"\n [attr.y]=\"imageY()\"\n [attr.width]=\"scaledImageWidth()\"\n [attr.height]=\"scaledImageHeight()\"\n [attr.href]=\"bgImageSrc()\" />\n }\n}\n" }]
113
- }], ctorParameters: () => [] });
114
- function createImage(url) {
115
- const image = new Image();
116
- image.src = url;
117
- return new Promise((resolve) => {
118
- image.onload = () => resolve(image);
119
- });
120
- }
121
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja2dyb3VuZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdmZsb3ctbGliL3NyYy9saWIvdmZsb3cvY29tcG9uZW50cy9iYWNrZ3JvdW5kL2JhY2tncm91bmQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXZmbG93LWxpYi9zcmMvbGliL3ZmbG93L2NvbXBvbmVudHMvYmFja2dyb3VuZC9iYWNrZ3JvdW5kLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0YsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDMUQsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9DQUFvQyxDQUFDOztBQUVsRSxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUM7QUFDekIsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFDO0FBQ3RCLE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQztBQUN6QixNQUFNLGVBQWUsR0FBRyxvQkFBb0IsQ0FBQztBQUM3QyxNQUFNLGlCQUFpQixHQUFHLEdBQUcsQ0FBQztBQUM5QixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUM7QUFR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Q0FBQyxPQUFPLEVBQUUsRUFBRTtRQUMvQyxLQUFLLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0QyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBjb21wdXRlZCwgZWZmZWN0LCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFZpZXdwb3J0U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3ZpZXdwb3J0LnNlcnZpY2UnO1xuaW1wb3J0IHsgUm9vdFN2Z1JlZmVyZW5jZURpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvcmVmZXJlbmNlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBpZCB9IGZyb20gJy4uLy4uL3V0aWxzL2lkJztcbmltcG9ydCB7IEZsb3dTZXR0aW5nc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9mbG93LXNldHRpbmdzLnNlcnZpY2UnO1xuaW1wb3J0IHsgdG9PYnNlcnZhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgbWFwLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRvTGF6eVNpZ25hbCB9IGZyb20gJy4uLy4uL3V0aWxzL3NpZ25hbHMvdG8tbGF6eS1zaWduYWwnO1xuXG5jb25zdCBkZWZhdWx0QmcgPSAnI2ZmZic7XG5jb25zdCBkZWZhdWx0R2FwID0gMjA7XG5jb25zdCBkZWZhdWx0RG90U2l6ZSA9IDI7XG5jb25zdCBkZWZhdWx0RG90Q29sb3IgPSAncmdiKDE3NywgMTc3LCAxODMpJztcbmNvbnN0IGRlZmF1bHRJbWFnZVNjYWxlID0gMC4xO1xuY29uc3QgZGVmYXVsdFJlcGVhdGVkID0gdHJ1ZTtcblxuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHNlbGVjdG9yOiAnZ1tiYWNrZ3JvdW5kXScsXG4gIHRlbXBsYXRlVXJsOiAnLi9iYWNrZ3JvdW5kLmNvbXBvbmVudC5odG1sJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEJhY2tncm91bmRDb21wb25lbnQge1xuICBwcml2YXRlIHZpZXdwb3J0U2VydmljZSA9IGluamVjdChWaWV3cG9ydFNlcnZpY2UpO1xuICBwcml2YXRlIHJvb3RTdmcgPSBpbmplY3QoUm9vdFN2Z1JlZmVyZW5jZURpcmVjdGl2ZSkuZWxlbWVudDtcbiAgcHJpdmF0ZSBzZXR0aW5nc1NlcnZpY2UgPSBpbmplY3QoRmxvd1NldHRpbmdzU2VydmljZSk7XG5cbiAgcHJvdGVjdGVkIGJhY2tncm91bmRTaWduYWwgPSB0aGlzLnNldHRpbmdzU2VydmljZS5iYWNrZ3JvdW5kO1xuXG4gIC8vIERPVFMgUEFUVEVSTlxuICBwcm90ZWN0ZWQgc2NhbGVkR2FwID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGJhY2tncm91bmQgPSB0aGlzLmJhY2tncm91bmRTaWduYWwoKTtcblxuICAgIGlmIChiYWNrZ3JvdW5kLnR5cGUgPT09ICdkb3RzJykge1xuICAgICAgY29uc3Qgem9vbSA9IHRoaXMudmlld3BvcnRTZXJ2aWNlLnJlYWRhYmxlVmlld3BvcnQoKS56b29tO1xuXG4gICAgICByZXR1cm4gem9vbSAqIChiYWNrZ3JvdW5kLmdhcCA/PyBkZWZhdWx0R2FwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfSk7XG5cbiAgcHJvdGVjdGVkIHggPSBjb21wdXRlZCgoKSA9PiB0aGlzLnZpZXdwb3J0U2VydmljZS5yZWFkYWJsZVZpZXdwb3J0KCkueCAlIHRoaXMuc2NhbGVkR2FwKCkpO1xuXG4gIHByb3RlY3RlZCB5ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy52aWV3cG9ydFNlcnZpY2UucmVhZGFibGVWaWV3cG9ydCgpLnkgJSB0aGlzLnNjYWxlZEdhcCgpKTtcblxuICBwcm90ZWN0ZWQgcGF0dGVybkNvbG9yID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGJnID0gdGhpcy5iYWNrZ3JvdW5kU2lnbmFsKCk7XG5cbiAgICBpZiAoYmcudHlwZSA9PT0gJ2RvdHMnKSB7XG4gICAgICByZXR1cm4gYmcuY29sb3IgPz8gZGVmYXVsdERvdENvbG9yO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZhdWx0RG90Q29sb3I7XG4gIH0pO1xuXG4gIHByb3RlY3RlZCBwYXR0ZXJuU2l6ZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBiYWNrZ3JvdW5kID0gdGhpcy5iYWNrZ3JvdW5kU2lnbmFsKCk7XG5cbiAgICBpZiAoYmFja2dyb3VuZC50eXBlID09PSAnZG90cycpIHtcbiAgICAgIHJldHVybiAodGhpcy52aWV3cG9ydFNlcnZpY2UucmVhZGFibGVWaWV3cG9ydCgpLnpvb20gKiAoYmFja2dyb3VuZC5zaXplID8/IGRlZmF1bHREb3RTaXplKSkgLyAyO1xuICAgIH1cblxuICAgIHJldHVybiAwO1xuICB9KTtcblxuICAvLyBJTUFHRSBQQVRURVJOXG4gIHByb3RlY3RlZCBiZ0ltYWdlU3JjID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGJhY2tncm91bmQgPSB0aGlzLmJhY2tncm91bmRTaWduYWwoKTtcblxuICAgIHJldHVybiBiYWNrZ3JvdW5kLnR5cGUgPT09ICdpbWFnZScgPyBiYWNrZ3JvdW5kLnNyYyA6ICcnO1xuICB9KTtcblxuICBwcm90ZWN0ZWQgaW1hZ2VTaXplID0gdG9MYXp5U2lnbmFsKFxuICAgIHRvT2JzZXJ2YWJsZSh0aGlzLmJhY2tncm91bmRTaWduYWwpLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4gY3JlYXRlSW1hZ2UodGhpcy5iZ0ltYWdlU3JjKCkpKSxcbiAgICAgIG1hcCgoaW1hZ2UpID0+ICh7IHdpZHRoOiBpbWFnZS5uYXR1cmFsV2lkdGgsIGhlaWdodDogaW1hZ2UubmF0dXJhbEhlaWdodCB9KSksXG4gICAgKSxcbiAgICB7IGluaXRpYWxWYWx1ZTogeyB3aWR0aDogMCwgaGVpZ2h0OiAwIH0gfSxcbiAgKTtcblxuICBwcm90ZWN0ZWQgc2NhbGVkSW1hZ2VXaWR0aCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBiYWNrZ3JvdW5kID0gdGhpcy5iYWNrZ3JvdW5kU2lnbmFsKCk7XG5cbiAgICBpZiAoYmFja2dyb3VuZC50eXBlID09PSAnaW1hZ2UnKSB7XG4gICAgICBjb25zdCB6b29tID0gYmFja2dyb3VuZC5maXhlZCA/IDEgOiB0aGlzLnZpZXdwb3J0U2VydmljZS5yZWFkYWJsZVZpZXdwb3J0KCkuem9vbTtcblxuICAgICAgcmV0dXJuIHRoaXMuaW1hZ2VTaXplKCkud2lkdGggKiB6b29tICogKGJhY2tncm91bmQuc2NhbGUgPz8gZGVmYXVsdEltYWdlU2NhbGUpO1xuICAgIH1cblxuICAgIHJldHVybiAwO1xuICB9KTtcblxuICBwcm90ZWN0ZWQgc2NhbGVkSW1hZ2VIZWlnaHQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgYmFja2dyb3VuZCA9IHRoaXMuYmFja2dyb3VuZFNpZ25hbCgpO1xuXG4gICAgaWYgKGJhY2tncm91bmQudHlwZSA9PT0gJ2ltYWdlJykge1xuICAgICAgY29uc3Qgem9vbSA9IGJhY2tncm91bmQuZml4ZWQgPyAxIDogdGhpcy52aWV3cG9ydFNlcnZpY2UucmVhZGFibGVWaWV3cG9ydCgpLnpvb207XG5cbiAgICAgIHJldHVybiB0aGlzLmltYWdlU2l6ZSgpLmhlaWdodCAqIHpvb20gKiAoYmFja2dyb3VuZC5zY2FsZSA/PyBkZWZhdWx0SW1hZ2VTY2FsZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG4gIH0pO1xuXG4gIHByb3RlY3RlZCBpbWFnZVggPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgYmFja2dyb3VuZCA9IHRoaXMuYmFja2dyb3VuZFNpZ25hbCgpO1xuXG4gICAgaWYgKGJhY2tncm91bmQudHlwZSA9PT0gJ2ltYWdlJykge1xuICAgICAgaWYgKCFiYWNrZ3JvdW5kLnJlcGVhdCkge1xuICAgICAgICByZXR1cm4gYmFja2dyb3VuZC5maXhlZCA/IDAgOiB0aGlzLnZpZXdwb3J0U2VydmljZS5yZWFkYWJsZVZpZXdwb3J0KCkueDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGJhY2tncm91bmQuZml4ZWQgPyAwIDogdGhpcy52aWV3cG9ydFNlcnZpY2UucmVhZGFibGVWaWV3cG9ydCgpLnggJSB0aGlzLnNjYWxlZEltYWdlV2lkdGgoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfSk7XG5cbiAgcHJvdGVjdGVkIGltYWdlWSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBiYWNrZ3JvdW5kID0gdGhpcy5iYWNrZ3JvdW5kU2lnbmFsKCk7XG5cbiAgICBpZiAoYmFja2dyb3VuZC50eXBlID09PSAnaW1hZ2UnKSB7XG4gICAgICBpZiAoIWJhY2tncm91bmQucmVwZWF0KSB7XG4gICAgICAgIHJldHVybiBiYWNrZ3JvdW5kLmZpeGVkID8gMCA6IHRoaXMudmlld3BvcnRTZXJ2aWNlLnJlYWRhYmxlVmlld3BvcnQoKS55O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYmFja2dyb3VuZC5maXhlZCA/IDAgOiB0aGlzLnZpZXdwb3J0U2VydmljZS5yZWFkYWJsZVZpZXdwb3J0KCkueSAlIHRoaXMuc2NhbGVkSW1hZ2VIZWlnaHQoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfSk7XG5cbiAgcHJvdGVjdGVkIHJlcGVhdGVkID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGJhY2tncm91bmQgPSB0aGlzLmJhY2tncm91bmRTaWduYWwoKTtcblxuICAgIHJldHVybiBiYWNrZ3JvdW5kLnR5cGUgPT09ICdpbWFnZScgJiYgKGJhY2tncm91bmQucmVwZWF0ID8/IGRlZmF1bHRSZXBlYXRlZCk7XG4gIH0pO1xuXG4gIC8vIFdpdGhvdXQgSUQgdGhlcmUgd2lsbCBiZSBwYXR0ZXJuIGNvbGxpc2lvbiBmb3Igc2V2ZXJhbCBmbG93cyBvbiB0aGUgcGFnZVxuICAvLyBMYXRlciBwYXR0ZXJuIElEIG1heSBiZSBleHBvc2VkIHRvIEFQSVxuICBwcm90ZWN0ZWQgcGF0dGVybklkID0gaWQoKTtcbiAgcHJvdGVjdGVkIHBhdHRlcm5VcmwgPSBgdXJsKCMke3RoaXMucGF0dGVybklkfSlgO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBiYWNrZ3JvdW5kID0gdGhpcy5iYWNrZ3JvdW5kU2lnbmFsKCk7XG5cbiAgICAgIGlmIChiYWNrZ3JvdW5kLnR5cGUgPT09ICdkb3RzJykge1xuICAgICAgICB0aGlzLnJvb3RTdmcuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gYmFja2dyb3VuZC5iYWNrZ3JvdW5kQ29sb3IgPz8gZGVmYXVsdEJnO1xuICAgICAgfVxuXG4gICAgICBpZiAoYmFja2dyb3VuZC50eXBlID09PSAnc29saWQnKSB7XG4gICAgICAgIHRoaXMucm9vdFN2Zy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBiYWNrZ3JvdW5kLmNvbG9yO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUltYWdlKHVybDogc3RyaW5nKSB7XG4gIGNvbnN0IGltYWdlID0gbmV3IEltYWdlKCk7XG5cbiAgaW1hZ2Uuc3JjID0gdXJsO1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZTxIVE1MSW1hZ2VFbGVtZW50PigocmVzb2x2ZSkgPT4ge1xuICAgIGltYWdlLm9ubG9hZCA9ICgpID0+IHJlc29sdmUoaW1hZ2UpO1xuICB9KTtcbn1cbiIsIkBpZiAoYmFja2dyb3VuZFNpZ25hbCgpLnR5cGUgPT09ICdkb3RzJykge1xuICA8c3ZnOnBhdHRlcm5cbiAgICBwYXR0ZXJuVW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiXG4gICAgW2F0dHIuaWRdPVwicGF0dGVybklkXCJcbiAgICBbYXR0ci54XT1cIngoKVwiXG4gICAgW2F0dHIueV09XCJ5KClcIlxuICAgIFthdHRyLndpZHRoXT1cInNjYWxlZEdhcCgpXCJcbiAgICBbYXR0ci5oZWlnaHRdPVwic2NhbGVkR2FwKClcIj5cbiAgICA8c3ZnOmNpcmNsZVxuICAgICAgW2F0dHIuY3hdPVwicGF0dGVyblNpemUoKVwiXG4gICAgICBbYXR0ci5jeV09XCJwYXR0ZXJuU2l6ZSgpXCJcbiAgICAgIFthdHRyLnJdPVwicGF0dGVyblNpemUoKVwiXG4gICAgICBbYXR0ci5maWxsXT1cInBhdHRlcm5Db2xvcigpXCIgLz5cbiAgPC9zdmc6cGF0dGVybj5cblxuICA8c3ZnOnJlY3QgeD1cIjBcIiB5PVwiMFwiIHdpZHRoPVwiMTAwJVwiIGhlaWdodD1cIjEwMCVcIiBbYXR0ci5maWxsXT1cInBhdHRlcm5VcmxcIiAvPlxufVxuXG5AaWYgKGJhY2tncm91bmRTaWduYWwoKS50eXBlID09PSAnaW1hZ2UnKSB7XG4gIEBpZiAocmVwZWF0ZWQoKSkge1xuICAgIDxzdmc6cGF0dGVyblxuICAgICAgcGF0dGVyblVuaXRzPVwidXNlclNwYWNlT25Vc2VcIlxuICAgICAgW2F0dHIuaWRdPVwicGF0dGVybklkXCJcbiAgICAgIFthdHRyLnhdPVwiaW1hZ2VYKClcIlxuICAgICAgW2F0dHIueV09XCJpbWFnZVkoKVwiXG4gICAgICBbYXR0ci53aWR0aF09XCJzY2FsZWRJbWFnZVdpZHRoKClcIlxuICAgICAgW2F0dHIuaGVpZ2h0XT1cInNjYWxlZEltYWdlSGVpZ2h0KClcIj5cbiAgICAgIDxzdmc6aW1hZ2UgW2F0dHIuaHJlZl09XCJiZ0ltYWdlU3JjKClcIiBbYXR0ci53aWR0aF09XCJzY2FsZWRJbWFnZVdpZHRoKClcIiBbYXR0ci5oZWlnaHRdPVwic2NhbGVkSW1hZ2VIZWlnaHQoKVwiIC8+XG4gICAgPC9zdmc6cGF0dGVybj5cblxuICAgIDxzdmc6cmVjdCB4PVwiMFwiIHk9XCIwXCIgd2lkdGg9XCIxMDAlXCIgaGVpZ2h0PVwiMTAwJVwiIFthdHRyLmZpbGxdPVwicGF0dGVyblVybFwiIC8+XG4gIH1cblxuICBAaWYgKCFyZXBlYXRlZCgpKSB7XG4gICAgPHN2ZzppbWFnZVxuICAgICAgW2F0dHIueF09XCJpbWFnZVgoKVwiXG4gICAgICBbYXR0ci55XT1cImltYWdlWSgpXCJcbiAgICAgIFthdHRyLndpZHRoXT1cInNjYWxlZEltYWdlV2lkdGgoKVwiXG4gICAgICBbYXR0ci5oZWlnaHRdPVwic2NhbGVkSW1hZ2VIZWlnaHQoKVwiXG4gICAgICBbYXR0ci5ocmVmXT1cImJnSW1hZ2VTcmMoKVwiIC8+XG4gIH1cbn1cbiJdfQ==
@@ -1,157 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';
2
- import { FlowStatusService } from '../../services/flow-status.service';
3
- import { straightPath } from '../../math/edge-path/straigh-path';
4
- import { SpacePointContextDirective } from '../../directives/space-point-context.directive';
5
- import { bezierPath } from '../../math/edge-path/bezier-path';
6
- import { hashCode } from '../../utils/hash';
7
- import { smoothStepPath } from '../../math/edge-path/smooth-step-path';
8
- import { NgTemplateOutlet } from '@angular/common';
9
- import { FlowEntitiesService } from '../../services/flow-entities.service';
10
- import * as i0 from "@angular/core";
11
- export class ConnectionComponent {
12
- constructor() {
13
- this.flowStatusService = inject(FlowStatusService);
14
- this.spacePointContext = inject(SpacePointContextDirective);
15
- this.flowEntitiesService = inject(FlowEntitiesService);
16
- this.model = input.required();
17
- this.template = input();
18
- this.path = computed(() => {
19
- const status = this.flowStatusService.status();
20
- const curve = this.model().curve;
21
- if (status.state === 'connection-start' || status.state === 'reconnection-start') {
22
- const sourceHandle = status.payload.sourceHandle;
23
- const sourcePoint = sourceHandle.pointAbsolute();
24
- const sourcePosition = sourceHandle.rawHandle.position;
25
- const targetPoint = this.spacePointContext.svgCurrentSpacePoint();
26
- const targetPosition = getOppositePostion(sourceHandle.rawHandle.position);
27
- const params = this.getPathFactoryParams(sourcePoint, targetPoint, sourcePosition, targetPosition);
28
- switch (curve) {
29
- case 'straight':
30
- return straightPath(params).path;
31
- case 'bezier':
32
- return bezierPath(params).path;
33
- case 'smooth-step':
34
- return smoothStepPath(params).path;
35
- case 'step':
36
- return smoothStepPath(params, 0).path;
37
- default:
38
- return curve(params).path;
39
- }
40
- }
41
- if (status.state === 'connection-validation' || status.state === 'reconnection-validation') {
42
- const sourceHandle = status.payload.sourceHandle;
43
- const sourcePoint = sourceHandle.pointAbsolute();
44
- const sourcePosition = sourceHandle.rawHandle.position;
45
- const targetHandle = status.payload.targetHandle;
46
- // ignore magnet if validation failed
47
- const targetPoint = status.payload.valid
48
- ? targetHandle.pointAbsolute()
49
- : this.spacePointContext.svgCurrentSpacePoint();
50
- const targetPosition = status.payload.valid
51
- ? targetHandle.rawHandle.position
52
- : getOppositePostion(sourceHandle.rawHandle.position);
53
- const params = this.getPathFactoryParams(sourcePoint, targetPoint, sourcePosition, targetPosition);
54
- switch (curve) {
55
- case 'straight':
56
- return straightPath(params).path;
57
- case 'bezier':
58
- return bezierPath(params).path;
59
- case 'smooth-step':
60
- return smoothStepPath(params).path;
61
- case 'step':
62
- return smoothStepPath(params, 0).path;
63
- default:
64
- return curve(params).path;
65
- }
66
- }
67
- return null;
68
- });
69
- this.markerUrl = computed(() => {
70
- const marker = this.model().settings.marker;
71
- if (marker) {
72
- return `url(#${hashCode(JSON.stringify(marker))})`;
73
- }
74
- return '';
75
- });
76
- this.defaultColor = 'rgb(177, 177, 183)';
77
- }
78
- // TODO: move context to model
79
- getContext() {
80
- return {
81
- $implicit: {
82
- path: this.path,
83
- marker: this.markerUrl,
84
- },
85
- };
86
- }
87
- getPathFactoryParams(sourcePoint, targetPoint, sourcePosition, targetPosition) {
88
- return {
89
- mode: 'connection',
90
- sourcePoint,
91
- targetPoint,
92
- sourcePosition,
93
- targetPosition,
94
- allEdges: this.flowEntitiesService.rawEdges(),
95
- allNodes: this.flowEntitiesService.rawNodes(),
96
- };
97
- }
98
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ConnectionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
99
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: ConnectionComponent, isStandalone: true, selector: "g[connection]", inputs: { model: { classPropertyName: "model", publicName: "model", isSignal: true, isRequired: true, transformFunction: null }, template: { classPropertyName: "template", publicName: "template", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
100
- @if (model().type === 'default') {
101
- @if (path(); as path) {
102
- <svg:path
103
- fill="none"
104
- stroke-width="2"
105
- [attr.d]="path"
106
- [attr.marker-end]="markerUrl()"
107
- [attr.stroke]="defaultColor" />
108
- }
109
- }
110
-
111
- @if (model().type === 'template') {
112
- @if (template(); as template) {
113
- <ng-container *ngTemplateOutlet="template; context: getContext()" />
114
- }
115
- }
116
- `, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
117
- }
118
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ConnectionComponent, decorators: [{
119
- type: Component,
120
- args: [{
121
- standalone: true,
122
- selector: 'g[connection]',
123
- template: `
124
- @if (model().type === 'default') {
125
- @if (path(); as path) {
126
- <svg:path
127
- fill="none"
128
- stroke-width="2"
129
- [attr.d]="path"
130
- [attr.marker-end]="markerUrl()"
131
- [attr.stroke]="defaultColor" />
132
- }
133
- }
134
-
135
- @if (model().type === 'template') {
136
- @if (template(); as template) {
137
- <ng-container *ngTemplateOutlet="template; context: getContext()" />
138
- }
139
- }
140
- `,
141
- changeDetection: ChangeDetectionStrategy.OnPush,
142
- imports: [NgTemplateOutlet],
143
- }]
144
- }] });
145
- function getOppositePostion(position) {
146
- switch (position) {
147
- case 'top':
148
- return 'bottom';
149
- case 'bottom':
150
- return 'top';
151
- case 'left':
152
- return 'right';
153
- case 'right':
154
- return 'left';
155
- }
156
- }
157
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29ubmVjdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdmZsb3ctbGliL3NyYy9saWIvdmZsb3cvY29tcG9uZW50cy9jb25uZWN0aW9uL2Nvbm5lY3Rpb24uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQWUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekcsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDdkUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBRTVGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUM5RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFNUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBSW5ELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDOztBQTBCM0UsTUFBTSxPQUFPLG1CQUFtQjtJQXhCaEM7UUF5Qm1CLHNCQUFpQixHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzlDLHNCQUFpQixHQUFHLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBQ3ZELHdCQUFtQixHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBRTVELFVBQUssR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFtQixDQUFDO1FBRTFDLGFBQVEsR0FBRyxLQUFLLEVBQW9CLENBQUM7UUFFbEMsU0FBSSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDN0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQy9DLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFFakMsSUFBSSxNQUFNLENBQUMsS0FBSyxLQUFLLGtCQUFrQixJQUFJLE1BQU0sQ0FBQyxLQUFLLEtBQUssb0JBQW9CLEVBQUUsQ0FBQztnQkFDakYsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUM7Z0JBQ2pELE1BQU0sV0FBVyxHQUFHLFlBQVksQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDakQsTUFBTSxjQUFjLEdBQUcsWUFBWSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUM7Z0JBRXZELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO2dCQUNsRSxNQUFNLGNBQWMsR0FBRyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUUzRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsY0FBYyxDQUFDLENBQUM7Z0JBRW5HLFFBQVEsS0FBSyxFQUFFLENBQUM7b0JBQ2QsS0FBSyxVQUFVO3dCQUNiLE9BQU8sWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQztvQkFDbkMsS0FBSyxRQUFRO3dCQUNYLE9BQU8sVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQztvQkFDakMsS0FBSyxhQUFhO3dCQUNoQixPQUFPLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUM7b0JBQ3JDLEtBQUssTUFBTTt3QkFDVCxPQUFPLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO29CQUN4Qzt3QkFDRSxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUM7Z0JBQzlCLENBQUM7WUFDSCxDQUFDO1lBRUQsSUFBSSxNQUFNLENBQUMsS0FBSyxLQUFLLHVCQUF1QixJQUFJLE1BQU0sQ0FBQyxLQUFLLEtBQUsseUJBQXlCLEVBQUUsQ0FBQztnQkFDM0YsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUM7Z0JBQ2pELE1BQU0sV0FBVyxHQUFHLFlBQVksQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDakQsTUFBTSxjQUFjLEdBQUcsWUFBWSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUM7Z0JBRXZELE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDO2dCQUNqRCxxQ0FBcUM7Z0JBQ3JDLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSztvQkFDdEMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxhQUFhLEVBQUU7b0JBQzlCLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztnQkFDbEQsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLO29CQUN6QyxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxRQUFRO29CQUNqQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFFeEQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLGNBQWMsQ0FBQyxDQUFDO2dCQUVuRyxRQUFRLEtBQUssRUFBRSxDQUFDO29CQUNkLEtBQUssVUFBVTt3QkFDYixPQUFPLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUM7b0JBQ25DLEtBQUssUUFBUTt3QkFDWCxPQUFPLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUM7b0JBQ2pDLEtBQUssYUFBYTt3QkFDaEIsT0FBTyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDO29CQUNyQyxLQUFLLE1BQU07d0JBQ1QsT0FBTyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztvQkFDeEM7d0JBQ0UsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUM5QixDQUFDO1lBQ0gsQ0FBQztZQUVELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFDLENBQUM7UUFFTyxjQUFTLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUNsQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUU1QyxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNYLE9BQU8sUUFBUSxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUM7WUFDckQsQ0FBQztZQUVELE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQyxDQUFDLENBQUM7UUFFZ0IsaUJBQVksR0FBRyxvQkFBb0IsQ0FBQztLQTRCeEQ7SUExQkMsOEJBQThCO0lBQ3BCLFVBQVU7UUFDbEIsT0FBTztZQUNMLFNBQVMsRUFBRTtnQkFDVCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7Z0JBQ2YsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTO2FBQ3ZCO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTyxvQkFBb0IsQ0FDMUIsV0FBa0IsRUFDbEIsV0FBa0IsRUFDbEIsY0FBd0IsRUFDeEIsY0FBd0I7UUFFeEIsT0FBTztZQUNMLElBQUksRUFBRSxZQUFZO1lBQ2xCLFdBQVc7WUFDWCxXQUFXO1lBQ1gsY0FBYztZQUNkLGNBQWM7WUFDZCxRQUFRLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRTtZQUM3QyxRQUFRLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRTtTQUM5QyxDQUFDO0lBQ0osQ0FBQzsrR0EzR1UsbUJBQW1CO21HQUFuQixtQkFBbUIsNlVBckJwQjs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQlQsNERBRVMsZ0JBQWdCOzs0RkFFZixtQkFBbUI7a0JBeEIvQixTQUFTO21CQUFDO29CQUNULFVBQVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUUsZUFBZTtvQkFDekIsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCVDtvQkFDRCxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtvQkFDL0MsT0FBTyxFQUFFLENBQUMsZ0JBQWdCLENBQUM7aUJBQzVCOztBQStHRCxTQUFTLGtCQUFrQixDQUFDLFFBQWtCO0lBQzVDLFFBQVEsUUFBUSxFQUFFLENBQUM7UUFDakIsS0FBSyxLQUFLO1lBQ1IsT0FBTyxRQUFRLENBQUM7UUFDbEIsS0FBSyxRQUFRO1lBQ1gsT0FBTyxLQUFLLENBQUM7UUFDZixLQUFLLE1BQU07WUFDVCxPQUFPLE9BQU8sQ0FBQztRQUNqQixLQUFLLE9BQU87WUFDVixPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIFRlbXBsYXRlUmVmLCBjb21wdXRlZCwgaW5qZWN0LCBpbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRmxvd1N0YXR1c1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9mbG93LXN0YXR1cy5zZXJ2aWNlJztcbmltcG9ydCB7IHN0cmFpZ2h0UGF0aCB9IGZyb20gJy4uLy4uL21hdGgvZWRnZS1wYXRoL3N0cmFpZ2gtcGF0aCc7XG5pbXBvcnQgeyBTcGFjZVBvaW50Q29udGV4dERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvc3BhY2UtcG9pbnQtY29udGV4dC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgQ29ubmVjdGlvbk1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2Nvbm5lY3Rpb24ubW9kZWwnO1xuaW1wb3J0IHsgYmV6aWVyUGF0aCB9IGZyb20gJy4uLy4uL21hdGgvZWRnZS1wYXRoL2Jlemllci1wYXRoJztcbmltcG9ydCB7IGhhc2hDb2RlIH0gZnJvbSAnLi4vLi4vdXRpbHMvaGFzaCc7XG5pbXBvcnQgeyBQb3NpdGlvbiB9IGZyb20gJy4uLy4uL3R5cGVzL3Bvc2l0aW9uLnR5cGUnO1xuaW1wb3J0IHsgc21vb3RoU3RlcFBhdGggfSBmcm9tICcuLi8uLi9tYXRoL2VkZ2UtcGF0aC9zbW9vdGgtc3RlcC1wYXRoJztcbmltcG9ydCB7IE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29ubmVjdGlvbkNvbnRleHQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3RlbXBsYXRlLWNvbnRleHQuaW50ZXJmYWNlJztcbmltcG9ydCB7IFBvaW50IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9wb2ludC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQ3VydmVGYWN0b3J5UGFyYW1zIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9jdXJ2ZS1mYWN0b3J5LmludGVyZmFjZSc7XG5pbXBvcnQgeyBGbG93RW50aXRpZXNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZmxvdy1lbnRpdGllcy5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHNlbGVjdG9yOiAnZ1tjb25uZWN0aW9uXScsXG4gIHRlbXBsYXRlOiBgXG4gICAgQGlmIChtb2RlbCgpLnR5cGUgPT09ICdkZWZhdWx0Jykge1xuICAgICAgQGlmIChwYXRoKCk7IGFzIHBhdGgpIHtcbiAgICAgICAgPHN2ZzpwYXRoXG4gICAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxuICAgICAgICAgIFthdHRyLmRdPVwicGF0aFwiXG4gICAgICAgICAgW2F0dHIubWFya2VyLWVuZF09XCJtYXJrZXJVcmwoKVwiXG4gICAgICAgICAgW2F0dHIuc3Ryb2tlXT1cImRlZmF1bHRDb2xvclwiIC8+XG4gICAgICB9XG4gICAgfVxuXG4gICAgQGlmIChtb2RlbCgpLnR5cGUgPT09ICd0ZW1wbGF0ZScpIHtcbiAgICAgIEBpZiAodGVtcGxhdGUoKTsgYXMgdGVtcGxhdGUpIHtcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlOyBjb250ZXh0OiBnZXRDb250ZXh0KClcIiAvPlxuICAgICAgfVxuICAgIH1cbiAgYCxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtOZ1RlbXBsYXRlT3V0bGV0XSxcbn0pXG5leHBvcnQgY2xhc3MgQ29ubmVjdGlvbkNvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmxvd1N0YXR1c1NlcnZpY2UgPSBpbmplY3QoRmxvd1N0YXR1c1NlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IHNwYWNlUG9pbnRDb250ZXh0ID0gaW5qZWN0KFNwYWNlUG9pbnRDb250ZXh0RGlyZWN0aXZlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBmbG93RW50aXRpZXNTZXJ2aWNlID0gaW5qZWN0KEZsb3dFbnRpdGllc1NlcnZpY2UpO1xuXG4gIHB1YmxpYyBtb2RlbCA9IGlucHV0LnJlcXVpcmVkPENvbm5lY3Rpb25Nb2RlbD4oKTtcblxuICBwdWJsaWMgdGVtcGxhdGUgPSBpbnB1dDxUZW1wbGF0ZVJlZjxhbnk+PigpO1xuXG4gIHByb3RlY3RlZCBwYXRoID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IHN0YXR1cyA9IHRoaXMuZmxvd1N0YXR1c1NlcnZpY2Uuc3RhdHVzKCk7XG4gICAgY29uc3QgY3VydmUgPSB0aGlzLm1vZGVsKCkuY3VydmU7XG5cbiAgICBpZiAoc3RhdHVzLnN0YXRlID09PSAnY29ubmVjdGlvbi1zdGFydCcgfHwgc3RhdHVzLnN0YXRlID09PSAncmVjb25uZWN0aW9uLXN0YXJ0Jykge1xuICAgICAgY29uc3Qgc291cmNlSGFuZGxlID0gc3RhdHVzLnBheWxvYWQuc291cmNlSGFuZGxlO1xuICAgICAgY29uc3Qgc291cmNlUG9pbnQgPSBzb3VyY2VIYW5kbGUucG9pbnRBYnNvbHV0ZSgpO1xuICAgICAgY29uc3Qgc291cmNlUG9zaXRpb24gPSBzb3VyY2VIYW5kbGUucmF3SGFuZGxlLnBvc2l0aW9uO1xuXG4gICAgICBjb25zdCB0YXJnZXRQb2ludCA9IHRoaXMuc3BhY2VQb2ludENvbnRleHQuc3ZnQ3VycmVudFNwYWNlUG9pbnQoKTtcbiAgICAgIGNvbnN0IHRhcmdldFBvc2l0aW9uID0gZ2V0T3Bwb3NpdGVQb3N0aW9uKHNvdXJjZUhhbmRsZS5yYXdIYW5kbGUucG9zaXRpb24pO1xuXG4gICAgICBjb25zdCBwYXJhbXMgPSB0aGlzLmdldFBhdGhGYWN0b3J5UGFyYW1zKHNvdXJjZVBvaW50LCB0YXJnZXRQb2ludCwgc291cmNlUG9zaXRpb24sIHRhcmdldFBvc2l0aW9uKTtcblxuICAgICAgc3dpdGNoIChjdXJ2ZSkge1xuICAgICAgICBjYXNlICdzdHJhaWdodCc6XG4gICAgICAgICAgcmV0dXJuIHN0cmFpZ2h0UGF0aChwYXJhbXMpLnBhdGg7XG4gICAgICAgIGNhc2UgJ2Jlemllcic6XG4gICAgICAgICAgcmV0dXJuIGJlemllclBhdGgocGFyYW1zKS5wYXRoO1xuICAgICAgICBjYXNlICdzbW9vdGgtc3RlcCc6XG4gICAgICAgICAgcmV0dXJuIHNtb290aFN0ZXBQYXRoKHBhcmFtcykucGF0aDtcbiAgICAgICAgY2FzZSAnc3RlcCc6XG4gICAgICAgICAgcmV0dXJuIHNtb290aFN0ZXBQYXRoKHBhcmFtcywgMCkucGF0aDtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gY3VydmUocGFyYW1zKS5wYXRoO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzdGF0dXMuc3RhdGUgPT09ICdjb25uZWN0aW9uLXZhbGlkYXRpb24nIHx8IHN0YXR1cy5zdGF0ZSA9PT0gJ3JlY29ubmVjdGlvbi12YWxpZGF0aW9uJykge1xuICAgICAgY29uc3Qgc291cmNlSGFuZGxlID0gc3RhdHVzLnBheWxvYWQuc291cmNlSGFuZGxlO1xuICAgICAgY29uc3Qgc291cmNlUG9pbnQgPSBzb3VyY2VIYW5kbGUucG9pbnRBYnNvbHV0ZSgpO1xuICAgICAgY29uc3Qgc291cmNlUG9zaXRpb24gPSBzb3VyY2VIYW5kbGUucmF3SGFuZGxlLnBvc2l0aW9uO1xuXG4gICAgICBjb25zdCB0YXJnZXRIYW5kbGUgPSBzdGF0dXMucGF5bG9hZC50YXJnZXRIYW5kbGU7XG4gICAgICAvLyBpZ25vcmUgbWFnbmV0IGlmIHZhbGlkYXRpb24gZmFpbGVkXG4gICAgICBjb25zdCB0YXJnZXRQb2ludCA9IHN0YXR1cy5wYXlsb2FkLnZhbGlkXG4gICAgICAgID8gdGFyZ2V0SGFuZGxlLnBvaW50QWJzb2x1dGUoKVxuICAgICAgICA6IHRoaXMuc3BhY2VQb2ludENvbnRleHQuc3ZnQ3VycmVudFNwYWNlUG9pbnQoKTtcbiAgICAgIGNvbnN0IHRhcmdldFBvc2l0aW9uID0gc3RhdHVzLnBheWxvYWQudmFsaWRcbiAgICAgICAgPyB0YXJnZXRIYW5kbGUucmF3SGFuZGxlLnBvc2l0aW9uXG4gICAgICAgIDogZ2V0T3Bwb3NpdGVQb3N0aW9uKHNvdXJjZUhhbmRsZS5yYXdIYW5kbGUucG9zaXRpb24pO1xuXG4gICAgICBjb25zdCBwYXJhbXMgPSB0aGlzLmdldFBhdGhGYWN0b3J5UGFyYW1zKHNvdXJjZVBvaW50LCB0YXJnZXRQb2ludCwgc291cmNlUG9zaXRpb24sIHRhcmdldFBvc2l0aW9uKTtcblxuICAgICAgc3dpdGNoIChjdXJ2ZSkge1xuICAgICAgICBjYXNlICdzdHJhaWdodCc6XG4gICAgICAgICAgcmV0dXJuIHN0cmFpZ2h0UGF0aChwYXJhbXMpLnBhdGg7XG4gICAgICAgIGNhc2UgJ2Jlemllcic6XG4gICAgICAgICAgcmV0dXJuIGJlemllclBhdGgocGFyYW1zKS5wYXRoO1xuICAgICAgICBjYXNlICdzbW9vdGgtc3RlcCc6XG4gICAgICAgICAgcmV0dXJuIHNtb290aFN0ZXBQYXRoKHBhcmFtcykucGF0aDtcbiAgICAgICAgY2FzZSAnc3RlcCc6XG4gICAgICAgICAgcmV0dXJuIHNtb290aFN0ZXBQYXRoKHBhcmFtcywgMCkucGF0aDtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gY3VydmUocGFyYW1zKS5wYXRoO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9KTtcblxuICBwcm90ZWN0ZWQgbWFya2VyVXJsID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IG1hcmtlciA9IHRoaXMubW9kZWwoKS5zZXR0aW5ncy5tYXJrZXI7XG5cbiAgICBpZiAobWFya2VyKSB7XG4gICAgICByZXR1cm4gYHVybCgjJHtoYXNoQ29kZShKU09OLnN0cmluZ2lmeShtYXJrZXIpKX0pYDtcbiAgICB9XG5cbiAgICByZXR1cm4gJyc7XG4gIH0pO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBkZWZhdWx0Q29sb3IgPSAncmdiKDE3NywgMTc3LCAxODMpJztcblxuICAvLyBUT0RPOiBtb3ZlIGNvbnRleHQgdG8gbW9kZWxcbiAgcHJvdGVjdGVkIGdldENvbnRleHQoKTogQ29ubmVjdGlvbkNvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICAkaW1wbGljaXQ6IHtcbiAgICAgICAgcGF0aDogdGhpcy5wYXRoLFxuICAgICAgICBtYXJrZXI6IHRoaXMubWFya2VyVXJsLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQYXRoRmFjdG9yeVBhcmFtcyhcbiAgICBzb3VyY2VQb2ludDogUG9pbnQsXG4gICAgdGFyZ2V0UG9pbnQ6IFBvaW50LFxuICAgIHNvdXJjZVBvc2l0aW9uOiBQb3NpdGlvbixcbiAgICB0YXJnZXRQb3NpdGlvbjogUG9zaXRpb24sXG4gICk6IEN1cnZlRmFjdG9yeVBhcmFtcyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1vZGU6ICdjb25uZWN0aW9uJyxcbiAgICAgIHNvdXJjZVBvaW50LFxuICAgICAgdGFyZ2V0UG9pbnQsXG4gICAgICBzb3VyY2VQb3NpdGlvbixcbiAgICAgIHRhcmdldFBvc2l0aW9uLFxuICAgICAgYWxsRWRnZXM6IHRoaXMuZmxvd0VudGl0aWVzU2VydmljZS5yYXdFZGdlcygpLFxuICAgICAgYWxsTm9kZXM6IHRoaXMuZmxvd0VudGl0aWVzU2VydmljZS5yYXdOb2RlcygpLFxuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0T3Bwb3NpdGVQb3N0aW9uKHBvc2l0aW9uOiBQb3NpdGlvbik6IFBvc2l0aW9uIHtcbiAgc3dpdGNoIChwb3NpdGlvbikge1xuICAgIGNhc2UgJ3RvcCc6XG4gICAgICByZXR1cm4gJ2JvdHRvbSc7XG4gICAgY2FzZSAnYm90dG9tJzpcbiAgICAgIHJldHVybiAndG9wJztcbiAgICBjYXNlICdsZWZ0JzpcbiAgICAgIHJldHVybiAncmlnaHQnO1xuICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgIHJldHVybiAnbGVmdCc7XG4gIH1cbn1cbiJdfQ==