@ngroznykh/papirus 0.9.0 → 0.9.2

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.
@@ -45,6 +45,9 @@ export declare class ConnectionManager extends EventEmitter<ConnectionEvents> {
45
45
  private sourceAnchorId;
46
46
  private hoverNodeId;
47
47
  private hoverAnchorId;
48
+ private hoverPoint;
49
+ private hoverOutlineHandle;
50
+ private hoverOutlineSide;
48
51
  private hoverDisabled;
49
52
  private reconnectPoint;
50
53
  private previewTargetAnchorId;
@@ -112,7 +115,7 @@ export declare class ConnectionManager extends EventEmitter<ConnectionEvents> {
112
115
  enableHover(): void;
113
116
  /**
114
117
  * Try to start connection from a hovered anchor point.
115
- * When attachToOutline + Shift: start from anywhere on node outline.
118
+ * When attachToOutline: drag the outline handle, or Shift+drag from the node body.
116
119
  * Otherwise: requires clicking on an anchor/port so that node drag still works.
117
120
  */
118
121
  tryStartConnectionAtPoint(event: InputEvent): boolean;
@@ -191,6 +194,13 @@ export declare class ConnectionManager extends EventEmitter<ConnectionEvents> {
191
194
  private renderAnchorHighlights;
192
195
  private drawCross;
193
196
  private getNodeAtPoint;
197
+ private startOutlineConnection;
198
+ private outlineHandleHysteresis;
199
+ private outlineConnectHandleFor;
200
+ private outlineHandleHitRadius;
201
+ private findOutlineConnectHandleAt;
202
+ private renderOutlineConnectHandle;
203
+ private clearOutlineHandleCursor;
194
204
  private updateHover;
195
205
  private getAnchorAtPoint;
196
206
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ConnectionManager.d.ts","sourceRoot":"","sources":["../../src/core/ConnectionManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ConnectionManager.d.ts","sourceRoot":"","sources":["../../src/core/ConnectionManager.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"EdgeEndpointUpdater.d.ts","sourceRoot":"","sources":["../../src/core/EdgeEndpointUpdater.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAOrD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,IAAI,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACtC,QAAQ,IAAI,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACtC,gBAAgB,IAAI,YAAY,EAAE,CAAC;CACpC;AAOD,qBAAa,mBAAmB;IAClB,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,uBAAuB;IAE1D,aAAa,IAAI,IAAI;IAMrB,SAAS,IAAI,IAAI;IAIjB,OAAO,CAAC,MAAM;IA+Bd,OAAO,CAAC,kBAAkB;IA2D1B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IA8C9B,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,mBAAmB;IAe3B,OAAO,CAAC,WAAW;IAqBnB;;;;;;;;;OASG;IACH,OAAO,CAAC,qBAAqB;IA2C7B,OAAO,CAAC,QAAQ;IAShB,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,mBAAmB;IAmB3B,OAAO,CAAC,mBAAmB;IAqB3B;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;IA6B3B,OAAO,CAAC,uBAAuB;CAOhC"}
1
+ {"version":3,"file":"EdgeEndpointUpdater.d.ts","sourceRoot":"","sources":["../../src/core/EdgeEndpointUpdater.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAMrD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,IAAI,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACtC,QAAQ,IAAI,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACtC,gBAAgB,IAAI,YAAY,EAAE,CAAC;CACpC;AAOD,qBAAa,mBAAmB;IAClB,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,uBAAuB;IAE1D,aAAa,IAAI,IAAI;IAMrB,SAAS,IAAI,IAAI;IAIjB,OAAO,CAAC,MAAM;IA+Bd,OAAO,CAAC,kBAAkB;IA2D1B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IA8C9B,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,mBAAmB;IAe3B,OAAO,CAAC,WAAW;IAqBnB;;;;;;;;;OASG;IACH,OAAO,CAAC,qBAAqB;IA2C7B,OAAO,CAAC,QAAQ;IAShB,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,mBAAmB;IAmB3B,OAAO,CAAC,mBAAmB;IAqB3B;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;IA4B3B,OAAO,CAAC,uBAAuB;CAOhC"}
@@ -4,6 +4,7 @@ import { TextLabel, TextLabelOptions } from './TextLabel';
4
4
  import { NodeImage, NodeImageOptions } from './NodeImage';
5
5
  import { StyleManager } from '../styles/StyleManager';
6
6
  import { Bounds, ContentInsetSides, NodeStyle, Point, Size } from '../types';
7
+ import { Direction } from '../utils/direction';
7
8
  import { ContentInsetScaleSides } from '../utils/resolveContentInset';
8
9
  /** Badge shown in top-left corner of node (e.g. interactive property indicator) */
9
10
  export interface NodeBadgeOption {
@@ -275,6 +276,15 @@ export declare abstract class Node extends Element {
275
276
  * Get point on outline at normalized param (0-1 along perimeter).
276
277
  * Base implementation uses rectangular outline. Override for non-rectangular shapes.
277
278
  */
279
+ /**
280
+ * Outward cardinal side at an outline param. Rectangles use AABB perimeter
281
+ * fractions; non-rectangular shapes override from the real outline point.
282
+ */
283
+ getOutlineDirection(param: number): Exclude<Direction, undefined>;
284
+ /**
285
+ * Outward side from node center toward a point on the outline.
286
+ */
287
+ protected outlineDirectionFromCenter(param: number): Exclude<Direction, undefined>;
278
288
  getConnectionPointAtOutlineParam(param: number): Point;
279
289
  /**
280
290
  * Get closest point on outline and its param (0-1).
@@ -1 +1 @@
1
- {"version":3,"file":"Node.d.ts","sourceRoot":"","sources":["../../src/elements/Node.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Node.d.ts","sourceRoot":"","sources":["../../src/elements/Node.ts"],"names":[],"mappings":"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"}
@@ -15,6 +15,7 @@ export declare class CircleNode extends Node {
15
15
  */
16
16
  get radiusY(): number;
17
17
  hitTest(point: Point): boolean;
18
+ getOutlineDirection(param: number): 'top' | 'right' | 'bottom' | 'left';
18
19
  getConnectionPointAtOutlineParam(param: number): Point;
19
20
  getClosestPointOnOutline(target: Point): {
20
21
  point: Point;
@@ -1 +1 @@
1
- {"version":3,"file":"CircleNode.d.ts","sourceRoot":"","sources":["../../../src/elements/nodes/CircleNode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC;AAEjD,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAE7C;;GAEG;AACH,qBAAa,UAAW,SAAQ,IAAI;gBACtB,OAAO,EAAE,WAAW;IAIhC,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,MAAM,CAEpB;IAEQ,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO;IAY9B,gCAAgC,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK;IAYtD,wBAAwB,CAAC,MAAM,EAAE,KAAK,GAAG;QAAE,KAAK,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE;cAc9D,qBAAqB,CAAC,MAAM,EAAE,KAAK,GAAG,KAAK;cAkB3C,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAWlE,MAAM,CAAC,GAAG,EAAE,wBAAwB,GAAG,IAAI;CAuB5C"}
1
+ {"version":3,"file":"CircleNode.d.ts","sourceRoot":"","sources":["../../../src/elements/nodes/CircleNode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC;AAEjD,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAE7C;;GAEG;AACH,qBAAa,UAAW,SAAQ,IAAI;gBACtB,OAAO,EAAE,WAAW;IAIhC,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,MAAM,CAEpB;IAEQ,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO;IAY9B,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM;IAIvE,gCAAgC,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK;IAYtD,wBAAwB,CAAC,MAAM,EAAE,KAAK,GAAG;QAAE,KAAK,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE;cAc9D,qBAAqB,CAAC,MAAM,EAAE,KAAK,GAAG,KAAK;cAkB3C,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAWlE,MAAM,CAAC,GAAG,EAAE,wBAAwB,GAAG,IAAI;CAuB5C"}
@@ -43,6 +43,7 @@ export declare class CustomShapeNode extends Node {
43
43
  setSvgPath(value: string | ((width: number, height: number) => string) | undefined): void;
44
44
  private getOutlineSample;
45
45
  private localToWorld;
46
+ getOutlineDirection(param: number): 'top' | 'right' | 'bottom' | 'left';
46
47
  getConnectionPointAtOutlineParam(param: number): Point;
47
48
  getClosestPointOnOutline(target: Point): {
48
49
  point: Point;
@@ -1 +1 @@
1
- {"version":3,"file":"CustomShapeNode.d.ts","sourceRoot":"","sources":["../../../src/elements/nodes/CustomShapeNode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC;AAEjD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAIrC,MAAM,WAAW,sBAAuB,SAAQ,WAAW;IACzD,IAAI,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC;IAC3D;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,IAAI;IACvC,OAAO,CAAC,YAAY,CAA4C;IAChE,OAAO,CAAC,eAAe,CAA4D;IACnF,OAAO,CAAC,UAAU,CAAC,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,cAAc,CAA4E;gBAEtF,OAAO,EAAE,sBAAsB;IAsB3C,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,IAAI,SAAS,IAAI,MAAM,GAAG,SAAS,CAElC;IAED,IAAI,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAKtC;IAED;;OAEG;IACH,cAAc,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI;IAOxE;;OAEG;IACH,OAAO,IAAI,MAAM;IAcjB;;OAEG;IACH,UAAU,IAAI,MAAM,GAAG,IAAI;IAO3B;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC,GAAG,SAAS,GAAG,IAAI;IAWzF,OAAO,CAAC,gBAAgB;IAkExB,OAAO,CAAC,YAAY;IAIX,gCAAgC,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK;IAuBtD,wBAAwB,CAAC,MAAM,EAAE,KAAK,GAAG;QAAE,KAAK,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE;cAiD9D,qBAAqB,CAAC,MAAM,EAAE,KAAK,GAAG,KAAK;IAqB9D,OAAO,CAAC,qBAAqB;IA6BpB,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO;IAyBvC,MAAM,CAAC,GAAG,EAAE,wBAAwB,GAAG,IAAI;CAsB5C;AAED;;GAEG;AACH,eAAO,MAAM,cAAc;IACzB;;OAEG;qBACc,MAAM,UAAU,MAAM,KAAG,MAAM;IAehD;;OAEG;2BACoB,MAAM,UAAU,MAAM,KAAG,MAAM;IAatD;;OAEG;sBACe,MAAM,UAAU,MAAM,KAAG,MAAM;IAgBjD;;OAEG;sBACe,MAAM,UAAU,MAAM,KAAG,MAAM;IAcjD;;OAEG;;qBAEY,MAAM,KAAK,MAAM,KAAG,MAAM;2BAEpB,MAAM,KAAK,MAAM,KAAG,MAAM;sBAI/B,MAAM,KAAK,MAAM,KAAG,MAAM;sBAK1B,MAAM,KAAK,MAAM,KAAG,MAAM;QAIxC,wCAAwC;uBACzB,MAAM,KAAK,MAAM,KAAG,MAAM;;CAK5C,CAAC"}
1
+ {"version":3,"file":"CustomShapeNode.d.ts","sourceRoot":"","sources":["../../../src/elements/nodes/CustomShapeNode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC;AAEjD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAIrC,MAAM,WAAW,sBAAuB,SAAQ,WAAW;IACzD,IAAI,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC;IAC3D;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,IAAI;IACvC,OAAO,CAAC,YAAY,CAA4C;IAChE,OAAO,CAAC,eAAe,CAA4D;IACnF,OAAO,CAAC,UAAU,CAAC,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,cAAc,CAA4E;gBAEtF,OAAO,EAAE,sBAAsB;IAsB3C,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,IAAI,SAAS,IAAI,MAAM,GAAG,SAAS,CAElC;IAED,IAAI,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAKtC;IAED;;OAEG;IACH,cAAc,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI;IAOxE;;OAEG;IACH,OAAO,IAAI,MAAM;IAcjB;;OAEG;IACH,UAAU,IAAI,MAAM,GAAG,IAAI;IAO3B;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC,GAAG,SAAS,GAAG,IAAI;IAWzF,OAAO,CAAC,gBAAgB;IAkExB,OAAO,CAAC,YAAY;IAIX,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM;IAOvE,gCAAgC,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK;IAuBtD,wBAAwB,CAAC,MAAM,EAAE,KAAK,GAAG;QAAE,KAAK,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE;cAiD9D,qBAAqB,CAAC,MAAM,EAAE,KAAK,GAAG,KAAK;IAqB9D,OAAO,CAAC,qBAAqB;IA6BpB,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO;IAyBvC,MAAM,CAAC,GAAG,EAAE,wBAAwB,GAAG,IAAI;CAsB5C;AAED;;GAEG;AACH,eAAO,MAAM,cAAc;IACzB;;OAEG;qBACc,MAAM,UAAU,MAAM,KAAG,MAAM;IAehD;;OAEG;2BACoB,MAAM,UAAU,MAAM,KAAG,MAAM;IAatD;;OAEG;sBACe,MAAM,UAAU,MAAM,KAAG,MAAM;IAgBjD;;OAEG;sBACe,MAAM,UAAU,MAAM,KAAG,MAAM;IAcjD;;OAEG;;qBAEY,MAAM,KAAK,MAAM,KAAG,MAAM;2BAEpB,MAAM,KAAK,MAAM,KAAG,MAAM;sBAI/B,MAAM,KAAK,MAAM,KAAG,MAAM;sBAK1B,MAAM,KAAK,MAAM,KAAG,MAAM;QAIxC,wCAAwC;uBACzB,MAAM,KAAK,MAAM,KAAG,MAAM;;CAK5C,CAAC"}
@@ -7,6 +7,7 @@ export declare class DiamondNode extends Node {
7
7
  constructor(options: NodeOptions);
8
8
  get typeName(): string;
9
9
  hitTest(point: Point): boolean;
10
+ getOutlineDirection(param: number): 'top' | 'right' | 'bottom' | 'left';
10
11
  getConnectionPointAtOutlineParam(param: number): Point;
11
12
  getClosestPointOnOutline(target: Point): {
12
13
  point: Point;
@@ -1 +1 @@
1
- {"version":3,"file":"DiamondNode.d.ts","sourceRoot":"","sources":["../../../src/elements/nodes/DiamondNode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC;AAEjD,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAE7C;;GAEG;AACH,qBAAa,WAAY,SAAQ,IAAI;gBACvB,OAAO,EAAE,WAAW;IAIhC,IAAI,QAAQ,IAAI,MAAM,CAErB;IAEQ,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO;IAe9B,gCAAgC,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK;IA6BtD,wBAAwB,CAAC,MAAM,EAAE,KAAK,GAAG;QAAE,KAAK,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE;cAuC9D,qBAAqB,CAAC,MAAM,EAAE,KAAK,GAAG,KAAK;cAkB3C,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAWlE,MAAM,CAAC,GAAG,EAAE,wBAAwB,GAAG,IAAI;CA0B5C"}
1
+ {"version":3,"file":"DiamondNode.d.ts","sourceRoot":"","sources":["../../../src/elements/nodes/DiamondNode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC;AAEjD,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAE7C;;GAEG;AACH,qBAAa,WAAY,SAAQ,IAAI;gBACvB,OAAO,EAAE,WAAW;IAIhC,IAAI,QAAQ,IAAI,MAAM,CAErB;IAEQ,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO;IAe9B,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM;IAIvE,gCAAgC,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK;IA6BtD,wBAAwB,CAAC,MAAM,EAAE,KAAK,GAAG;QAAE,KAAK,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE;cAuC9D,qBAAqB,CAAC,MAAM,EAAE,KAAK,GAAG,KAAK;cAkB3C,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAWlE,MAAM,CAAC,GAAG,EAAE,wBAAwB,GAAG,IAAI;CA0B5C"}
package/dist/papirus.js CHANGED
@@ -1698,6 +1698,11 @@ function getDirectionFromOutlineParam(param, bounds) {
1698
1698
  if (p < .75) return "bottom";
1699
1699
  return "left";
1700
1700
  }
1701
+ /** Snap a vector to a cardinal side (Y-down canvas). */
1702
+ function directionFromDelta(dx, dy) {
1703
+ if (Math.abs(dx) > Math.abs(dy)) return dx >= 0 ? "right" : "left";
1704
+ return dy >= 0 ? "bottom" : "top";
1705
+ }
1701
1706
  function isHorizontal(dir) {
1702
1707
  return dir === "left" || dir === "right";
1703
1708
  }
@@ -1731,6 +1736,101 @@ function directionToVector(dir) {
1731
1736
  };
1732
1737
  }
1733
1738
  }
1739
+ function clamp$1(value, min, max) {
1740
+ return Math.max(min, Math.min(max, value));
1741
+ }
1742
+ function dist(a, b) {
1743
+ return Math.hypot(a.x - b.x, a.y - b.y);
1744
+ }
1745
+ function closestPointOnRectSide(bounds, side, pointer) {
1746
+ const { x, y, width, height } = bounds;
1747
+ switch (side) {
1748
+ case "top": return {
1749
+ x: clamp$1(pointer.x, x, x + width),
1750
+ y
1751
+ };
1752
+ case "bottom": return {
1753
+ x: clamp$1(pointer.x, x, x + width),
1754
+ y: y + height
1755
+ };
1756
+ case "left": return {
1757
+ x,
1758
+ y: clamp$1(pointer.y, y, y + height)
1759
+ };
1760
+ case "right": return {
1761
+ x: x + width,
1762
+ y: clamp$1(pointer.y, y, y + height)
1763
+ };
1764
+ }
1765
+ }
1766
+ function closestPointOnRectOutline(bounds, pointer) {
1767
+ const sides = [
1768
+ "top",
1769
+ "right",
1770
+ "bottom",
1771
+ "left"
1772
+ ];
1773
+ let side = sides[0];
1774
+ let point = closestPointOnRectSide(bounds, side, pointer);
1775
+ let best = dist(pointer, point);
1776
+ for (let i = 1; i < sides.length; i++) {
1777
+ const nextSide = sides[i];
1778
+ const nextPoint = closestPointOnRectSide(bounds, nextSide, pointer);
1779
+ const nextDist = dist(pointer, nextPoint);
1780
+ if (nextDist < best) {
1781
+ side = nextSide;
1782
+ point = nextPoint;
1783
+ best = nextDist;
1784
+ }
1785
+ }
1786
+ return {
1787
+ side,
1788
+ point
1789
+ };
1790
+ }
1791
+ function getOutlineConnectHandle(bounds, pointer, offset, prevSide, hysteresis = 8) {
1792
+ const closest = closestPointOnRectOutline(bounds, pointer);
1793
+ let side = closest.side;
1794
+ let attach = closest.point;
1795
+ if (prevSide && prevSide !== closest.side) {
1796
+ const stay = closestPointOnRectSide(bounds, prevSide, pointer);
1797
+ if (dist(pointer, stay) <= dist(pointer, closest.point) + hysteresis) {
1798
+ side = prevSide;
1799
+ attach = stay;
1800
+ }
1801
+ }
1802
+ if (offset === 0) return {
1803
+ side,
1804
+ attach,
1805
+ handle: attach
1806
+ };
1807
+ const delta = {
1808
+ top: {
1809
+ x: 0,
1810
+ y: -offset
1811
+ },
1812
+ right: {
1813
+ x: offset,
1814
+ y: 0
1815
+ },
1816
+ bottom: {
1817
+ x: 0,
1818
+ y: offset
1819
+ },
1820
+ left: {
1821
+ x: -offset,
1822
+ y: 0
1823
+ }
1824
+ }[side];
1825
+ return {
1826
+ side,
1827
+ attach,
1828
+ handle: {
1829
+ x: attach.x + delta.x,
1830
+ y: attach.y + delta.y
1831
+ }
1832
+ };
1833
+ }
1734
1834
  //#endregion
1735
1835
  //#region src/core/ConnectionManager.ts
1736
1836
  /**
@@ -1747,6 +1847,9 @@ var ConnectionManager = class extends EventEmitter {
1747
1847
  this.sourceAnchorId = null;
1748
1848
  this.hoverNodeId = null;
1749
1849
  this.hoverAnchorId = null;
1850
+ this.hoverPoint = null;
1851
+ this.hoverOutlineHandle = false;
1852
+ this.hoverOutlineSide = null;
1750
1853
  this.hoverDisabled = false;
1751
1854
  this.reconnectPoint = null;
1752
1855
  this.previewTargetAnchorId = null;
@@ -1808,9 +1911,12 @@ var ConnectionManager = class extends EventEmitter {
1808
1911
  */
1809
1912
  clearPointerHover() {
1810
1913
  if (this.hoverDisabled) return;
1811
- if (this.hoverNodeId !== null || this.hoverAnchorId !== null) {
1914
+ if (this.hoverNodeId !== null || this.hoverAnchorId !== null || this.hoverOutlineHandle) {
1812
1915
  this.hoverNodeId = null;
1813
1916
  this.hoverAnchorId = null;
1917
+ this.hoverPoint = null;
1918
+ this.hoverOutlineSide = null;
1919
+ this.clearOutlineHandleCursor();
1814
1920
  this.renderer.markDirty();
1815
1921
  }
1816
1922
  }
@@ -1837,9 +1943,12 @@ var ConnectionManager = class extends EventEmitter {
1837
1943
  */
1838
1944
  disableHover() {
1839
1945
  this.hoverDisabled = true;
1840
- if (this.hoverNodeId !== null || this.hoverAnchorId !== null) {
1946
+ if (this.hoverNodeId !== null || this.hoverAnchorId !== null || this.hoverOutlineHandle) {
1841
1947
  this.hoverNodeId = null;
1842
1948
  this.hoverAnchorId = null;
1949
+ this.hoverPoint = null;
1950
+ this.hoverOutlineSide = null;
1951
+ this.clearOutlineHandleCursor();
1843
1952
  this.renderer.markDirty();
1844
1953
  }
1845
1954
  }
@@ -1851,7 +1960,7 @@ var ConnectionManager = class extends EventEmitter {
1851
1960
  }
1852
1961
  /**
1853
1962
  * Try to start connection from a hovered anchor point.
1854
- * When attachToOutline + Shift: start from anywhere on node outline.
1963
+ * When attachToOutline: drag the outline handle, or Shift+drag from the node body.
1855
1964
  * Otherwise: requires clicking on an anchor/port so that node drag still works.
1856
1965
  */
1857
1966
  tryStartConnectionAtPoint(event) {
@@ -1860,18 +1969,18 @@ var ConnectionManager = class extends EventEmitter {
1860
1969
  x: event.worldX,
1861
1970
  y: event.worldY
1862
1971
  };
1972
+ if (this.attachToOutline) {
1973
+ const handleHit = this.findOutlineConnectHandleAt(point);
1974
+ if (handleHit) {
1975
+ this.startOutlineConnection(handleHit.node, handleHit.attach);
1976
+ return true;
1977
+ }
1978
+ }
1863
1979
  const node = this.getNodeAtPoint(point, false);
1864
1980
  if (!node) return false;
1865
1981
  if (this.attachToOutline && event.shiftKey) {
1866
- const { point: outlinePoint, param } = node.getClosestPointOnOutline(point);
1867
- this.sourceNode = node;
1868
- this.isConnecting = true;
1869
- this.sourceAnchorId = null;
1870
- this.sourcePoint = outlinePoint;
1871
- this.sourceOutlineParam = param;
1872
- this.previewEndpoint = point;
1873
- this.emit("connectionStart", node);
1874
- this.renderer.markDirty();
1982
+ const { point: outlinePoint } = node.getClosestPointOnOutline(point);
1983
+ this.startOutlineConnection(node, outlinePoint);
1875
1984
  return true;
1876
1985
  }
1877
1986
  const hover = this.getAnchorAtPoint(node, point);
@@ -1963,14 +2072,14 @@ var ConnectionManager = class extends EventEmitter {
1963
2072
  snappedPoint = bestResult.point;
1964
2073
  this.reconnectingOutlineParam = bestResult.param;
1965
2074
  this.reconnectingTargetNodeId = bestResult.node.id;
1966
- snappedDir = getDirectionFromOutlineParam(bestResult.param, bestResult.node.getBounds());
2075
+ snappedDir = bestResult.node.getOutlineDirection(bestResult.param);
1967
2076
  if (this.reconnectingEndpoint === "start" ? toNode : fromNode) {
1968
2077
  const alignRef = edge.isEditablePolyline() ? this.getNearestBendPointForAxisAlignment(edge, this.reconnectingEndpoint) : this.reconnectingEndpoint === "start" ? this.getTargetPointForReconnect(edge, toNode, "to", snappedPoint) : this.getTargetPointForReconnect(edge, fromNode, "from", snappedPoint);
1969
2078
  snappedPoint = this.applyAxisAlignmentToPoint(snappedPoint, alignRef);
1970
2079
  const reprojected = targetNode.getClosestPointOnOutline(snappedPoint);
1971
2080
  snappedPoint = reprojected.point;
1972
2081
  this.reconnectingOutlineParam = reprojected.param;
1973
- snappedDir = getDirectionFromOutlineParam(reprojected.param, targetNode.getBounds());
2082
+ snappedDir = targetNode.getOutlineDirection(reprojected.param);
1974
2083
  }
1975
2084
  } else {
1976
2085
  this.reconnectingOutlineParam = null;
@@ -2036,7 +2145,7 @@ var ConnectionManager = class extends EventEmitter {
2036
2145
  const ep = endpoint === "from" ? edge.from : edge.to;
2037
2146
  if (this.attachToOutline && ep.outlineParam !== void 0) {
2038
2147
  const node = ep.nodeId ? this.renderer.getNode(ep.nodeId) : void 0;
2039
- return getDirectionFromOutlineParam(ep.outlineParam, node?.getBounds());
2148
+ return node ? node.getOutlineDirection(ep.outlineParam) : getDirectionFromOutlineParam(ep.outlineParam);
2040
2149
  }
2041
2150
  return (ep.portId?.replace(ANCHOR_PORT_PREFIX, ""))?.split(":")[0];
2042
2151
  }
@@ -2353,8 +2462,8 @@ var ConnectionManager = class extends EventEmitter {
2353
2462
  ctx.stroke();
2354
2463
  } else {
2355
2464
  const previewTarget = this.previewTargetNodeId != null ? this.renderer.getNode(this.previewTargetNodeId) : void 0;
2356
- const fromDir = this.sourceOutlineParam !== null ? getDirectionFromOutlineParam(this.sourceOutlineParam, this.sourceNode?.getBounds()) : this.sourceAnchorId?.split(":")[0];
2357
- const toDir = this.previewTargetOutlineParam !== null ? getDirectionFromOutlineParam(this.previewTargetOutlineParam, previewTarget?.getBounds()) : this.previewTargetAnchorId?.split(":")[0];
2465
+ const fromDir = this.sourceOutlineParam !== null ? this.sourceNode ? this.sourceNode.getOutlineDirection(this.sourceOutlineParam) : getDirectionFromOutlineParam(this.sourceOutlineParam) : this.sourceAnchorId?.split(":")[0];
2466
+ const toDir = this.previewTargetOutlineParam !== null ? previewTarget ? previewTarget.getOutlineDirection(this.previewTargetOutlineParam) : getDirectionFromOutlineParam(this.previewTargetOutlineParam) : this.previewTargetAnchorId?.split(":")[0];
2358
2467
  this.drawBezierPreview(ctx, start, end, fromDir, toDir);
2359
2468
  }
2360
2469
  ctx.setLineDash([]);
@@ -2473,7 +2582,10 @@ var ConnectionManager = class extends EventEmitter {
2473
2582
  renderHoverAnchors(ctx) {
2474
2583
  if (this.isConnecting || this.isReconnecting) return;
2475
2584
  this.renderEditablePolylineControls(ctx);
2476
- if (this.attachToOutline) return;
2585
+ if (this.attachToOutline) {
2586
+ this.renderOutlineConnectHandle(ctx);
2587
+ return;
2588
+ }
2477
2589
  if (!this.hoverNodeId) return;
2478
2590
  const node = this.renderer.getNode(this.hoverNodeId);
2479
2591
  if (!node) return;
@@ -2488,7 +2600,7 @@ var ConnectionManager = class extends EventEmitter {
2488
2600
  ctx.beginPath();
2489
2601
  ctx.arc(anchor.point.x, anchor.point.y, radius, 0, Math.PI * 2);
2490
2602
  ctx.fill();
2491
- if (isHovered) this.drawPlus(radius, ctx, anchor);
2603
+ if (isHovered) this.drawPlus(radius, ctx, anchor.point);
2492
2604
  }
2493
2605
  ctx.restore();
2494
2606
  }
@@ -2639,15 +2751,15 @@ var ConnectionManager = class extends EventEmitter {
2639
2751
  y
2640
2752
  };
2641
2753
  }
2642
- drawPlus(radius, ctx, anchor) {
2754
+ drawPlus(radius, ctx, point) {
2643
2755
  const plusSize = radius * .5;
2644
2756
  ctx.strokeStyle = "#ffffff";
2645
2757
  ctx.lineWidth = 1.5;
2646
2758
  ctx.beginPath();
2647
- ctx.moveTo(anchor.point.x - plusSize, anchor.point.y);
2648
- ctx.lineTo(anchor.point.x + plusSize, anchor.point.y);
2649
- ctx.moveTo(anchor.point.x, anchor.point.y - plusSize);
2650
- ctx.lineTo(anchor.point.x, anchor.point.y + plusSize);
2759
+ ctx.moveTo(point.x - plusSize, point.y);
2760
+ ctx.lineTo(point.x + plusSize, point.y);
2761
+ ctx.moveTo(point.x, point.y - plusSize);
2762
+ ctx.lineTo(point.x, point.y + plusSize);
2651
2763
  ctx.stroke();
2652
2764
  }
2653
2765
  renderAnchorHighlights(ctx, point, reconnecting) {
@@ -2668,7 +2780,7 @@ var ConnectionManager = class extends EventEmitter {
2668
2780
  ctx.arc(anchor.point.x, anchor.point.y, radius, 0, Math.PI * 2);
2669
2781
  ctx.fill();
2670
2782
  if (isNearest) if (forbidden) this.drawCross(radius, ctx, anchor);
2671
- else this.drawPlus(radius, ctx, anchor);
2783
+ else this.drawPlus(radius, ctx, anchor.point);
2672
2784
  }
2673
2785
  ctx.restore();
2674
2786
  }
@@ -2693,19 +2805,94 @@ var ConnectionManager = class extends EventEmitter {
2693
2805
  }
2694
2806
  return null;
2695
2807
  }
2808
+ startOutlineConnection(node, attach) {
2809
+ const { point: outlinePoint, param } = node.getClosestPointOnOutline(attach);
2810
+ this.sourceNode = node;
2811
+ this.isConnecting = true;
2812
+ this.sourceAnchorId = null;
2813
+ this.sourcePoint = outlinePoint;
2814
+ this.sourceOutlineParam = param;
2815
+ this.previewEndpoint = attach;
2816
+ this.emit("connectionStart", node);
2817
+ this.renderer.markDirty();
2818
+ }
2819
+ outlineHandleHysteresis() {
2820
+ return 8 / Math.max(this.renderer.zoom, 1e-4);
2821
+ }
2822
+ outlineConnectHandleFor(node, pointer) {
2823
+ const prevSide = node.id === this.hoverNodeId ? this.hoverOutlineSide : null;
2824
+ const geom = getOutlineConnectHandle(node.getBounds(), pointer, 0, prevSide, this.outlineHandleHysteresis());
2825
+ const { point: onOutline } = node.getClosestPointOnOutline(geom.attach);
2826
+ return {
2827
+ attach: onOutline,
2828
+ handle: onOutline,
2829
+ side: geom.side
2830
+ };
2831
+ }
2832
+ outlineHandleHitRadius() {
2833
+ return 10 / Math.max(this.renderer.zoom, 1e-4);
2834
+ }
2835
+ findOutlineConnectHandleAt(point) {
2836
+ if (!this.attachToOutline) return null;
2837
+ const radiusSq = this.outlineHandleHitRadius() ** 2;
2838
+ const nodes = Array.from(this.renderer.nodes.values());
2839
+ for (let i = nodes.length - 1; i >= 0; i--) {
2840
+ const node = nodes[i];
2841
+ if (!node.visible || !this.isCompatibleTarget(node)) continue;
2842
+ const { attach, handle } = this.outlineConnectHandleFor(node, point);
2843
+ const dx = point.x - handle.x;
2844
+ const dy = point.y - handle.y;
2845
+ if (dx * dx + dy * dy <= radiusSq) return {
2846
+ node,
2847
+ attach,
2848
+ handle
2849
+ };
2850
+ }
2851
+ return null;
2852
+ }
2853
+ renderOutlineConnectHandle(ctx) {
2854
+ if (!this.hoverNodeId || !this.hoverPoint) return;
2855
+ const node = this.renderer.getNode(this.hoverNodeId);
2856
+ if (!node) return;
2857
+ const { handle } = this.outlineConnectHandleFor(node, this.hoverPoint);
2858
+ const radius = this.hoverOutlineHandle ? 6 : 4;
2859
+ ctx.save();
2860
+ ctx.setLineDash([]);
2861
+ ctx.fillStyle = "#3b82f6";
2862
+ ctx.beginPath();
2863
+ ctx.arc(handle.x, handle.y, radius, 0, Math.PI * 2);
2864
+ ctx.fill();
2865
+ this.drawPlus(radius, ctx, handle);
2866
+ ctx.restore();
2867
+ }
2868
+ clearOutlineHandleCursor() {
2869
+ if (this.hoverOutlineHandle) {
2870
+ this.hoverOutlineHandle = false;
2871
+ this.setCursor("");
2872
+ }
2873
+ }
2696
2874
  updateHover(point) {
2697
2875
  if (this.hoverDisabled) return;
2698
- const node = this.getNodeAtPoint(point, false);
2876
+ const handleHit = this.findOutlineConnectHandleAt(point);
2877
+ const node = handleHit?.node ?? this.getNodeAtPoint(point, false);
2699
2878
  const prevNodeId = this.hoverNodeId;
2700
2879
  const prevAnchorId = this.hoverAnchorId;
2880
+ const prevOutlineHandle = this.hoverOutlineHandle;
2881
+ this.hoverPoint = node ? point : null;
2701
2882
  if (!node) {
2702
2883
  this.hoverNodeId = null;
2703
2884
  this.hoverAnchorId = null;
2885
+ this.hoverOutlineSide = null;
2886
+ this.clearOutlineHandleCursor();
2704
2887
  } else {
2705
2888
  this.hoverNodeId = node.id;
2706
- this.hoverAnchorId = this.getAnchorAtPoint(node, point)?.id ?? null;
2889
+ this.hoverAnchorId = handleHit ? null : this.getAnchorAtPoint(node, point)?.id ?? null;
2890
+ this.hoverOutlineHandle = handleHit !== null;
2891
+ if (this.attachToOutline) this.hoverOutlineSide = this.outlineConnectHandleFor(node, point).side;
2892
+ if (this.hoverOutlineHandle) this.setCursor("crosshair");
2893
+ else if (prevOutlineHandle) this.setCursor("");
2707
2894
  }
2708
- if (prevNodeId !== this.hoverNodeId || prevAnchorId !== this.hoverAnchorId) this.renderer.markDirty();
2895
+ if (prevNodeId !== this.hoverNodeId || prevAnchorId !== this.hoverAnchorId || prevOutlineHandle !== this.hoverOutlineHandle || this.attachToOutline && node !== null) this.renderer.markDirty();
2709
2896
  }
2710
2897
  getAnchorAtPoint(node, point) {
2711
2898
  const anchorIds = !this.attachToOutline && node.ports.length > 0 ? node.getPortAnchorIds() : null;
@@ -8558,7 +8745,7 @@ var EdgeEndpointUpdater = class {
8558
8745
  const fromPort = this.portSide(endpoint.portId);
8559
8746
  if (fromPort) return fromPort;
8560
8747
  if (endpoint.outlineParam === void 0) return void 0;
8561
- return getDirectionFromOutlineParam(endpoint.outlineParam, node.getBounds());
8748
+ return node.getOutlineDirection(endpoint.outlineParam);
8562
8749
  }
8563
8750
  nearestAnchorOnSide(node, side, toward) {
8564
8751
  const anchors = node.getAnchors().filter((a) => a.id.startsWith(`${side}:`));
@@ -8600,13 +8787,10 @@ var EdgeEndpointUpdater = class {
8600
8787
  direction: anchorId.split(":")[0]
8601
8788
  };
8602
8789
  }
8603
- if (isNodeEdgeEndpoint(endpoint) && endpoint.outlineParam !== void 0) {
8604
- const bounds = node.getBounds();
8605
- return {
8606
- point: node.getConnectionPointAtOutlineParam(endpoint.outlineParam),
8607
- direction: getDirectionFromOutlineParam(endpoint.outlineParam, bounds)
8608
- };
8609
- }
8790
+ if (isNodeEdgeEndpoint(endpoint) && endpoint.outlineParam !== void 0) return {
8791
+ point: node.getConnectionPointAtOutlineParam(endpoint.outlineParam),
8792
+ direction: node.getOutlineDirection(endpoint.outlineParam)
8793
+ };
8610
8794
  if (toward) return this.resolveFloatingEndpoint(node, toward);
8611
8795
  return { point: node.getCenter() };
8612
8796
  }
@@ -11076,6 +11260,21 @@ var Node = class extends Element {
11076
11260
  * Get point on outline at normalized param (0-1 along perimeter).
11077
11261
  * Base implementation uses rectangular outline. Override for non-rectangular shapes.
11078
11262
  */
11263
+ /**
11264
+ * Outward cardinal side at an outline param. Rectangles use AABB perimeter
11265
+ * fractions; non-rectangular shapes override from the real outline point.
11266
+ */
11267
+ getOutlineDirection(param) {
11268
+ return getDirectionFromOutlineParam(param, this.getBounds());
11269
+ }
11270
+ /**
11271
+ * Outward side from node center toward a point on the outline.
11272
+ */
11273
+ outlineDirectionFromCenter(param) {
11274
+ const point = this.getConnectionPointAtOutlineParam(param);
11275
+ const center = this.getCenter();
11276
+ return directionFromDelta(point.x - center.x, point.y - center.y);
11277
+ }
11079
11278
  getConnectionPointAtOutlineParam(param) {
11080
11279
  const { x, y, width: w, height: h } = this.getBounds();
11081
11280
  const perimeter = 2 * (w + h);
@@ -11599,6 +11798,9 @@ var CircleNode = class extends Node {
11599
11798
  const dy = point.y - center.y;
11600
11799
  return dx * dx / (rx * rx) + dy * dy / (ry * ry) <= 1;
11601
11800
  }
11801
+ getOutlineDirection(param) {
11802
+ return this.outlineDirectionFromCenter(param);
11803
+ }
11602
11804
  getConnectionPointAtOutlineParam(param) {
11603
11805
  const center = this.getCenter();
11604
11806
  const rx = this._width / 2;
@@ -11685,6 +11887,9 @@ var DiamondNode = class extends Node {
11685
11887
  const dy = Math.abs(point.y - center.y);
11686
11888
  return dx / hw + dy / hh <= 1;
11687
11889
  }
11890
+ getOutlineDirection(param) {
11891
+ return this.outlineDirectionFromCenter(param);
11892
+ }
11688
11893
  getConnectionPointAtOutlineParam(param) {
11689
11894
  const center = this.getCenter();
11690
11895
  const hw = this._width / 2;
@@ -11958,6 +12163,10 @@ var CustomShapeNode = class extends Node {
11958
12163
  y: p.y + this._y
11959
12164
  };
11960
12165
  }
12166
+ getOutlineDirection(param) {
12167
+ if (!this.getOutlineSample()) return super.getOutlineDirection(param);
12168
+ return this.outlineDirectionFromCenter(param);
12169
+ }
11961
12170
  getConnectionPointAtOutlineParam(param) {
11962
12171
  const sample = this.getOutlineSample();
11963
12172
  if (!sample) return super.getConnectionPointAtOutlineParam(param);