@foblex/flow 17.8.2 → 17.8.4

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 (48) hide show
  1. package/domain/f-node/calculate-node-connectors-connectable-sides/calculate-connectable-side-by-connected-positions/calculate-connectable-side-by-connected-positions-request.d.ts +9 -0
  2. package/domain/f-node/calculate-node-connectors-connectable-sides/calculate-connectable-side-by-connected-positions/calculate-connectable-side-by-connected-positions.d.ts +48 -0
  3. package/domain/f-node/calculate-node-connectors-connectable-sides/calculate-connectable-side-by-connected-positions/index.d.ts +2 -0
  4. package/domain/f-node/calculate-node-connectors-connectable-sides/calculate-connectable-side-by-internal-position/calculate-connectable-side-by-internal-position-request.d.ts +6 -0
  5. package/domain/f-node/calculate-node-connectors-connectable-sides/calculate-connectable-side-by-internal-position/calculate-connectable-side-by-internal-position.d.ts +20 -0
  6. package/domain/f-node/calculate-node-connectors-connectable-sides/calculate-connectable-side-by-internal-position/index.d.ts +2 -0
  7. package/domain/f-node/calculate-node-connectors-connectable-sides/calculate-node-connectors-connectable-sides-request.d.ts +6 -0
  8. package/domain/f-node/calculate-node-connectors-connectable-sides/calculate-node-connectors-connectable-sides.d.ts +28 -0
  9. package/domain/f-node/calculate-node-connectors-connectable-sides/index.d.ts +4 -0
  10. package/domain/f-node/index.d.ts +1 -0
  11. package/domain/f-node/providers.d.ts +4 -3
  12. package/domain/f-node/update-node-when-state-or-size-changed/update-node-when-state-or-size-changed-request.d.ts +2 -2
  13. package/domain/f-node/update-node-when-state-or-size-changed/update-node-when-state-or-size-changed.d.ts +0 -23
  14. package/domain/providers.d.ts +1 -1
  15. package/esm2022/domain/f-node/calculate-node-connectors-connectable-sides/calculate-connectable-side-by-connected-positions/calculate-connectable-side-by-connected-positions-request.mjs +16 -0
  16. package/esm2022/domain/f-node/calculate-node-connectors-connectable-sides/calculate-connectable-side-by-connected-positions/calculate-connectable-side-by-connected-positions.mjs +181 -0
  17. package/esm2022/domain/f-node/calculate-node-connectors-connectable-sides/calculate-connectable-side-by-connected-positions/index.mjs +3 -0
  18. package/esm2022/domain/f-node/calculate-node-connectors-connectable-sides/calculate-connectable-side-by-internal-position/calculate-connectable-side-by-internal-position-request.mjs +8 -0
  19. package/esm2022/domain/f-node/calculate-node-connectors-connectable-sides/calculate-connectable-side-by-internal-position/calculate-connectable-side-by-internal-position.mjs +55 -0
  20. package/esm2022/domain/f-node/calculate-node-connectors-connectable-sides/calculate-connectable-side-by-internal-position/index.mjs +3 -0
  21. package/esm2022/domain/f-node/calculate-node-connectors-connectable-sides/calculate-node-connectors-connectable-sides-request.mjs +8 -0
  22. package/esm2022/domain/f-node/calculate-node-connectors-connectable-sides/calculate-node-connectors-connectable-sides.mjs +90 -0
  23. package/esm2022/domain/f-node/calculate-node-connectors-connectable-sides/index.mjs +5 -0
  24. package/esm2022/domain/f-node/index.mjs +2 -1
  25. package/esm2022/domain/f-node/providers.mjs +8 -4
  26. package/esm2022/domain/f-node/update-node-when-state-or-size-changed/update-node-when-state-or-size-changed-request.mjs +1 -1
  27. package/esm2022/domain/f-node/update-node-when-state-or-size-changed/update-node-when-state-or-size-changed.mjs +10 -67
  28. package/esm2022/f-connectors/e-f-connectable-side.mjs +4 -1
  29. package/esm2022/f-connectors/f-connector-base.mjs +1 -1
  30. package/esm2022/f-connectors/f-node-input/f-node-input.directive.mjs +4 -1
  31. package/esm2022/f-connectors/f-node-outlet/f-node-outlet.directive.mjs +4 -1
  32. package/esm2022/f-connectors/f-node-output/f-node-output.directive.mjs +4 -1
  33. package/esm2022/f-node/f-group.directive.mjs +20 -12
  34. package/esm2022/f-node/f-node-base.mjs +2 -2
  35. package/esm2022/f-node/f-node.directive.mjs +15 -3
  36. package/f-connection/providers.d.ts +1 -1
  37. package/f-connectors/e-f-connectable-side.d.ts +3 -0
  38. package/f-connectors/f-connector-base.d.ts +1 -0
  39. package/f-connectors/f-node-input/f-node-input.directive.d.ts +1 -0
  40. package/f-connectors/f-node-outlet/f-node-outlet.directive.d.ts +1 -0
  41. package/f-connectors/f-node-output/f-node-output.directive.d.ts +1 -0
  42. package/f-connectors/providers.d.ts +1 -1
  43. package/f-node/f-group.directive.d.ts +4 -1
  44. package/f-node/f-node-base.d.ts +1 -1
  45. package/f-node/f-node.directive.d.ts +3 -0
  46. package/fesm2022/foblex-flow.mjs +381 -71
  47. package/fesm2022/foblex-flow.mjs.map +1 -1
  48. package/package.json +1 -1
@@ -0,0 +1,9 @@
1
+ import { EFConnectableSide, FConnectorBase } from '../../../../f-connectors';
2
+ export type TCalculateMode = EFConnectableSide.CALCULATE | EFConnectableSide.CALCULATE_HORIZONTAL | EFConnectableSide.CALCULATE_VERTICAL;
3
+ export declare const CALCULATE_MODES: EFConnectableSide[];
4
+ export declare class CalculateConnectableSideByConnectedPositionsRequest {
5
+ readonly connector: FConnectorBase;
6
+ readonly mode: TCalculateMode;
7
+ static readonly fToken: unique symbol;
8
+ constructor(connector: FConnectorBase, mode: TCalculateMode);
9
+ }
@@ -0,0 +1,48 @@
1
+ import { IExecution } from '@foblex/mediator';
2
+ import { CalculateConnectableSideByConnectedPositionsRequest } from './calculate-connectable-side-by-connected-positions-request';
3
+ import { EFConnectableSide } from '../../../../f-connectors';
4
+ import * as i0 from "@angular/core";
5
+ /**
6
+ * Execution that calculates the connectable side for a connector
7
+ * based on positions of connected connectors and allowed sides.
8
+ */
9
+ export declare class CalculateConnectableSideByConnectedPositions implements IExecution<CalculateConnectableSideByConnectedPositionsRequest, EFConnectableSide> {
10
+ private readonly _mediator;
11
+ /**
12
+ * Entry point (hot path). Avoids intermediate arrays and redundant allocations.
13
+ *
14
+ * @param request - Contains the connector and optionally allowed sides.
15
+ * @returns {EFConnectableSide} - The chosen connectable side.
16
+ */
17
+ handle({ connector, mode, }: CalculateConnectableSideByConnectedPositionsRequest): EFConnectableSide;
18
+ /**
19
+ * Accumulates sum of gravity centers and count, excluding the current host.
20
+ * Single pass, minimal allocations.
21
+ */
22
+ private _accumulateConnectedCenters;
23
+ /**
24
+ * Converts allowed sides array to a compact bit mask.
25
+ * If not provided or empty -> all sides allowed.
26
+ */
27
+ private _toSideMask;
28
+ /**
29
+ * Determines final side using ideal side first; if disallowed, picks best fallback.
30
+ * Inputs are numbers to avoid object wrappers on hot path.
31
+ */
32
+ private _determineSide;
33
+ /**
34
+ * Picks the "ideal" side based on vector (dx, dy) with hysteresis.
35
+ */
36
+ private _pickIdealSide;
37
+ /**
38
+ * Quick membership check via bit mask.
39
+ */
40
+ private _isAllowed;
41
+ /**
42
+ * Picks the best available side from allowed mask by maximizing directional score.
43
+ * No intermediate objects, constant-time operations.
44
+ */
45
+ private _pickFallbackSide;
46
+ static ɵfac: i0.ɵɵFactoryDeclaration<CalculateConnectableSideByConnectedPositions, never>;
47
+ static ɵprov: i0.ɵɵInjectableDeclaration<CalculateConnectableSideByConnectedPositions>;
48
+ }
@@ -0,0 +1,2 @@
1
+ export * from './calculate-connectable-side-by-connected-positions';
2
+ export * from './calculate-connectable-side-by-connected-positions-request';
@@ -0,0 +1,6 @@
1
+ import { FConnectorBase } from '../../../../f-connectors';
2
+ export declare class CalculateConnectableSideByInternalPositionRequest {
3
+ readonly connector: FConnectorBase;
4
+ static readonly fToken: unique symbol;
5
+ constructor(connector: FConnectorBase);
6
+ }
@@ -0,0 +1,20 @@
1
+ import { IExecution } from '@foblex/mediator';
2
+ import { CalculateConnectableSideByInternalPositionRequest } from './calculate-connectable-side-by-internal-position-request';
3
+ import { EFConnectableSide } from '../../../../f-connectors';
4
+ import * as i0 from "@angular/core";
5
+ /**
6
+ * Execution that calculates the connectable side for a connector
7
+ * based on the internal position of the connector relative to its node host.
8
+ */
9
+ export declare class CalculateConnectableSideByInternalPosition implements IExecution<CalculateConnectableSideByInternalPositionRequest, EFConnectableSide> {
10
+ handle({ connector, }: CalculateConnectableSideByInternalPositionRequest): EFConnectableSide;
11
+ /**
12
+ * Determines the side of the connector relative to the node host based on the minimum distance.
13
+ * @param connectorHost
14
+ * @param nodeHost
15
+ * @private
16
+ */
17
+ private _getSideByDelta;
18
+ static ɵfac: i0.ɵɵFactoryDeclaration<CalculateConnectableSideByInternalPosition, never>;
19
+ static ɵprov: i0.ɵɵInjectableDeclaration<CalculateConnectableSideByInternalPosition>;
20
+ }
@@ -0,0 +1,2 @@
1
+ export * from './calculate-connectable-side-by-internal-position';
2
+ export * from './calculate-connectable-side-by-internal-position-request';
@@ -0,0 +1,6 @@
1
+ import { FNodeBase } from '../../../f-node';
2
+ export declare class CalculateNodeConnectorsConnectableSidesRequest {
3
+ readonly node: FNodeBase;
4
+ static readonly fToken: unique symbol;
5
+ constructor(node: FNodeBase);
6
+ }
@@ -0,0 +1,28 @@
1
+ import { IExecution } from '@foblex/mediator';
2
+ import { CalculateNodeConnectorsConnectableSidesRequest } from './calculate-node-connectors-connectable-sides-request';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * Execution that calculates connectable sides for all connectors of a node.
6
+ *
7
+ * Performance goals:
8
+ * - Single-pass loops (no `forEach`).
9
+ * - Unique target recomputation (avoid repeated mediator calls for the same target).
10
+ * - Fast checks for "calculate" modes (bit mask instead of `includes`).
11
+ */
12
+ export declare class CalculateNodeConnectorsConnectableSides implements IExecution<CalculateNodeConnectorsConnectableSidesRequest, void> {
13
+ private readonly _mediator;
14
+ /**
15
+ * Orchestrates side calculation for all connectors of the given node.
16
+ * Two-phase approach:
17
+ * 1) Update each connector's own side.
18
+ * 2) Collect unique `toConnector` with calculate modes and recompute once.
19
+ */
20
+ handle({ node }: CalculateNodeConnectorsConnectableSidesRequest): void;
21
+ /**
22
+ * Fast resolver for a single connector.
23
+ * Uses switch and avoids array operations.
24
+ */
25
+ private _resolveSideForConnectorFast;
26
+ static ɵfac: i0.ɵɵFactoryDeclaration<CalculateNodeConnectorsConnectableSides, never>;
27
+ static ɵprov: i0.ɵɵInjectableDeclaration<CalculateNodeConnectorsConnectableSides>;
28
+ }
@@ -0,0 +1,4 @@
1
+ export * from './calculate-connectable-side-by-connected-positions';
2
+ export * from './calculate-connectable-side-by-internal-position';
3
+ export * from './calculate-node-connectors-connectable-sides';
4
+ export * from './calculate-node-connectors-connectable-sides-request';
@@ -1,5 +1,6 @@
1
1
  export * from './add-node-to-store';
2
2
  export * from './calculate-input-connections';
3
+ export * from './calculate-node-connectors-connectable-sides';
3
4
  export * from './calculate-nodes-bounding-box';
4
5
  export * from './calculate-nodes-bounding-box-normalized-position';
5
6
  export * from './calculate-output-connections';
@@ -8,9 +8,10 @@ import { GetNodePadding } from './get-node-padding';
8
8
  import { GetParentNodes } from './get-parent-nodes';
9
9
  import { CalculateInputConnections } from './calculate-input-connections';
10
10
  import { CalculateOutputConnections } from './calculate-output-connections';
11
- import { GetChildNodeIds } from "./get-child-node-ids";
12
- import { FitToChildNodesAndGroups } from "./fit-to-child-nodes-and-groups";
11
+ import { GetChildNodeIds } from './get-child-node-ids';
12
+ import { FitToChildNodesAndGroups } from './fit-to-child-nodes-and-groups';
13
+ import { CalculateConnectableSideByConnectedPositions, CalculateConnectableSideByInternalPosition, CalculateNodeConnectorsConnectableSides } from './calculate-node-connectors-connectable-sides';
13
14
  /**
14
15
  * This file exports all the node-related executions that can be used in the F-Flow domain.
15
16
  */
16
- export declare const F_NODE_FEATURES: (typeof AddNodeToStore | typeof CalculateInputConnections | typeof CalculateNodesBoundingBox | typeof CalculateNodesBoundingBoxNormalizedPosition | typeof CalculateOutputConnections | typeof FitToChildNodesAndGroups | typeof GetChildNodeIds | typeof GetNodePadding | typeof GetNodes | typeof GetParentNodes | typeof UpdateNodeWhenStateOrSizeChanged | typeof RemoveNodeFromStore)[];
17
+ export declare const F_NODE_FEATURES: (typeof CalculateConnectableSideByConnectedPositions | typeof CalculateNodeConnectorsConnectableSides | typeof AddNodeToStore | typeof CalculateConnectableSideByInternalPosition | typeof CalculateInputConnections | typeof CalculateNodesBoundingBox | typeof CalculateNodesBoundingBoxNormalizedPosition | typeof CalculateOutputConnections | typeof FitToChildNodesAndGroups | typeof GetChildNodeIds | typeof GetNodePadding | typeof GetNodes | typeof GetParentNodes | typeof UpdateNodeWhenStateOrSizeChanged | typeof RemoveNodeFromStore)[];
@@ -1,8 +1,8 @@
1
1
  import { DestroyRef } from '@angular/core';
2
2
  import { FNodeBase } from '../../../f-node';
3
3
  export declare class UpdateNodeWhenStateOrSizeChangedRequest {
4
- nodeOrGroup: FNodeBase;
5
- destroyRef: DestroyRef;
4
+ readonly nodeOrGroup: FNodeBase;
5
+ readonly destroyRef: DestroyRef;
6
6
  static readonly fToken: unique symbol;
7
7
  constructor(nodeOrGroup: FNodeBase, destroyRef: DestroyRef);
8
8
  }
@@ -6,35 +6,12 @@ import * as i0 from "@angular/core";
6
6
  */
7
7
  export declare class UpdateNodeWhenStateOrSizeChanged implements IExecution<UpdateNodeWhenStateOrSizeChangedRequest, void> {
8
8
  private readonly _mediator;
9
- private readonly _store;
10
9
  /**
11
10
  * Handles the request to update the node's connectors based on state or size changes.
12
11
  * It listens for resize events and recalculates the connectable sides of the connectors.
13
12
  * @param request
14
13
  */
15
14
  handle({ nodeOrGroup, destroyRef }: UpdateNodeWhenStateOrSizeChangedRequest): void;
16
- /**
17
- * Calculates the connectable side for each connector based on its position relative to the node host.
18
- * @param fConnectors
19
- * @param fNodeHost
20
- * @private
21
- */
22
- private _calculateConnectorsConnectableSide;
23
- /**
24
- * Calculates the connectable side of a connector based on its user-defined side or its position relative to the node host.
25
- * @param fConnector
26
- * @param fNodeHost
27
- * @returns {EFConnectableSide}
28
- * @private
29
- */
30
- private _calculateConnectorConnectableSide;
31
- /**
32
- * Determines the side of the connector relative to the node host based on the minimum distance.
33
- * @param fConnectorHost
34
- * @param fNodeHost
35
- * @private
36
- */
37
- private _getSideByDelta;
38
15
  private _isDragging;
39
16
  static ɵfac: i0.ɵɵFactoryDeclaration<UpdateNodeWhenStateOrSizeChanged, never>;
40
17
  static ɵprov: i0.ɵɵInjectableDeclaration<UpdateNodeWhenStateOrSizeChanged>;
@@ -10,4 +10,4 @@ import { GetNormalizedConnectorRectExecution } from "./get-normalized-connector-
10
10
  * draggable elements, flow, line alignment, nodes, selection, zoom,
11
11
  * and various utility executions.
12
12
  */
13
- export declare const COMMON_PROVIDERS: (typeof GetElementRoundedRectExecution | typeof import("./f-canvas").AddCanvasToStoreExecution | typeof import("./f-canvas").CenterGroupOrNodeExecution | typeof import("./f-canvas").FitToFlowExecution | typeof import("./f-canvas").InputCanvasPositionExecution | typeof import("./f-canvas").InputCanvasScaleExecution | typeof import("./f-canvas").RedrawCanvasWithAnimationExecution | typeof import("./f-canvas").ResetScaleAndCenterExecution | typeof import("./f-canvas").UpdateScaleExecution | typeof import("./f-connection").AddConnectionForCreateToStoreExecution | typeof import("./f-connection").AddConnectionMarkerToStoreExecution | typeof import("./f-connection").AddConnectionToStoreExecution | typeof import("./f-connection").AddSnapConnectionToStoreExecution | typeof import("./f-connection").CreateConnectionMarkersExecution | typeof import("./f-connection").CalculateConnectionLineByBehavior | typeof import("./f-connection").RemoveConnectionFromStoreExecution | typeof import("./f-connection").RemoveConnectionMarkerFromStoreExecution | typeof import("./f-background").AddBackgroundToStoreExecution | typeof import("./f-background").AddPatternToBackgroundExecution | typeof import("./f-background").RemoveBackgroundFromStoreExecution | typeof import("./f-background").SetBackgroundTransformExecution | typeof import("./f-connectors").AddInputToStore | typeof import("./f-connectors").AddOutletToStore | typeof import("./f-connectors").AddOutputToStore | typeof import("./f-connectors").CalculateClosestConnector | typeof import("./f-connectors").FindConnectableConnectorUsingPriorityAndPositionExecution | typeof import("./f-connectors").GetAllCanBeConnectedSourceConnectorsAndRectsExecution | typeof import("./f-connectors").GetAllCanBeConnectedInputsAndRectsExecution | typeof import("./f-connectors").GetConnectorAndRect | typeof import("./f-connectors").MarkConnectableConnectors | typeof import("./f-connectors").RemoveInputFromStore | typeof import("./f-connectors").RemoveOutletFromStoreExecution | typeof import("./f-connectors").RemoveOutputFromStoreExecution | typeof import("./f-connectors").UnmarkConnectableConnectors | typeof import("./f-draggable").AddDndToStoreExecution | typeof import("./f-draggable").OnPointerMoveExecution | typeof import("./f-flow").AddFlowToStoreExecution | typeof import("./f-flow").GetFlowStateNodesExecution | typeof import("./f-line-alignment").AddLineAlignmentToStoreExecution | typeof import("./f-node").AddNodeToStore | typeof import("./f-node").CalculateInputConnections | typeof import("./f-node").CalculateNodesBoundingBoxNormalizedPosition | typeof import("./f-node").CalculateOutputConnections | typeof import("./f-node").FitToChildNodesAndGroups | typeof import("./f-node").GetChildNodeIds | typeof import("./f-node").GetNodePadding | typeof import("./f-node").GetParentNodes | typeof import("./f-node").UpdateNodeWhenStateOrSizeChanged | typeof import("./f-node").RemoveNodeFromStore | typeof import("./f-selection").SelectExecution | typeof import("./f-selection").SelectAndUpdateNodeLayerExecution | typeof import("./f-zoom").AddZoomToStoreExecution | typeof import("./f-zoom").SetZoomExecution | typeof GetDeepChildrenNodesAndGroupsExecution | typeof GetNormalizedConnectorRectExecution | typeof GetNormalizedElementRectExecution | typeof GetNormalizedPointExecution | typeof UpdateItemAndChildrenLayersExecution | typeof MoveFrontElementsBeforeTargetElementExecution)[];
13
+ export declare const COMMON_PROVIDERS: (typeof import("./f-node").CalculateConnectableSideByConnectedPositions | typeof import("./f-node").CalculateNodeConnectorsConnectableSides | typeof GetElementRoundedRectExecution | typeof import("./f-canvas").AddCanvasToStoreExecution | typeof import("./f-canvas").CenterGroupOrNodeExecution | typeof import("./f-canvas").FitToFlowExecution | typeof import("./f-canvas").InputCanvasPositionExecution | typeof import("./f-canvas").InputCanvasScaleExecution | typeof import("./f-canvas").RedrawCanvasWithAnimationExecution | typeof import("./f-canvas").ResetScaleAndCenterExecution | typeof import("./f-canvas").UpdateScaleExecution | typeof import("./f-connection").AddConnectionForCreateToStoreExecution | typeof import("./f-connection").AddConnectionMarkerToStoreExecution | typeof import("./f-connection").AddConnectionToStoreExecution | typeof import("./f-connection").AddSnapConnectionToStoreExecution | typeof import("./f-connection").CreateConnectionMarkersExecution | typeof import("./f-connection").CalculateConnectionLineByBehavior | typeof import("./f-connection").RemoveConnectionFromStoreExecution | typeof import("./f-connection").RemoveConnectionMarkerFromStoreExecution | typeof import("./f-background").AddBackgroundToStoreExecution | typeof import("./f-background").AddPatternToBackgroundExecution | typeof import("./f-background").RemoveBackgroundFromStoreExecution | typeof import("./f-background").SetBackgroundTransformExecution | typeof import("./f-connectors").AddInputToStore | typeof import("./f-connectors").AddOutletToStore | typeof import("./f-connectors").AddOutputToStore | typeof import("./f-connectors").CalculateClosestConnector | typeof import("./f-connectors").FindConnectableConnectorUsingPriorityAndPositionExecution | typeof import("./f-connectors").GetAllCanBeConnectedSourceConnectorsAndRectsExecution | typeof import("./f-connectors").GetAllCanBeConnectedInputsAndRectsExecution | typeof import("./f-connectors").GetConnectorAndRect | typeof import("./f-connectors").MarkConnectableConnectors | typeof import("./f-connectors").RemoveInputFromStore | typeof import("./f-connectors").RemoveOutletFromStoreExecution | typeof import("./f-connectors").RemoveOutputFromStoreExecution | typeof import("./f-connectors").UnmarkConnectableConnectors | typeof import("./f-draggable").AddDndToStoreExecution | typeof import("./f-draggable").OnPointerMoveExecution | typeof import("./f-flow").AddFlowToStoreExecution | typeof import("./f-flow").GetFlowStateNodesExecution | typeof import("./f-line-alignment").AddLineAlignmentToStoreExecution | typeof import("./f-node").AddNodeToStore | typeof import("./f-node").CalculateConnectableSideByInternalPosition | typeof import("./f-node").CalculateInputConnections | typeof import("./f-node").CalculateNodesBoundingBoxNormalizedPosition | typeof import("./f-node").CalculateOutputConnections | typeof import("./f-node").FitToChildNodesAndGroups | typeof import("./f-node").GetChildNodeIds | typeof import("./f-node").GetNodePadding | typeof import("./f-node").GetParentNodes | typeof import("./f-node").UpdateNodeWhenStateOrSizeChanged | typeof import("./f-node").RemoveNodeFromStore | typeof import("./f-selection").SelectExecution | typeof import("./f-selection").SelectAndUpdateNodeLayerExecution | typeof import("./f-zoom").AddZoomToStoreExecution | typeof import("./f-zoom").SetZoomExecution | typeof GetDeepChildrenNodesAndGroupsExecution | typeof GetNormalizedConnectorRectExecution | typeof GetNormalizedElementRectExecution | typeof GetNormalizedPointExecution | typeof UpdateItemAndChildrenLayersExecution | typeof MoveFrontElementsBeforeTargetElementExecution)[];
@@ -0,0 +1,16 @@
1
+ import { EFConnectableSide } from '../../../../f-connectors';
2
+ export const CALCULATE_MODES = [
3
+ EFConnectableSide.CALCULATE,
4
+ EFConnectableSide.CALCULATE_HORIZONTAL,
5
+ EFConnectableSide.CALCULATE_VERTICAL,
6
+ ];
7
+ export class CalculateConnectableSideByConnectedPositionsRequest {
8
+ connector;
9
+ mode;
10
+ static fToken = Symbol('CalculateConnectableSideByConnectedPositionsRequest');
11
+ constructor(connector, mode) {
12
+ this.connector = connector;
13
+ this.mode = mode;
14
+ }
15
+ }
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsY3VsYXRlLWNvbm5lY3RhYmxlLXNpZGUtYnktY29ubmVjdGVkLXBvc2l0aW9ucy1yZXF1ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZi1mbG93L3NyYy9kb21haW4vZi1ub2RlL2NhbGN1bGF0ZS1ub2RlLWNvbm5lY3RvcnMtY29ubmVjdGFibGUtc2lkZXMvY2FsY3VsYXRlLWNvbm5lY3RhYmxlLXNpZGUtYnktY29ubmVjdGVkLXBvc2l0aW9ucy9jYWxjdWxhdGUtY29ubmVjdGFibGUtc2lkZS1ieS1jb25uZWN0ZWQtcG9zaXRpb25zLXJlcXVlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFrQixNQUFNLDBCQUEwQixDQUFDO0FBTzdFLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRztJQUM3QixpQkFBaUIsQ0FBQyxTQUFTO0lBQzNCLGlCQUFpQixDQUFDLG9CQUFvQjtJQUN0QyxpQkFBaUIsQ0FBQyxrQkFBa0I7Q0FDckMsQ0FBQztBQUVGLE1BQU0sT0FBTyxtREFBbUQ7SUFHNUM7SUFDQTtJQUhsQixNQUFNLENBQVUsTUFBTSxHQUFHLE1BQU0sQ0FBQyxxREFBcUQsQ0FBQyxDQUFDO0lBQ3ZGLFlBQ2tCLFNBQXlCLEVBQ3pCLElBQW9CO1FBRHBCLGNBQVMsR0FBVCxTQUFTLENBQWdCO1FBQ3pCLFNBQUksR0FBSixJQUFJLENBQWdCO0lBQ25DLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFRkNvbm5lY3RhYmxlU2lkZSwgRkNvbm5lY3RvckJhc2UgfSBmcm9tICcuLi8uLi8uLi8uLi9mLWNvbm5lY3RvcnMnO1xuXG5leHBvcnQgdHlwZSBUQ2FsY3VsYXRlTW9kZSA9XG4gIHwgRUZDb25uZWN0YWJsZVNpZGUuQ0FMQ1VMQVRFXG4gIHwgRUZDb25uZWN0YWJsZVNpZGUuQ0FMQ1VMQVRFX0hPUklaT05UQUxcbiAgfCBFRkNvbm5lY3RhYmxlU2lkZS5DQUxDVUxBVEVfVkVSVElDQUw7XG5cbmV4cG9ydCBjb25zdCBDQUxDVUxBVEVfTU9ERVMgPSBbXG4gIEVGQ29ubmVjdGFibGVTaWRlLkNBTENVTEFURSxcbiAgRUZDb25uZWN0YWJsZVNpZGUuQ0FMQ1VMQVRFX0hPUklaT05UQUwsXG4gIEVGQ29ubmVjdGFibGVTaWRlLkNBTENVTEFURV9WRVJUSUNBTCxcbl07XG5cbmV4cG9ydCBjbGFzcyBDYWxjdWxhdGVDb25uZWN0YWJsZVNpZGVCeUNvbm5lY3RlZFBvc2l0aW9uc1JlcXVlc3Qge1xuICBzdGF0aWMgcmVhZG9ubHkgZlRva2VuID0gU3ltYm9sKCdDYWxjdWxhdGVDb25uZWN0YWJsZVNpZGVCeUNvbm5lY3RlZFBvc2l0aW9uc1JlcXVlc3QnKTtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IGNvbm5lY3RvcjogRkNvbm5lY3RvckJhc2UsXG4gICAgcHVibGljIHJlYWRvbmx5IG1vZGU6IFRDYWxjdWxhdGVNb2RlLFxuICApIHt9XG59XG4iXX0=
@@ -0,0 +1,181 @@
1
+ import { __decorate } from "tslib";
2
+ import { inject, Injectable } from '@angular/core';
3
+ import { FExecutionRegister, FMediator } from '@foblex/mediator';
4
+ import { CalculateConnectableSideByConnectedPositionsRequest } from './calculate-connectable-side-by-connected-positions-request';
5
+ import { EFConnectableSide } from '../../../../f-connectors';
6
+ import { RectExtensions } from '@foblex/2d';
7
+ import { CalculateConnectableSideByInternalPositionRequest } from '../calculate-connectable-side-by-internal-position';
8
+ import * as i0 from "@angular/core";
9
+ const SNAP_EPS = 2;
10
+ const CALCULATE_SIDES = {
11
+ [EFConnectableSide.CALCULATE]: [
12
+ EFConnectableSide.TOP,
13
+ EFConnectableSide.BOTTOM,
14
+ EFConnectableSide.LEFT,
15
+ EFConnectableSide.RIGHT,
16
+ ],
17
+ [EFConnectableSide.CALCULATE_HORIZONTAL]: [EFConnectableSide.LEFT, EFConnectableSide.RIGHT],
18
+ [EFConnectableSide.CALCULATE_VERTICAL]: [EFConnectableSide.TOP, EFConnectableSide.BOTTOM],
19
+ };
20
+ /**
21
+ * Execution that calculates the connectable side for a connector
22
+ * based on positions of connected connectors and allowed sides.
23
+ */
24
+ let CalculateConnectableSideByConnectedPositions = class CalculateConnectableSideByConnectedPositions {
25
+ _mediator = inject(FMediator);
26
+ /**
27
+ * Entry point (hot path). Avoids intermediate arrays and redundant allocations.
28
+ *
29
+ * @param request - Contains the connector and optionally allowed sides.
30
+ * @returns {EFConnectableSide} - The chosen connectable side.
31
+ */
32
+ handle({ connector, mode, }) {
33
+ const selfCenter = RectExtensions.fromElement(connector.hostElement).gravityCenter;
34
+ const acc = this._accumulateConnectedCenters(connector.hostElement, connector.toConnector);
35
+ if (acc.count === 0) {
36
+ return this._mediator.execute(new CalculateConnectableSideByInternalPositionRequest(connector));
37
+ }
38
+ const avgX = acc.sumX / acc.count;
39
+ const avgY = acc.sumY / acc.count;
40
+ const mask = this._toSideMask(CALCULATE_SIDES[mode]);
41
+ return this._determineSide(selfCenter.x, selfCenter.y, avgX, avgY, mask);
42
+ }
43
+ /**
44
+ * Accumulates sum of gravity centers and count, excluding the current host.
45
+ * Single pass, minimal allocations.
46
+ */
47
+ _accumulateConnectedCenters(selfHost, connected) {
48
+ let sumX = 0;
49
+ let sumY = 0;
50
+ let count = 0;
51
+ if (connected && connected.length) {
52
+ for (let i = 0; i < connected.length; i++) {
53
+ const el = connected[i]?.hostElement;
54
+ if (!el || el === selfHost)
55
+ continue;
56
+ const c = RectExtensions.fromElement(el).gravityCenter;
57
+ sumX += c.x;
58
+ sumY += c.y;
59
+ count++;
60
+ }
61
+ }
62
+ return { sumX, sumY, count };
63
+ }
64
+ /**
65
+ * Converts allowed sides array to a compact bit mask.
66
+ * If not provided or empty -> all sides allowed.
67
+ */
68
+ _toSideMask(allowed) {
69
+ if (!allowed || allowed.length === 0)
70
+ return 15 /* SideMask.ALL */;
71
+ let mask = 0 /* SideMask.NONE */;
72
+ for (let i = 0; i < allowed.length; i++) {
73
+ switch (allowed[i]) {
74
+ case EFConnectableSide.LEFT:
75
+ mask |= 1 /* SideMask.LEFT */;
76
+ break;
77
+ case EFConnectableSide.RIGHT:
78
+ mask |= 2 /* SideMask.RIGHT */;
79
+ break;
80
+ case EFConnectableSide.TOP:
81
+ mask |= 4 /* SideMask.TOP */;
82
+ break;
83
+ case EFConnectableSide.BOTTOM:
84
+ mask |= 8 /* SideMask.BOTTOM */;
85
+ break;
86
+ }
87
+ }
88
+ return mask || 15 /* SideMask.ALL */;
89
+ }
90
+ /**
91
+ * Determines final side using ideal side first; if disallowed, picks best fallback.
92
+ * Inputs are numbers to avoid object wrappers on hot path.
93
+ */
94
+ _determineSide(selfX, selfY, avgX, avgY, allowedMask) {
95
+ const dx = avgX - selfX;
96
+ const dy = avgY - selfY;
97
+ const ideal = this._pickIdealSide(dx, dy);
98
+ if (this._isAllowed(ideal, allowedMask)) {
99
+ return ideal;
100
+ }
101
+ return this._pickFallbackSide(dx, dy, allowedMask, ideal);
102
+ }
103
+ /**
104
+ * Picks the "ideal" side based on vector (dx, dy) with hysteresis.
105
+ */
106
+ _pickIdealSide(dx, dy) {
107
+ const ax = dx < 0 ? -dx : dx;
108
+ const ay = dy < 0 ? -dy : dy;
109
+ if (ax - ay > SNAP_EPS) {
110
+ return dx < 0 ? EFConnectableSide.LEFT : EFConnectableSide.RIGHT;
111
+ }
112
+ if (ay - ax > SNAP_EPS) {
113
+ return dy < 0 ? EFConnectableSide.TOP : EFConnectableSide.BOTTOM;
114
+ }
115
+ return dy < 0 ? EFConnectableSide.TOP : EFConnectableSide.BOTTOM;
116
+ }
117
+ /**
118
+ * Quick membership check via bit mask.
119
+ */
120
+ _isAllowed(side, mask) {
121
+ switch (side) {
122
+ case EFConnectableSide.LEFT:
123
+ return (mask & 1 /* SideMask.LEFT */) !== 0;
124
+ case EFConnectableSide.RIGHT:
125
+ return (mask & 2 /* SideMask.RIGHT */) !== 0;
126
+ case EFConnectableSide.TOP:
127
+ return (mask & 4 /* SideMask.TOP */) !== 0;
128
+ case EFConnectableSide.BOTTOM:
129
+ return (mask & 8 /* SideMask.BOTTOM */) !== 0;
130
+ default:
131
+ return true;
132
+ }
133
+ }
134
+ /**
135
+ * Picks the best available side from allowed mask by maximizing directional score.
136
+ * No intermediate objects, constant-time operations.
137
+ */
138
+ _pickFallbackSide(dx, dy, allowedMask, ideal) {
139
+ let bestSide = ideal;
140
+ let bestScore = -Infinity;
141
+ if (allowedMask & 2 /* SideMask.RIGHT */) {
142
+ const s = dx;
143
+ if (s > bestScore) {
144
+ bestScore = s;
145
+ bestSide = EFConnectableSide.RIGHT;
146
+ }
147
+ }
148
+ if (allowedMask & 1 /* SideMask.LEFT */) {
149
+ const s = -dx;
150
+ if (s > bestScore) {
151
+ bestScore = s;
152
+ bestSide = EFConnectableSide.LEFT;
153
+ }
154
+ }
155
+ if (allowedMask & 8 /* SideMask.BOTTOM */) {
156
+ const s = dy;
157
+ if (s > bestScore) {
158
+ bestScore = s;
159
+ bestSide = EFConnectableSide.BOTTOM;
160
+ }
161
+ }
162
+ if (allowedMask & 4 /* SideMask.TOP */) {
163
+ const s = -dy;
164
+ if (s > bestScore) {
165
+ bestScore = s;
166
+ bestSide = EFConnectableSide.TOP;
167
+ }
168
+ }
169
+ return bestSide;
170
+ }
171
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CalculateConnectableSideByConnectedPositions, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
172
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CalculateConnectableSideByConnectedPositions });
173
+ };
174
+ CalculateConnectableSideByConnectedPositions = __decorate([
175
+ FExecutionRegister(CalculateConnectableSideByConnectedPositionsRequest)
176
+ ], CalculateConnectableSideByConnectedPositions);
177
+ export { CalculateConnectableSideByConnectedPositions };
178
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CalculateConnectableSideByConnectedPositions, decorators: [{
179
+ type: Injectable
180
+ }] });
181
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsY3VsYXRlLWNvbm5lY3RhYmxlLXNpZGUtYnktY29ubmVjdGVkLXBvc2l0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2YtZmxvdy9zcmMvZG9tYWluL2Ytbm9kZS9jYWxjdWxhdGUtbm9kZS1jb25uZWN0b3JzLWNvbm5lY3RhYmxlLXNpZGVzL2NhbGN1bGF0ZS1jb25uZWN0YWJsZS1zaWRlLWJ5LWNvbm5lY3RlZC1wb3NpdGlvbnMvY2FsY3VsYXRlLWNvbm5lY3RhYmxlLXNpZGUtYnktY29ubmVjdGVkLXBvc2l0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFNBQVMsRUFBYyxNQUFNLGtCQUFrQixDQUFDO0FBQzdFLE9BQU8sRUFBRSxtREFBbUQsRUFBRSxNQUFNLDZEQUE2RCxDQUFDO0FBQ2xJLE9BQU8sRUFBRSxpQkFBaUIsRUFBa0IsTUFBTSwwQkFBMEIsQ0FBQztBQUM3RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxpREFBaUQsRUFBRSxNQUFNLG9EQUFvRCxDQUFDOztBQUV2SCxNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUM7QUFXbkIsTUFBTSxlQUFlLEdBQUc7SUFDdEIsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsRUFBRTtRQUM3QixpQkFBaUIsQ0FBQyxHQUFHO1FBQ3JCLGlCQUFpQixDQUFDLE1BQU07UUFDeEIsaUJBQWlCLENBQUMsSUFBSTtRQUN0QixpQkFBaUIsQ0FBQyxLQUFLO0tBQ3hCO0lBQ0QsQ0FBQyxpQkFBaUIsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLEtBQUssQ0FBQztJQUMzRixDQUFD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RnhELFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZFeGVjdXRpb25SZWdpc3RlciwgRk1lZGlhdG9yLCBJRXhlY3V0aW9uIH0gZnJvbSAnQGZvYmxleC9tZWRpYXRvcic7XG5pbXBvcnQgeyBDYWxjdWxhdGVDb25uZWN0YWJsZVNpZGVCeUNvbm5lY3RlZFBvc2l0aW9uc1JlcXVlc3QgfSBmcm9tICcuL2NhbGN1bGF0ZS1jb25uZWN0YWJsZS1zaWRlLWJ5LWNvbm5lY3RlZC1wb3NpdGlvbnMtcmVxdWVzdCc7XG5pbXBvcnQgeyBFRkNvbm5lY3RhYmxlU2lkZSwgRkNvbm5lY3RvckJhc2UgfSBmcm9tICcuLi8uLi8uLi8uLi9mLWNvbm5lY3RvcnMnO1xuaW1wb3J0IHsgUmVjdEV4dGVuc2lvbnMgfSBmcm9tICdAZm9ibGV4LzJkJztcbmltcG9ydCB7IENhbGN1bGF0ZUNvbm5lY3RhYmxlU2lkZUJ5SW50ZXJuYWxQb3NpdGlvblJlcXVlc3QgfSBmcm9tICcuLi9jYWxjdWxhdGUtY29ubmVjdGFibGUtc2lkZS1ieS1pbnRlcm5hbC1wb3NpdGlvbic7XG5cbmNvbnN0IFNOQVBfRVBTID0gMjtcblxuY29uc3QgZW51bSBTaWRlTWFzayB7XG4gIE5PTkUgPSAwLFxuICBMRUZUID0gMSA8PCAwLFxuICBSSUdIVCA9IDEgPDwgMSxcbiAgVE9QID0gMSA8PCAyLFxuICBCT1RUT00gPSAxIDw8IDMsXG4gIEFMTCA9ICgxIDw8IDQpIC0gMSxcbn1cblxuY29uc3QgQ0FMQ1VMQVRFX1NJREVTID0ge1xuICBbRUZDb25uZWN0YWJsZVNpZGUuQ0FMQ1VMQVRFXTogW1xuICAgIEVGQ29ubmVjdGFibGVTaWRlLlRPUCxcbiAgICBFRkNvbm5lY3RhYmxlU2lkZS5CT1RUT00sXG4gICAgRUZDb25uZWN0YWJsZVNpZGUuTEVGVCxcbiAgICBFRkNvbm5lY3RhYmxlU2lkZS5SSUdIVCxcbiAgXSxcbiAgW0VGQ29ubmVjdGFibGVTaWRlLkNBTENVTEFURV9IT1JJWk9OVEFMXTogW0VGQ29ubmVjdGFibGVTaWRlLkxFRlQsIEVGQ29ubmVjdGFibGVTaWRlLlJJR0hUXSxcbiAgW0VGQ29ubmVjdGFibGVTaWRlLkNBTENVTEFURV9WRVJUSUNBTF06IFtFRkNvbm5lY3RhYmxlU2lkZS5UT1AsIEVGQ29ubmVjdGFibGVTaWRlLkJPVFRPTV0sXG59O1xuXG4vKipcbiAqIEV4ZWN1dGlvbiB0aGF0IGNhbGN1bGF0ZXMgdGhlIGNvbm5lY3RhYmxlIHNpZGUgZm9yIGEgY29ubmVjdG9yXG4gKiBiYXNlZCBvbiBwb3NpdGlvbnMgb2YgY29ubmVjdGVkIGNvbm5lY3RvcnMgYW5kIGFsbG93ZWQgc2lkZXMuXG4gKi9cbkBJbmplY3RhYmxlKClcbkBGRXhlY3V0aW9uUmVnaXN0ZXIoQ2FsY3VsYXRlQ29ubmVjdGFibGVTaWRlQnlDb25uZWN0ZWRQb3NpdGlvbnNSZXF1ZXN0KVxuZXhwb3J0IGNsYXNzIENhbGN1bGF0ZUNvbm5lY3RhYmxlU2lkZUJ5Q29ubmVjdGVkUG9zaXRpb25zXG4gIGltcGxlbWVudHMgSUV4ZWN1dGlvbjxDYWxjdWxhdGVDb25uZWN0YWJsZVNpZGVCeUNvbm5lY3RlZFBvc2l0aW9uc1JlcXVlc3QsIEVGQ29ubmVjdGFibGVTaWRlPlxue1xuICBwcml2YXRlIHJlYWRvbmx5IF9tZWRpYXRvciA9IGluamVjdChGTWVkaWF0b3IpO1xuXG4gIC8qKlxuICAgKiBFbnRyeSBwb2ludCAoaG90IHBhdGgpLiBBdm9pZHMgaW50ZXJtZWRpYXRlIGFycmF5cyBhbmQgcmVkdW5kYW50IGFsbG9jYXRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gcmVxdWVzdCAtIENvbnRhaW5zIHRoZSBjb25uZWN0b3IgYW5kIG9wdGlvbmFsbHkgYWxsb3dlZCBzaWRlcy5cbiAgICogQHJldHVybnMge0VGQ29ubmVjdGFibGVTaWRlfSAtIFRoZSBjaG9zZW4gY29ubmVjdGFibGUgc2lkZS5cbiAgICovXG4gIHB1YmxpYyBoYW5kbGUoe1xuICAgIGNvbm5lY3RvcixcbiAgICBtb2RlLFxuICB9OiBDYWxjdWxhdGVDb25uZWN0YWJsZVNpZGVCeUNvbm5lY3RlZFBvc2l0aW9uc1JlcXVlc3QpOiBFRkNvbm5lY3RhYmxlU2lkZSB7XG4gICAgY29uc3Qgc2VsZkNlbnRlciA9IFJlY3RFeHRlbnNpb25zLmZyb21FbGVtZW50KGNvbm5lY3Rvci5ob3N0RWxlbWVudCkuZ3Jhdml0eUNlbnRlcjtcblxuICAgIGNvbnN0IGFjYyA9IHRoaXMuX2FjY3VtdWxhdGVDb25uZWN0ZWRDZW50ZXJzKGNvbm5lY3Rvci5ob3N0RWxlbWVudCwgY29ubmVjdG9yLnRvQ29ubmVjdG9yKTtcblxuICAgIGlmIChhY2MuY291bnQgPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzLl9tZWRpYXRvci5leGVjdXRlKFxuICAgICAgICBuZXcgQ2FsY3VsYXRlQ29ubmVjdGFibGVTaWRlQnlJbnRlcm5hbFBvc2l0aW9uUmVxdWVzdChjb25uZWN0b3IpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBhdmdYID0gYWNjLnN1bVggLyBhY2MuY291bnQ7XG4gICAgY29uc3QgYXZnWSA9IGFjYy5zdW1ZIC8gYWNjLmNvdW50O1xuXG4gICAgY29uc3QgbWFzayA9IHRoaXMuX3RvU2lkZU1hc2soQ0FMQ1VMQVRFX1NJREVTW21vZGVdKTtcblxuICAgIHJldHVybiB0aGlzLl9kZXRlcm1pbmVTaWRlKHNlbGZDZW50ZXIueCwgc2VsZkNlbnRlci55LCBhdmdYLCBhdmdZLCBtYXNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY2N1bXVsYXRlcyBzdW0gb2YgZ3Jhdml0eSBjZW50ZXJzIGFuZCBjb3VudCwgZXhjbHVkaW5nIHRoZSBjdXJyZW50IGhvc3QuXG4gICAqIFNpbmdsZSBwYXNzLCBtaW5pbWFsIGFsbG9jYXRpb25zLlxuICAgKi9cbiAgcHJpdmF0ZSBfYWNjdW11bGF0ZUNvbm5lY3RlZENlbnRlcnMoXG4gICAgc2VsZkhvc3Q6IEhUTUxFbGVtZW50IHwgU1ZHRWxlbWVudCxcbiAgICBjb25uZWN0ZWQ6IEZDb25uZWN0b3JCYXNlW10gfCBudWxsIHwgdW5kZWZpbmVkLFxuICApOiB7IHN1bVg6IG51bWJlcjsgc3VtWTogbnVtYmVyOyBjb3VudDogbnVtYmVyIH0ge1xuICAgIGxldCBzdW1YID0gMDtcbiAgICBsZXQgc3VtWSA9IDA7XG4gICAgbGV0IGNvdW50ID0gMDtcblxuICAgIGlmIChjb25uZWN0ZWQgJiYgY29ubmVjdGVkLmxlbmd0aCkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25uZWN0ZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgZWwgPSBjb25uZWN0ZWRbaV0/Lmhvc3RFbGVtZW50IGFzIEhUTUxFbGVtZW50IHwgU1ZHRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKCFlbCB8fCBlbCA9PT0gc2VsZkhvc3QpIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnN0IGMgPSBSZWN0RXh0ZW5zaW9ucy5mcm9tRWxlbWVudChlbCkuZ3Jhdml0eUNlbnRlcjtcbiAgICAgICAgc3VtWCArPSBjLng7XG4gICAgICAgIHN1bVkgKz0gYy55O1xuICAgICAgICBjb3VudCsrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IHN1bVgsIHN1bVksIGNvdW50IH07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYWxsb3dlZCBzaWRlcyBhcnJheSB0byBhIGNvbXBhY3QgYml0IG1hc2suXG4gICAqIElmIG5vdCBwcm92aWRlZCBvciBlbXB0eSAtPiBhbGwgc2lkZXMgYWxsb3dlZC5cbiAgICovXG4gIHByaXZhdGUgX3RvU2lkZU1hc2soYWxsb3dlZD86IEVGQ29ubmVjdGFibGVTaWRlW10pOiBTaWRlTWFzayB7XG4gICAgaWYgKCFhbGxvd2VkIHx8IGFsbG93ZWQubGVuZ3RoID09PSAwKSByZXR1cm4gU2lkZU1hc2suQUxMO1xuXG4gICAgbGV0IG1hc2sgPSBTaWRlTWFzay5OT05FO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWxsb3dlZC5sZW5ndGg7IGkrKykge1xuICAgICAgc3dpdGNoIChhbGxvd2VkW2ldKSB7XG4gICAgICAgIGNhc2UgRUZDb25uZWN0YWJsZVNpZGUuTEVGVDpcbiAgICAgICAgICBtYXNrIHw9IFNpZGVNYXNrLkxFRlQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgRUZDb25uZWN0YWJsZVNpZGUuUklHSFQ6XG4gICAgICAgICAgbWFzayB8PSBTaWRlTWFzay5SSUdIVDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBFRkNvbm5lY3RhYmxlU2lkZS5UT1A6XG4gICAgICAgICAgbWFzayB8PSBTaWRlTWFzay5UT1A7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgRUZDb25uZWN0YWJsZVNpZGUuQk9UVE9NOlxuICAgICAgICAgIG1hc2sgfD0gU2lkZU1hc2suQk9UVE9NO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtYXNrIHx8IFNpZGVNYXNrLkFMTDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIGZpbmFsIHNpZGUgdXNpbmcgaWRlYWwgc2lkZSBmaXJzdDsgaWYgZGlzYWxsb3dlZCwgcGlja3MgYmVzdCBmYWxsYmFjay5cbiAgICogSW5wdXRzIGFyZSBudW1iZXJzIHRvIGF2b2lkIG9iamVjdCB3cmFwcGVycyBvbiBob3QgcGF0aC5cbiAgICovXG4gIHByaXZhdGUgX2RldGVybWluZVNpZGUoXG4gICAgc2VsZlg6IG51bWJlcixcbiAgICBzZWxmWTogbnVtYmVyLFxuICAgIGF2Z1g6IG51bWJlcixcbiAgICBhdmdZOiBudW1iZXIsXG4gICAgYWxsb3dlZE1hc2s6IFNpZGVNYXNrLFxuICApOiBFRkNvbm5lY3RhYmxlU2lkZSB7XG4gICAgY29uc3QgZHggPSBhdmdYIC0gc2VsZlg7XG4gICAgY29uc3QgZHkgPSBhdmdZIC0gc2VsZlk7XG5cbiAgICBjb25zdCBpZGVhbCA9IHRoaXMuX3BpY2tJZGVhbFNpZGUoZHgsIGR5KTtcblxuICAgIGlmICh0aGlzLl9pc0FsbG93ZWQoaWRlYWwsIGFsbG93ZWRNYXNrKSkge1xuICAgICAgcmV0dXJuIGlkZWFsO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9waWNrRmFsbGJhY2tTaWRlKGR4LCBkeSwgYWxsb3dlZE1hc2ssIGlkZWFsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQaWNrcyB0aGUgXCJpZGVhbFwiIHNpZGUgYmFzZWQgb24gdmVjdG9yIChkeCwgZHkpIHdpdGggaHlzdGVyZXNpcy5cbiAgICovXG4gIHByaXZhdGUgX3BpY2tJZGVhbFNpZGUoZHg6IG51bWJlciwgZHk6IG51bWJlcik6IEVGQ29ubmVjdGFibGVTaWRlIHtcbiAgICBjb25zdCBheCA9IGR4IDwgMCA/IC1keCA6IGR4O1xuICAgIGNvbnN0IGF5ID0gZHkgPCAwID8gLWR5IDogZHk7XG5cbiAgICBpZiAoYXggLSBheSA+IFNOQVBfRVBTKSB7XG4gICAgICByZXR1cm4gZHggPCAwID8gRUZDb25uZWN0YWJsZVNpZGUuTEVGVCA6IEVGQ29ubmVjdGFibGVTaWRlLlJJR0hUO1xuICAgIH1cbiAgICBpZiAoYXkgLSBheCA+IFNOQVBfRVBTKSB7XG4gICAgICByZXR1cm4gZHkgPCAwID8gRUZDb25uZWN0YWJsZVNpZGUuVE9QIDogRUZDb25uZWN0YWJsZVNpZGUuQk9UVE9NO1xuICAgIH1cblxuICAgIHJldHVybiBkeSA8IDAgPyBFRkNvbm5lY3RhYmxlU2lkZS5UT1AgOiBFRkNvbm5lY3RhYmxlU2lkZS5CT1RUT007XG4gIH1cblxuICAvKipcbiAgICogUXVpY2sgbWVtYmVyc2hpcCBjaGVjayB2aWEgYml0IG1hc2suXG4gICAqL1xuICBwcml2YXRlIF9pc0FsbG93ZWQoc2lkZTogRUZDb25uZWN0YWJsZVNpZGUsIG1hc2s6IFNpZGVNYXNrKTogYm9vbGVhbiB7XG4gICAgc3dpdGNoIChzaWRlKSB7XG4gICAgICBjYXNlIEVGQ29ubmVjdGFibGVTaWRlLkxFRlQ6XG4gICAgICAgIHJldHVybiAobWFzayAmIFNpZGVNYXNrLkxFRlQpICE9PSAwO1xuICAgICAgY2FzZSBFRkNvbm5lY3RhYmxlU2lkZS5SSUdIVDpcbiAgICAgICAgcmV0dXJuIChtYXNrICYgU2lkZU1hc2suUklHSFQpICE9PSAwO1xuICAgICAgY2FzZSBFRkNvbm5lY3RhYmxlU2lkZS5UT1A6XG4gICAgICAgIHJldHVybiAobWFzayAmIFNpZGVNYXNrLlRPUCkgIT09IDA7XG4gICAgICBjYXNlIEVGQ29ubmVjdGFibGVTaWRlLkJPVFRPTTpcbiAgICAgICAgcmV0dXJuIChtYXNrICYgU2lkZU1hc2suQk9UVE9NKSAhPT0gMDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQaWNrcyB0aGUgYmVzdCBhdmFpbGFibGUgc2lkZSBmcm9tIGFsbG93ZWQgbWFzayBieSBtYXhpbWl6aW5nIGRpcmVjdGlvbmFsIHNjb3JlLlxuICAgKiBObyBpbnRlcm1lZGlhdGUgb2JqZWN0cywgY29uc3RhbnQtdGltZSBvcGVyYXRpb25zLlxuICAgKi9cbiAgcHJpdmF0ZSBfcGlja0ZhbGxiYWNrU2lkZShcbiAgICBkeDogbnVtYmVyLFxuICAgIGR5OiBudW1iZXIsXG4gICAgYWxsb3dlZE1hc2s6IFNpZGVNYXNrLFxuICAgIGlkZWFsOiBFRkNvbm5lY3RhYmxlU2lkZSxcbiAgKTogRUZDb25uZWN0YWJsZVNpZGUge1xuICAgIGxldCBiZXN0U2lkZTogRUZDb25uZWN0YWJsZVNpZGUgPSBpZGVhbDtcbiAgICBsZXQgYmVzdFNjb3JlID0gLUluZmluaXR5O1xuXG4gICAgaWYgKGFsbG93ZWRNYXNrICYgU2lkZU1hc2suUklHSFQpIHtcbiAgICAgIGNvbnN0IHMgPSBkeDtcbiAgICAgIGlmIChzID4gYmVzdFNjb3JlKSB7XG4gICAgICAgIGJlc3RTY29yZSA9IHM7XG4gICAgICAgIGJlc3RTaWRlID0gRUZDb25uZWN0YWJsZVNpZGUuUklHSFQ7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChhbGxvd2VkTWFzayAmIFNpZGVNYXNrLkxFRlQpIHtcbiAgICAgIGNvbnN0IHMgPSAtZHg7XG4gICAgICBpZiAocyA+IGJlc3RTY29yZSkge1xuICAgICAgICBiZXN0U2NvcmUgPSBzO1xuICAgICAgICBiZXN0U2lkZSA9IEVGQ29ubmVjdGFibGVTaWRlLkxFRlQ7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChhbGxvd2VkTWFzayAmIFNpZGVNYXNrLkJPVFRPTSkge1xuICAgICAgY29uc3QgcyA9IGR5O1xuICAgICAgaWYgKHMgPiBiZXN0U2NvcmUpIHtcbiAgICAgICAgYmVzdFNjb3JlID0gcztcbiAgICAgICAgYmVzdFNpZGUgPSBFRkNvbm5lY3RhYmxlU2lkZS5CT1RUT007XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChhbGxvd2VkTWFzayAmIFNpZGVNYXNrLlRPUCkge1xuICAgICAgY29uc3QgcyA9IC1keTtcbiAgICAgIGlmIChzID4gYmVzdFNjb3JlKSB7XG4gICAgICAgIGJlc3RTY29yZSA9IHM7XG4gICAgICAgIGJlc3RTaWRlID0gRUZDb25uZWN0YWJsZVNpZGUuVE9QO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBiZXN0U2lkZTtcbiAgfVxufVxuIl19
@@ -0,0 +1,3 @@
1
+ export * from './calculate-connectable-side-by-connected-positions';
2
+ export * from './calculate-connectable-side-by-connected-positions-request';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mLWZsb3cvc3JjL2RvbWFpbi9mLW5vZGUvY2FsY3VsYXRlLW5vZGUtY29ubmVjdG9ycy1jb25uZWN0YWJsZS1zaWRlcy9jYWxjdWxhdGUtY29ubmVjdGFibGUtc2lkZS1ieS1jb25uZWN0ZWQtcG9zaXRpb25zL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMscURBQXFELENBQUM7QUFFcEUsY0FBYyw2REFBNkQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vY2FsY3VsYXRlLWNvbm5lY3RhYmxlLXNpZGUtYnktY29ubmVjdGVkLXBvc2l0aW9ucyc7XG5cbmV4cG9ydCAqIGZyb20gJy4vY2FsY3VsYXRlLWNvbm5lY3RhYmxlLXNpZGUtYnktY29ubmVjdGVkLXBvc2l0aW9ucy1yZXF1ZXN0JztcbiJdfQ==
@@ -0,0 +1,8 @@
1
+ export class CalculateConnectableSideByInternalPositionRequest {
2
+ connector;
3
+ static fToken = Symbol('CalculateConnectableSideByInternalPositionRequest');
4
+ constructor(connector) {
5
+ this.connector = connector;
6
+ }
7
+ }
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsY3VsYXRlLWNvbm5lY3RhYmxlLXNpZGUtYnktaW50ZXJuYWwtcG9zaXRpb24tcmVxdWVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2YtZmxvdy9zcmMvZG9tYWluL2Ytbm9kZS9jYWxjdWxhdGUtbm9kZS1jb25uZWN0b3JzLWNvbm5lY3RhYmxlLXNpZGVzL2NhbGN1bGF0ZS1jb25uZWN0YWJsZS1zaWRlLWJ5LWludGVybmFsLXBvc2l0aW9uL2NhbGN1bGF0ZS1jb25uZWN0YWJsZS1zaWRlLWJ5LWludGVybmFsLXBvc2l0aW9uLXJlcXVlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxPQUFPLGlEQUFpRDtJQUVoQztJQUQ1QixNQUFNLENBQVUsTUFBTSxHQUFHLE1BQU0sQ0FBQyxtREFBbUQsQ0FBQyxDQUFDO0lBQ3JGLFlBQTRCLFNBQXlCO1FBQXpCLGNBQVMsR0FBVCxTQUFTLENBQWdCO0lBQUcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZDb25uZWN0b3JCYXNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vZi1jb25uZWN0b3JzJztcblxuZXhwb3J0IGNsYXNzIENhbGN1bGF0ZUNvbm5lY3RhYmxlU2lkZUJ5SW50ZXJuYWxQb3NpdGlvblJlcXVlc3Qge1xuICBzdGF0aWMgcmVhZG9ubHkgZlRva2VuID0gU3ltYm9sKCdDYWxjdWxhdGVDb25uZWN0YWJsZVNpZGVCeUludGVybmFsUG9zaXRpb25SZXF1ZXN0Jyk7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBjb25uZWN0b3I6IEZDb25uZWN0b3JCYXNlKSB7fVxufVxuIl19
@@ -0,0 +1,55 @@
1
+ import { __decorate } from "tslib";
2
+ import { Injectable } from '@angular/core';
3
+ import { FExecutionRegister } from '@foblex/mediator';
4
+ import { CalculateConnectableSideByInternalPositionRequest } from './calculate-connectable-side-by-internal-position-request';
5
+ import { EFConnectableSide } from '../../../../f-connectors';
6
+ import { RectExtensions } from '@foblex/2d';
7
+ import * as i0 from "@angular/core";
8
+ /**
9
+ * Execution that calculates the connectable side for a connector
10
+ * based on the internal position of the connector relative to its node host.
11
+ */
12
+ let CalculateConnectableSideByInternalPosition = class CalculateConnectableSideByInternalPosition {
13
+ handle({ connector, }) {
14
+ return this._getSideByDelta(connector.hostElement, connector.fNodeHost);
15
+ }
16
+ /**
17
+ * Determines the side of the connector relative to the node host based on the minimum distance.
18
+ * @param connectorHost
19
+ * @param nodeHost
20
+ * @private
21
+ */
22
+ _getSideByDelta(connectorHost, nodeHost) {
23
+ let result;
24
+ const childRect = RectExtensions.fromElement(connectorHost);
25
+ const parentRect = nodeHost.getBoundingClientRect();
26
+ const deltaLeft = childRect.gravityCenter.x - parentRect.left;
27
+ const deltaRight = parentRect.right - childRect.gravityCenter.x;
28
+ const deltaTop = childRect.gravityCenter.y - parentRect.top;
29
+ const deltaBottom = parentRect.bottom - childRect.gravityCenter.y;
30
+ const minDelta = Math.min(deltaLeft, deltaRight, deltaTop, deltaBottom);
31
+ if (minDelta === deltaLeft) {
32
+ result = EFConnectableSide.LEFT;
33
+ }
34
+ else if (minDelta === deltaRight) {
35
+ result = EFConnectableSide.RIGHT;
36
+ }
37
+ else if (minDelta === deltaTop) {
38
+ result = EFConnectableSide.TOP;
39
+ }
40
+ else {
41
+ result = EFConnectableSide.BOTTOM;
42
+ }
43
+ return result;
44
+ }
45
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CalculateConnectableSideByInternalPosition, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
46
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CalculateConnectableSideByInternalPosition });
47
+ };
48
+ CalculateConnectableSideByInternalPosition = __decorate([
49
+ FExecutionRegister(CalculateConnectableSideByInternalPositionRequest)
50
+ ], CalculateConnectableSideByInternalPosition);
51
+ export { CalculateConnectableSideByInternalPosition };
52
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CalculateConnectableSideByInternalPosition, decorators: [{
53
+ type: Injectable
54
+ }] });
55
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsY3VsYXRlLWNvbm5lY3RhYmxlLXNpZGUtYnktaW50ZXJuYWwtcG9zaXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mLWZsb3cvc3JjL2RvbWFpbi9mLW5vZGUvY2FsY3VsYXRlLW5vZGUtY29ubmVjdG9ycy1jb25uZWN0YWJsZS1zaWRlcy9jYWxjdWxhdGUtY29ubmVjdGFibGUtc2lkZS1ieS1pbnRlcm5hbC1wb3NpdGlvbi9jYWxjdWxhdGUtY29ubmVjdGFibGUtc2lkZS1ieS1pbnRlcm5hbC1wb3NpdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsa0JBQWtCLEVBQWMsTUFBTSxrQkFBa0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsaURBQWlELEVBQUUsTUFBTSwyREFBMkQsQ0FBQztBQUM5SCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sWUFBWSxDQUFDOztBQUU1Qzs7O0dBR0c7QUFHSSxJQUFNLDBDQUEwQyxHQUFoRCxNQUFNLDBDQUEwQztJQUc5QyxNQUFNLENBQUMsRUFDWixTQUFTLEdBQ3lDO1FBQ2xELE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxlQUFlLENBQ3JCLGFBQXVDLEVBQ3ZDLFFBQWtDO1FBRWxDLElBQUksTUFBcUMsQ0FBQztRQUUxQyxNQUFNLFNBQVMsR0FBRyxjQUFjLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzVELE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBRXBELE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUM7UUFDOUQsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztRQUNoRSxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDO1FBQzVELE1BQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7UUFFbEUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUV4RSxJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMzQixNQUFNLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDO1FBQ2xDLENBQUM7YUFBTSxJQUFJLFFBQVEsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUNuQyxNQUFNLEdBQUcsaUJBQWlCLENBQUMsS0FBSyxDQUFDO1FBQ25DLENBQUM7YUFBTSxJQUFJLFFBQVEsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNqQyxNQUFNLEdBQUcsaUJBQWlCLENBQUMsR0FBRyxDQUFDO1FBQ2pDLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxHQUFHLGlCQUFpQixDQUFDLE1BQU0sQ0FBQztRQUNwQyxDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQzt3R0ExQ1UsMENBQTBDOzRHQUExQywwQ0FBMEM7O0FBQTFDLDBDQUEwQztJQUR0RCxrQkFBa0IsQ0FBQyxpREFBaUQsQ0FBQztHQUN6RCwwQ0FBMEMsQ0EyQ3REOzs0RkEzQ1ksMENBQTBDO2tCQUZ0RCxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRkV4ZWN1dGlvblJlZ2lzdGVyLCBJRXhlY3V0aW9uIH0gZnJvbSAnQGZvYmxleC9tZWRpYXRvcic7XG5pbXBvcnQgeyBDYWxjdWxhdGVDb25uZWN0YWJsZVNpZGVCeUludGVybmFsUG9zaXRpb25SZXF1ZXN0IH0gZnJvbSAnLi9jYWxjdWxhdGUtY29ubmVjdGFibGUtc2lkZS1ieS1pbnRlcm5hbC1wb3NpdGlvbi1yZXF1ZXN0JztcbmltcG9ydCB7IEVGQ29ubmVjdGFibGVTaWRlIH0gZnJvbSAnLi4vLi4vLi4vLi4vZi1jb25uZWN0b3JzJztcbmltcG9ydCB7IFJlY3RFeHRlbnNpb25zIH0gZnJvbSAnQGZvYmxleC8yZCc7XG5cbi8qKlxuICogRXhlY3V0aW9uIHRoYXQgY2FsY3VsYXRlcyB0aGUgY29ubmVjdGFibGUgc2lkZSBmb3IgYSBjb25uZWN0b3JcbiAqIGJhc2VkIG9uIHRoZSBpbnRlcm5hbCBwb3NpdGlvbiBvZiB0aGUgY29ubmVjdG9yIHJlbGF0aXZlIHRvIGl0cyBub2RlIGhvc3QuXG4gKi9cbkBJbmplY3RhYmxlKClcbkBGRXhlY3V0aW9uUmVnaXN0ZXIoQ2FsY3VsYXRlQ29ubmVjdGFibGVTaWRlQnlJbnRlcm5hbFBvc2l0aW9uUmVxdWVzdClcbmV4cG9ydCBjbGFzcyBDYWxjdWxhdGVDb25uZWN0YWJsZVNpZGVCeUludGVybmFsUG9zaXRpb25cbiAgaW1wbGVtZW50cyBJRXhlY3V0aW9uPENhbGN1bGF0ZUNvbm5lY3RhYmxlU2lkZUJ5SW50ZXJuYWxQb3NpdGlvblJlcXVlc3QsIEVGQ29ubmVjdGFibGVTaWRlPlxue1xuICBwdWJsaWMgaGFuZGxlKHtcbiAgICBjb25uZWN0b3IsXG4gIH06IENhbGN1bGF0ZUNvbm5lY3RhYmxlU2lkZUJ5SW50ZXJuYWxQb3NpdGlvblJlcXVlc3QpOiBFRkNvbm5lY3RhYmxlU2lkZSB7XG4gICAgcmV0dXJuIHRoaXMuX2dldFNpZGVCeURlbHRhKGNvbm5lY3Rvci5ob3N0RWxlbWVudCwgY29ubmVjdG9yLmZOb2RlSG9zdCk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB0aGUgc2lkZSBvZiB0aGUgY29ubmVjdG9yIHJlbGF0aXZlIHRvIHRoZSBub2RlIGhvc3QgYmFzZWQgb24gdGhlIG1pbmltdW0gZGlzdGFuY2UuXG4gICAqIEBwYXJhbSBjb25uZWN0b3JIb3N0XG4gICAqIEBwYXJhbSBub2RlSG9zdFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0U2lkZUJ5RGVsdGEoXG4gICAgY29ubmVjdG9ySG9zdDogSFRNTEVsZW1lbnQgfCBTVkdFbGVtZW50LFxuICAgIG5vZGVIb3N0OiBIVE1MRWxlbWVudCB8IFNWR0VsZW1lbnQsXG4gICk6IEVGQ29ubmVjdGFibGVTaWRlIHtcbiAgICBsZXQgcmVzdWx0OiBFRkNvbm5lY3RhYmxlU2lkZSB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGNoaWxkUmVjdCA9IFJlY3RFeHRlbnNpb25zLmZyb21FbGVtZW50KGNvbm5lY3Rvckhvc3QpO1xuICAgIGNvbnN0IHBhcmVudFJlY3QgPSBub2RlSG9zdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIGNvbnN0IGRlbHRhTGVmdCA9IGNoaWxkUmVjdC5ncmF2aXR5Q2VudGVyLnggLSBwYXJlbnRSZWN0LmxlZnQ7XG4gICAgY29uc3QgZGVsdGFSaWdodCA9IHBhcmVudFJlY3QucmlnaHQgLSBjaGlsZFJlY3QuZ3Jhdml0eUNlbnRlci54O1xuICAgIGNvbnN0IGRlbHRhVG9wID0gY2hpbGRSZWN0LmdyYXZpdHlDZW50ZXIueSAtIHBhcmVudFJlY3QudG9wO1xuICAgIGNvbnN0IGRlbHRhQm90dG9tID0gcGFyZW50UmVjdC5ib3R0b20gLSBjaGlsZFJlY3QuZ3Jhdml0eUNlbnRlci55O1xuXG4gICAgY29uc3QgbWluRGVsdGEgPSBNYXRoLm1pbihkZWx0YUxlZnQsIGRlbHRhUmlnaHQsIGRlbHRhVG9wLCBkZWx0YUJvdHRvbSk7XG5cbiAgICBpZiAobWluRGVsdGEgPT09IGRlbHRhTGVmdCkge1xuICAgICAgcmVzdWx0ID0gRUZDb25uZWN0YWJsZVNpZGUuTEVGVDtcbiAgICB9IGVsc2UgaWYgKG1pbkRlbHRhID09PSBkZWx0YVJpZ2h0KSB7XG4gICAgICByZXN1bHQgPSBFRkNvbm5lY3RhYmxlU2lkZS5SSUdIVDtcbiAgICB9IGVsc2UgaWYgKG1pbkRlbHRhID09PSBkZWx0YVRvcCkge1xuICAgICAgcmVzdWx0ID0gRUZDb25uZWN0YWJsZVNpZGUuVE9QO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSBFRkNvbm5lY3RhYmxlU2lkZS5CT1RUT007XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuIl19
@@ -0,0 +1,3 @@
1
+ export * from './calculate-connectable-side-by-internal-position';
2
+ export * from './calculate-connectable-side-by-internal-position-request';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mLWZsb3cvc3JjL2RvbWFpbi9mLW5vZGUvY2FsY3VsYXRlLW5vZGUtY29ubmVjdG9ycy1jb25uZWN0YWJsZS1zaWRlcy9jYWxjdWxhdGUtY29ubmVjdGFibGUtc2lkZS1ieS1pbnRlcm5hbC1wb3NpdGlvbi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLG1EQUFtRCxDQUFDO0FBRWxFLGNBQWMsMkRBQTJELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2NhbGN1bGF0ZS1jb25uZWN0YWJsZS1zaWRlLWJ5LWludGVybmFsLXBvc2l0aW9uJztcblxuZXhwb3J0ICogZnJvbSAnLi9jYWxjdWxhdGUtY29ubmVjdGFibGUtc2lkZS1ieS1pbnRlcm5hbC1wb3NpdGlvbi1yZXF1ZXN0JztcbiJdfQ==
@@ -0,0 +1,8 @@
1
+ export class CalculateNodeConnectorsConnectableSidesRequest {
2
+ node;
3
+ static fToken = Symbol('CalculateNodeConnectorsConnectableSidesRequest');
4
+ constructor(node) {
5
+ this.node = node;
6
+ }
7
+ }
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsY3VsYXRlLW5vZGUtY29ubmVjdG9ycy1jb25uZWN0YWJsZS1zaWRlcy1yZXF1ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZi1mbG93L3NyYy9kb21haW4vZi1ub2RlL2NhbGN1bGF0ZS1ub2RlLWNvbm5lY3RvcnMtY29ubmVjdGFibGUtc2lkZXMvY2FsY3VsYXRlLW5vZGUtY29ubmVjdG9ycy1jb25uZWN0YWJsZS1zaWRlcy1yZXF1ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sT0FBTyw4Q0FBOEM7SUFFN0I7SUFENUIsTUFBTSxDQUFVLE1BQU0sR0FBRyxNQUFNLENBQUMsZ0RBQWdELENBQUMsQ0FBQztJQUNsRixZQUE0QixJQUFlO1FBQWYsU0FBSSxHQUFKLElBQUksQ0FBVztJQUFHLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGTm9kZUJhc2UgfSBmcm9tICcuLi8uLi8uLi9mLW5vZGUnO1xuXG5leHBvcnQgY2xhc3MgQ2FsY3VsYXRlTm9kZUNvbm5lY3RvcnNDb25uZWN0YWJsZVNpZGVzUmVxdWVzdCB7XG4gIHN0YXRpYyByZWFkb25seSBmVG9rZW4gPSBTeW1ib2woJ0NhbGN1bGF0ZU5vZGVDb25uZWN0b3JzQ29ubmVjdGFibGVTaWRlc1JlcXVlc3QnKTtcbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IG5vZGU6IEZOb2RlQmFzZSkge31cbn1cbiJdfQ==