orcasvn-react-diagrams 0.2.0 → 0.2.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.
Files changed (133) hide show
  1. package/README.md +22 -1
  2. package/ai/api-contract.json +57 -5
  3. package/ai/invariants.json +5 -3
  4. package/ai/manifest.json +1 -1
  5. package/dist/cjs/examples.js +11775 -0
  6. package/dist/cjs/index.js +3889 -1112
  7. package/dist/cjs/types/api/createDiagramEditor.d.ts +7 -2
  8. package/dist/cjs/types/api/types.d.ts +178 -0
  9. package/dist/cjs/types/displaybox/demos/DeletionEventsDemoTab.d.ts +3 -0
  10. package/dist/cjs/types/displaybox/demos/ShapeHoverControlsDemoTab.d.ts +3 -0
  11. package/dist/cjs/types/displaybox/demos/TextLayoutDemoTab.d.ts +3 -0
  12. package/dist/cjs/types/displaybox/demos/deletionEventsDemo.d.ts +2 -0
  13. package/dist/cjs/types/displaybox/demos/rotatedCreationDemo.d.ts +2 -0
  14. package/dist/cjs/types/displaybox/demos/roundedRectRadiusDemo.d.ts +2 -0
  15. package/dist/cjs/types/displaybox/demos/shapeBorderMovementDemo.d.ts +2 -0
  16. package/dist/cjs/types/displaybox/demos/shapeHoverControlsDemo.d.ts +10 -0
  17. package/dist/cjs/types/displaybox/demos/textDemo.d.ts +4 -0
  18. package/dist/cjs/types/displaybox/useDemoEditor.d.ts +5 -2
  19. package/dist/cjs/types/engine/AutoLayoutService.d.ts +24 -0
  20. package/dist/cjs/types/engine/DiagramEngine.d.ts +32 -14
  21. package/dist/cjs/types/engine/EngineCommands.d.ts +4 -1
  22. package/dist/cjs/types/engine/LinkRoutingService.d.ts +35 -0
  23. package/dist/cjs/types/engine/MutationPipeline.d.ts +23 -0
  24. package/dist/cjs/types/engine/TextLayoutService.d.ts +40 -0
  25. package/dist/cjs/types/examples/index.d.ts +2 -0
  26. package/dist/cjs/types/measure/textStyleDefaults.d.ts +9 -0
  27. package/dist/cjs/types/models/DiagramModel.d.ts +1 -0
  28. package/dist/cjs/types/models/ElementModel.d.ts +1 -0
  29. package/dist/cjs/types/models/PortModel.d.ts +3 -0
  30. package/dist/cjs/types/models/TextModel.d.ts +8 -0
  31. package/dist/cjs/types/renderer/RenderTypes.d.ts +34 -1
  32. package/dist/cjs/types/renderer/konva/KonvaHitTester.d.ts +1 -1
  33. package/dist/cjs/types/renderer/konva/KonvaInteraction.d.ts +53 -3
  34. package/dist/cjs/types/renderer/konva/KonvaNodeFactory.d.ts +18 -1
  35. package/dist/cjs/types/renderer/konva/KonvaRenderer.d.ts +49 -2
  36. package/dist/cjs/types/shapes/BuiltInShapes.d.ts +107 -0
  37. package/dist/cjs/types/shapes/__tests__/BuiltInShapes.test.d.ts +1 -0
  38. package/dist/cjs/types/shapes/index.d.ts +1 -0
  39. package/dist/cjs/types/utils/__tests__/borderGeometry.test.d.ts +1 -0
  40. package/dist/cjs/types/utils/borderGeometry.d.ts +6 -0
  41. package/dist/cjs/types/utils/geometry.d.ts +22 -0
  42. package/dist/esm/examples.js +11767 -0
  43. package/dist/esm/examples.js.map +1 -0
  44. package/dist/esm/index.js +3890 -1113
  45. package/dist/esm/index.js.map +1 -1
  46. package/dist/esm/types/api/createDiagramEditor.d.ts +7 -2
  47. package/dist/esm/types/api/types.d.ts +178 -0
  48. package/dist/esm/types/displaybox/demos/DeletionEventsDemoTab.d.ts +3 -0
  49. package/dist/esm/types/displaybox/demos/ShapeHoverControlsDemoTab.d.ts +3 -0
  50. package/dist/esm/types/displaybox/demos/TextLayoutDemoTab.d.ts +3 -0
  51. package/dist/esm/types/displaybox/demos/deletionEventsDemo.d.ts +2 -0
  52. package/dist/esm/types/displaybox/demos/rotatedCreationDemo.d.ts +2 -0
  53. package/dist/esm/types/displaybox/demos/roundedRectRadiusDemo.d.ts +2 -0
  54. package/dist/esm/types/displaybox/demos/shapeBorderMovementDemo.d.ts +2 -0
  55. package/dist/esm/types/displaybox/demos/shapeHoverControlsDemo.d.ts +10 -0
  56. package/dist/esm/types/displaybox/demos/textDemo.d.ts +4 -0
  57. package/dist/esm/types/displaybox/useDemoEditor.d.ts +5 -2
  58. package/dist/esm/types/engine/AutoLayoutService.d.ts +24 -0
  59. package/dist/esm/types/engine/DiagramEngine.d.ts +32 -14
  60. package/dist/esm/types/engine/EngineCommands.d.ts +4 -1
  61. package/dist/esm/types/engine/LinkRoutingService.d.ts +35 -0
  62. package/dist/esm/types/engine/MutationPipeline.d.ts +23 -0
  63. package/dist/esm/types/engine/TextLayoutService.d.ts +40 -0
  64. package/dist/esm/types/examples/index.d.ts +2 -0
  65. package/dist/esm/types/measure/textStyleDefaults.d.ts +9 -0
  66. package/dist/esm/types/models/DiagramModel.d.ts +1 -0
  67. package/dist/esm/types/models/ElementModel.d.ts +1 -0
  68. package/dist/esm/types/models/PortModel.d.ts +3 -0
  69. package/dist/esm/types/models/TextModel.d.ts +8 -0
  70. package/dist/esm/types/renderer/RenderTypes.d.ts +34 -1
  71. package/dist/esm/types/renderer/konva/KonvaHitTester.d.ts +1 -1
  72. package/dist/esm/types/renderer/konva/KonvaInteraction.d.ts +53 -3
  73. package/dist/esm/types/renderer/konva/KonvaNodeFactory.d.ts +18 -1
  74. package/dist/esm/types/renderer/konva/KonvaRenderer.d.ts +49 -2
  75. package/dist/esm/types/shapes/BuiltInShapes.d.ts +107 -0
  76. package/dist/esm/types/shapes/__tests__/BuiltInShapes.test.d.ts +1 -0
  77. package/dist/esm/types/shapes/index.d.ts +1 -0
  78. package/dist/esm/types/utils/__tests__/borderGeometry.test.d.ts +1 -0
  79. package/dist/esm/types/utils/borderGeometry.d.ts +6 -0
  80. package/dist/esm/types/utils/geometry.d.ts +22 -0
  81. package/dist/examples.d.ts +532 -0
  82. package/dist/index.d.ts +233 -2
  83. package/docs/API_CONTRACT.md +59 -3
  84. package/docs/ARCHITECTURE.md +1 -0
  85. package/docs/CAPABILITIES.md +3 -1
  86. package/docs/COMMANDS_EVENTS.md +5 -0
  87. package/docs/DOCUMENTATION_WORKFLOW.md +6 -8
  88. package/docs/INTEGRATION_PLAYBOOK.md +2 -0
  89. package/docs/PORTING_CHECKLIST.md +1 -0
  90. package/docs/STATE_INVARIANTS.md +4 -0
  91. package/package.json +20 -10
  92. package/src/displaybox/demos/AutoLayoutDemoTab.tsx +501 -0
  93. package/src/displaybox/demos/DeletionEventsDemoTab.tsx +147 -0
  94. package/src/displaybox/demos/EngineEventsDemoTab.tsx +151 -0
  95. package/src/displaybox/demos/EventHandlersDemoTab.tsx +110 -0
  96. package/src/displaybox/demos/ExternalDragDropDemoTab.tsx +261 -0
  97. package/src/displaybox/demos/LinkCancelDemoTab.tsx +238 -0
  98. package/src/displaybox/demos/ObstacleRoutingDemoTab.tsx +30 -0
  99. package/src/displaybox/demos/ShapeHoverControlsDemoTab.tsx +558 -0
  100. package/src/displaybox/demos/SimpleDemo.tsx +73 -0
  101. package/src/displaybox/demos/SvgPathDemoTab.tsx +327 -0
  102. package/src/displaybox/demos/TextLayoutDemoTab.tsx +386 -0
  103. package/src/displaybox/demos/autoLayoutDemo.ts +111 -0
  104. package/src/displaybox/demos/basicDemo.ts +131 -0
  105. package/src/displaybox/demos/childConstraintsDemo.ts +65 -0
  106. package/src/displaybox/demos/customDemo.ts +59 -0
  107. package/src/displaybox/demos/deletionEventsDemo.ts +91 -0
  108. package/src/displaybox/demos/engineEventsDemo.ts +64 -0
  109. package/src/displaybox/demos/eventHandlersDemo.ts +41 -0
  110. package/src/displaybox/demos/externalDragDropDemo.ts +28 -0
  111. package/src/displaybox/demos/gridOverlayDemo.ts +50 -0
  112. package/src/displaybox/demos/index.tsx +217 -0
  113. package/src/displaybox/demos/linkBendHandlesDemo.ts +143 -0
  114. package/src/displaybox/demos/linkCancelDemo.ts +56 -0
  115. package/src/displaybox/demos/linkPortCreationDemo.ts +46 -0
  116. package/src/displaybox/demos/multiLevelTreeDemo.ts +120 -0
  117. package/src/displaybox/demos/multipleElementsDemo.ts +62 -0
  118. package/src/displaybox/demos/nestedDemo.ts +78 -0
  119. package/src/displaybox/demos/obstacleRoutingDemo.ts +176 -0
  120. package/src/displaybox/demos/portBorderDemo.ts +98 -0
  121. package/src/displaybox/demos/portConstraintsDemo.ts +175 -0
  122. package/src/displaybox/demos/rotatedCreationDemo.ts +185 -0
  123. package/src/displaybox/demos/roundedRectRadiusDemo.ts +93 -0
  124. package/src/displaybox/demos/routingDemo.ts +57 -0
  125. package/src/displaybox/demos/selectionDemo.ts +49 -0
  126. package/src/displaybox/demos/shapeBorderMovementDemo.ts +126 -0
  127. package/src/displaybox/demos/shapeGalleryDemo.ts +73 -0
  128. package/src/displaybox/demos/shapeHoverControlsDemo.ts +172 -0
  129. package/src/displaybox/demos/shared.ts +161 -0
  130. package/src/displaybox/demos/svgPathDemo.ts +71 -0
  131. package/src/displaybox/demos/textDemo.ts +62 -0
  132. package/src/displaybox/types.ts +66 -0
  133. package/src/examples/index.ts +21 -0
@@ -1,6 +1,29 @@
1
- import { ElementData, PortData, ShapeDrawContext } from '../api/types';
1
+ import { ElementData, Point, PortAnchor, PortData, Rect, ResolvePortAnchorsOptions, ShapeEllipseMidPointTarget, ShapeDrawContext, ShapeHoverGeometry } from '../api/types';
2
+ import { BorderSide } from '../utils/borderGeometry';
3
+ export type ShapeNodeSizeUpdateContext = {
4
+ size: {
5
+ width: number;
6
+ height: number;
7
+ };
8
+ anchorCenter: boolean;
9
+ updateOffsetX: boolean;
10
+ updateOffsetY: boolean;
11
+ getNodeAttr: <T = unknown>(key: string) => T | undefined;
12
+ };
13
+ export type ShapeNodeSizeUpdater = (context: ShapeNodeSizeUpdateContext) => Record<string, unknown>;
14
+ export type ShapeResizeHandle = 'nw' | 'ne' | 'sw' | 'se';
15
+ export type ShapeResizeNormalizeContext = {
16
+ element: ElementData;
17
+ handle: ShapeResizeHandle;
18
+ minSize: number;
19
+ proposal: {
20
+ width: number;
21
+ height: number;
22
+ };
23
+ };
2
24
  export type ShapeDefinition = {
3
25
  id: string;
26
+ baseRotation?: number;
4
27
  draw?: (context: ShapeDrawContext) => void;
5
28
  createNode?: (model: ElementData | PortData) => unknown;
6
29
  svgPath?: string;
@@ -8,6 +31,16 @@ export type ShapeDefinition = {
8
31
  width: number;
9
32
  height: number;
10
33
  };
34
+ sizeUpdater?: ShapeNodeSizeUpdater;
35
+ normalizeResize?: (context: ShapeResizeNormalizeContext) => {
36
+ width: number;
37
+ height: number;
38
+ };
39
+ projectToBorder?: (point: Point, rect: Rect) => Point;
40
+ resolveBorderSide?: (point: Point, rect: Rect) => BorderSide;
41
+ resolvePortAnchors?: (rect: Rect, options: ResolvePortAnchorsOptions) => PortAnchor[];
42
+ resolveHoverGeometry?: (rect: Rect) => ShapeHoverGeometry | undefined;
43
+ resolveEllipseMidPoints?: (rect: Rect) => ShapeEllipseMidPointTarget[] | undefined;
11
44
  };
12
45
  export declare class ShapeRegistry {
13
46
  private shapes;
@@ -1,7 +1,7 @@
1
1
  import { Point } from '../../api/types';
2
2
  export type HitResult = {
3
3
  id: string;
4
- type: 'element' | 'port' | 'link' | 'text' | 'resize-handle' | 'link-handle' | 'none';
4
+ type: 'element' | 'port' | 'link' | 'text' | 'resize-handle' | 'link-handle' | 'shape-hover-control' | 'none';
5
5
  depth?: number;
6
6
  };
7
7
  export type HitTestResolver = (point: Point) => HitResult | null;
@@ -1,22 +1,38 @@
1
- import { Point, PortData } from '../../api/types';
1
+ import { ElementShapeHoverControlActivationEvent, ElementShapeHoverControlInteractionEvent, ElementShapeHoverControls, Point, PortData } from '../../api/types';
2
2
  import DiagramEngine from '../../engine/DiagramEngine';
3
3
  import KonvaHitTester from './KonvaHitTester';
4
- import { KonvaStageLike } from './KonvaRenderer';
4
+ import { KonvaStageLike, ShapeHoverControlRenderConfig } from './KonvaRenderer';
5
+ import { ShapeRegistry } from '../RenderTypes';
5
6
  export type InteractionConfig = {
6
7
  stage?: KonvaStageLike;
7
8
  hitTester?: KonvaHitTester;
8
9
  panKey?: PanKey;
10
+ shapeRegistry?: ShapeRegistry;
11
+ shapeHoverControls?: ElementShapeHoverControls;
12
+ onShapeHoverControlInteracted?: (event: ElementShapeHoverControlInteractionEvent) => void;
13
+ onShapeHoverControlActivated?: (event: ElementShapeHoverControlActivationEvent) => void;
9
14
  renderer?: {
10
15
  renderResizeHandles: (elementId: string, position: Point, size: {
11
16
  width: number;
12
17
  height: number;
18
+ }, options?: {
19
+ rotation?: number;
20
+ anchorCenter?: boolean;
13
21
  }) => void;
14
22
  clearResizeHandles: () => void;
15
23
  renderLinkHandles: (linkId: string, points: Point[]) => void;
16
24
  clearLinkHandles: () => void;
17
25
  renderTempLink: (points: Point[]) => void;
18
26
  clearTempLink: () => void;
19
- renderPortPlaceholder?: (port: PortData) => void;
27
+ renderPortPlaceholder?: (port: PortData, hostElement?: {
28
+ id: string;
29
+ position: Point;
30
+ size: {
31
+ width: number;
32
+ height: number;
33
+ };
34
+ shapeId: string;
35
+ }) => void;
20
36
  clearPortPlaceholder?: () => void;
21
37
  renderMarquee: (rect: {
22
38
  x: number;
@@ -25,6 +41,8 @@ export type InteractionConfig = {
25
41
  height: number;
26
42
  }) => void;
27
43
  clearMarquee: () => void;
44
+ renderShapeHoverControl?: (config: ShapeHoverControlRenderConfig) => void;
45
+ clearShapeHoverControl?: () => void;
28
46
  };
29
47
  };
30
48
  export type PanKey = 'Control' | 'Shift' | 'Alt' | 'Meta';
@@ -33,6 +51,10 @@ export default class KonvaInteraction {
33
51
  private stage?;
34
52
  private hitTester;
35
53
  private renderer?;
54
+ private shapeRegistry?;
55
+ private shapeHoverControls?;
56
+ private onShapeHoverControlInteracted?;
57
+ private onShapeHoverControlActivated?;
36
58
  private linkDragContext;
37
59
  private bound;
38
60
  private handlers;
@@ -41,6 +63,8 @@ export default class KonvaInteraction {
41
63
  private dragState;
42
64
  private selectionUnsub;
43
65
  private changeUnsub;
66
+ private activeShapeHoverControl;
67
+ private lastPointerPosition;
44
68
  private zoom;
45
69
  private pan;
46
70
  private textEditor;
@@ -48,6 +72,7 @@ export default class KonvaInteraction {
48
72
  private readonly panSpeed;
49
73
  private panKey;
50
74
  constructor(engine: DiagramEngine, config?: InteractionConfig);
75
+ setShapeHoverControls(controls?: ElementShapeHoverControls): void;
51
76
  private buildPointerInfo;
52
77
  bind(stage?: KonvaStageLike): void;
53
78
  dispose(): void;
@@ -56,14 +81,38 @@ export default class KonvaInteraction {
56
81
  private getStageContainer;
57
82
  private normalizeHit;
58
83
  private resolveHit;
84
+ private withElementDepth;
59
85
  private findElementHit;
60
86
  private computeElementDepth;
61
87
  private findLinkHit;
62
88
  private setCursor;
63
89
  private updateHoverCursor;
90
+ private normalizeShapeHoverControls;
91
+ private normalizeShapeHoverControlDefinition;
92
+ private normalizeVisibilityTriggers;
93
+ private normalizeTargetIndices;
94
+ private normalizeEllipseMidPoints;
95
+ private getDefaultShapeHoverControlTolerance;
96
+ private resolveShapeHoverControlFromHit;
97
+ private parseShapeHoverControlHitId;
98
+ private emitShapeHoverControlInteraction;
99
+ private emitLegacyShapeHoverControlActivation;
100
+ private updateShapeHoverControl;
101
+ private resolveShapeHoverControl;
102
+ private resolveTargetHoverCandidate;
103
+ private resolveElementHoverCandidate;
104
+ private resolveEligibleTargetIndices;
105
+ private resolveEligibleEllipseMidPoints;
106
+ private resolveRotatedHoverGeometry;
107
+ private resolveRotatedEllipseMidPoints;
108
+ private isSameShapeHoverTarget;
109
+ private isSamePoint;
110
+ private toShapeHoverRenderConfig;
111
+ private clearActiveShapeHoverControl;
64
112
  private startTextEdit;
65
113
  private disposeTextEditor;
66
114
  private updateSelectionOverlays;
115
+ private renderElementResizeHandles;
67
116
  private handleResizeDrag;
68
117
  private parseResizeHandle;
69
118
  private parseLinkHandle;
@@ -73,6 +122,7 @@ export default class KonvaInteraction {
73
122
  private projectPointOnSegment;
74
123
  private applyMarqueeSelection;
75
124
  private applyPortConstraints;
125
+ private tryCreateLinkToPort;
76
126
  private createPortForLink;
77
127
  private createPlaceholderPort;
78
128
  private getElementById;
@@ -1,4 +1,4 @@
1
- import { ElementData, LinkData, PortData, TextData } from '../../api/types';
1
+ import { ElementData, LinkData, Point, PortData, TextData } from '../../api/types';
2
2
  import { ShapeRegistry } from '../RenderTypes';
3
3
  export type KonvaNodeLike = {
4
4
  id?: () => string;
@@ -61,6 +61,23 @@ export default class KonvaNodeFactory {
61
61
  width: number;
62
62
  height: number;
63
63
  }): KonvaNodeLike;
64
+ createHoverControlEdgeLineNode(config: {
65
+ id: string;
66
+ start: Point;
67
+ end: Point;
68
+ style?: Record<string, unknown>;
69
+ }): KonvaNodeLike;
70
+ createHoverControlIconNode(config: {
71
+ id: string;
72
+ position: Point;
73
+ svgPath: string;
74
+ size?: {
75
+ width: number;
76
+ height: number;
77
+ };
78
+ style?: Record<string, unknown>;
79
+ }): KonvaNodeLike;
64
80
  private createDrawNode;
65
81
  private createSvgPathNode;
82
+ private applyShapeBehaviorAttrs;
66
83
  }
@@ -1,4 +1,4 @@
1
- import { OverlayShapeConfig, OverlayShapeHandle, Point, PortData } from '../../api/types';
1
+ import { EllipseMidPoint, OverlayShapeConfig, OverlayShapeHandle, Point, PortData } from '../../api/types';
2
2
  import DiagramModel from '../../models/DiagramModel';
3
3
  import { ShapeRegistry } from '../RenderTypes';
4
4
  import { Renderer } from '../Renderer';
@@ -23,10 +23,40 @@ export type KonvaRendererConfig = {
23
23
  };
24
24
  shapeRegistry?: ShapeRegistry;
25
25
  };
26
+ export type ShapeHoverControlRenderConfig = {
27
+ controlId: string;
28
+ targetKind: 'edge' | 'vertex' | 'midpoint' | 'ellipse-midpoint';
29
+ targetIndex: number;
30
+ targetRef?: string;
31
+ elementId: string;
32
+ targetId: string;
33
+ icon: {
34
+ svgPath: string;
35
+ size?: {
36
+ width: number;
37
+ height: number;
38
+ };
39
+ style?: Record<string, unknown>;
40
+ };
41
+ edge?: {
42
+ start: Point;
43
+ end: Point;
44
+ midpoint: Point;
45
+ lineStyle?: Record<string, unknown>;
46
+ };
47
+ vertex?: {
48
+ position: Point;
49
+ };
50
+ ellipseMidPoint?: {
51
+ id: EllipseMidPoint;
52
+ position: Point;
53
+ };
54
+ };
26
55
  export default class KonvaRenderer implements Renderer {
27
56
  private stage;
28
57
  private layers;
29
58
  private nodeFactory;
59
+ private shapeRegistry;
30
60
  private elementNodes;
31
61
  private portNodes;
32
62
  private linkNodes;
@@ -39,6 +69,7 @@ export default class KonvaRenderer implements Renderer {
39
69
  private marqueeNode;
40
70
  private resizeHandleNodes;
41
71
  private linkHandleNodes;
72
+ private shapeHoverControlNodes;
42
73
  private overlayShapes;
43
74
  private overlayId;
44
75
  constructor(config?: KonvaRendererConfig);
@@ -47,12 +78,23 @@ export default class KonvaRenderer implements Renderer {
47
78
  renderResizeHandles(elementId: string, position: Point, size: {
48
79
  width: number;
49
80
  height: number;
81
+ }, options?: {
82
+ rotation?: number;
83
+ anchorCenter?: boolean;
50
84
  }): void;
51
85
  clearResizeHandles(): void;
52
86
  renderLinkHandles(linkId: string, points: Point[]): void;
53
87
  clearLinkHandles(): void;
54
88
  renderTempLink(points: Point[]): void;
55
- renderPortPlaceholder(port: PortData): void;
89
+ renderPortPlaceholder(port: PortData, hostElement?: {
90
+ id: string;
91
+ position: Point;
92
+ size: {
93
+ width: number;
94
+ height: number;
95
+ };
96
+ shapeId: string;
97
+ }): void;
56
98
  clearPortPlaceholder(): void;
57
99
  clearTempLink(): void;
58
100
  renderMarquee(rect: {
@@ -62,6 +104,8 @@ export default class KonvaRenderer implements Renderer {
62
104
  height: number;
63
105
  }): void;
64
106
  clearMarquee(): void;
107
+ renderShapeHoverControl(config: ShapeHoverControlRenderConfig): void;
108
+ clearShapeHoverControl(draw?: boolean): void;
65
109
  createOverlayShape(config: OverlayShapeConfig): OverlayShapeHandle;
66
110
  destroy(): void;
67
111
  private drawOverlays;
@@ -75,6 +119,9 @@ export default class KonvaRenderer implements Renderer {
75
119
  private syncLinks;
76
120
  private syncTexts;
77
121
  private updatePosition;
122
+ private applyPortOrientation;
123
+ private resolvePortBorderRotation;
124
+ private resolveHostElement;
78
125
  private getNodeAttr;
79
126
  private updateSize;
80
127
  private updateLine;
@@ -0,0 +1,107 @@
1
+ import { Point, PortAnchor, Rect, ResolvePortAnchorsOptions, ShapeEllipseMidPointTarget, ShapeHoverGeometry } from '../api/types';
2
+ import { ShapeNodeSizeUpdater, ShapeResizeNormalizeContext } from '../renderer/RenderTypes';
3
+ import { BorderSide } from '../utils/borderGeometry';
4
+ export type BuiltInShapeKind = 'rect' | 'circle' | 'ellipse' | 'diamond' | 'triangle' | 'pentagon' | 'hexagon';
5
+ export type ShapeNodeModel = {
6
+ id: string;
7
+ position: {
8
+ x: number;
9
+ y: number;
10
+ };
11
+ size?: {
12
+ width?: number;
13
+ height?: number;
14
+ };
15
+ style?: Record<string, unknown>;
16
+ anchorCenter?: boolean;
17
+ };
18
+ export type KonvaShapeLibraryLike = {
19
+ Rect: new (config: Record<string, unknown>) => unknown;
20
+ Circle: new (config: Record<string, unknown>) => unknown;
21
+ Ellipse: new (config: Record<string, unknown>) => unknown;
22
+ Line: new (config: Record<string, unknown>) => unknown;
23
+ };
24
+ export type ShapeCreateContext = {
25
+ Konva: KonvaShapeLibraryLike;
26
+ model: ShapeNodeModel;
27
+ isPort: boolean;
28
+ anchorCenter: boolean;
29
+ };
30
+ type ShapeLibraryConfig = {
31
+ id: string;
32
+ kind: BuiltInShapeKind;
33
+ style?: Record<string, unknown>;
34
+ };
35
+ export declare abstract class BuiltInShape {
36
+ readonly id: string;
37
+ readonly style?: Record<string, unknown>;
38
+ readonly renderStyle?: Record<string, unknown>;
39
+ readonly baseRotation: number;
40
+ abstract readonly sizeUpdater: ShapeNodeSizeUpdater;
41
+ normalizeResize?: (context: ShapeResizeNormalizeContext) => {
42
+ width: number;
43
+ height: number;
44
+ };
45
+ constructor(id: string, style?: Record<string, unknown>, presetBaseRotation?: number);
46
+ abstract createNode(context: ShapeCreateContext): unknown;
47
+ projectToBorder(point: Point, rect: Rect): Point;
48
+ resolveBorderSide(point: Point, rect: Rect): BorderSide;
49
+ resolvePortAnchors(_rect: Rect, _options: ResolvePortAnchorsOptions): PortAnchor[];
50
+ resolveHoverGeometry(_rect: Rect): ShapeHoverGeometry | undefined;
51
+ resolveEllipseMidPoints(_rect: Rect): ShapeEllipseMidPointTarget[] | undefined;
52
+ protected resolveShapeName(isPort: boolean): string;
53
+ }
54
+ export declare class RectangleShape extends BuiltInShape {
55
+ readonly sizeUpdater: ShapeNodeSizeUpdater;
56
+ createNode({ Konva, model, isPort, anchorCenter }: ShapeCreateContext): unknown;
57
+ resolvePortAnchors(rect: Rect, options: ResolvePortAnchorsOptions): PortAnchor[];
58
+ resolveHoverGeometry(rect: Rect): ShapeHoverGeometry;
59
+ }
60
+ export declare class EllipseShape extends BuiltInShape {
61
+ readonly sizeUpdater: ShapeNodeSizeUpdater;
62
+ createNode({ Konva, model, isPort, anchorCenter }: ShapeCreateContext): unknown;
63
+ projectToBorder(point: Point, rect: Rect): Point;
64
+ resolveBorderSide(point: Point, rect: Rect): BorderSide;
65
+ resolvePortAnchors(rect: Rect, options: ResolvePortAnchorsOptions): PortAnchor[];
66
+ resolveEllipseMidPoints(rect: Rect): ShapeEllipseMidPointTarget[];
67
+ }
68
+ export declare class CircleShape extends BuiltInShape {
69
+ readonly sizeUpdater: ShapeNodeSizeUpdater;
70
+ normalizeResize: ({ proposal, minSize }: ShapeResizeNormalizeContext) => {
71
+ width: number;
72
+ height: number;
73
+ };
74
+ createNode({ Konva, model, isPort, anchorCenter }: ShapeCreateContext): unknown;
75
+ projectToBorder(point: Point, rect: Rect): Point;
76
+ resolveBorderSide(point: Point, rect: Rect): BorderSide;
77
+ resolvePortAnchors(rect: Rect, options: ResolvePortAnchorsOptions): PortAnchor[];
78
+ resolveEllipseMidPoints(rect: Rect): ShapeEllipseMidPointTarget[];
79
+ }
80
+ export declare class PolygonShape extends BuiltInShape {
81
+ readonly sizeUpdater: ShapeNodeSizeUpdater;
82
+ readonly edgeCount: number;
83
+ private readonly defaults;
84
+ constructor(id: string, style: Record<string, unknown> | undefined, edgeCount: number, defaults: {
85
+ width: number;
86
+ height: number;
87
+ }, presetBaseRotation?: number);
88
+ createNode({ Konva, model, isPort, anchorCenter }: ShapeCreateContext): unknown;
89
+ projectToBorder(point: Point, rect: Rect): Point;
90
+ resolveBorderSide(point: Point, rect: Rect): BorderSide;
91
+ resolvePortAnchors(rect: Rect, options: ResolvePortAnchorsOptions): PortAnchor[];
92
+ resolveHoverGeometry(rect: Rect): ShapeHoverGeometry;
93
+ }
94
+ export declare class DiamondShape extends PolygonShape {
95
+ constructor(id: string, style?: Record<string, unknown>);
96
+ }
97
+ export declare class TriangleShape extends PolygonShape {
98
+ constructor(id: string, style?: Record<string, unknown>);
99
+ }
100
+ export declare class PentagonShape extends PolygonShape {
101
+ constructor(id: string, style?: Record<string, unknown>);
102
+ }
103
+ export declare class HexagonShape extends PolygonShape {
104
+ constructor(id: string, style?: Record<string, unknown>);
105
+ }
106
+ export declare const createBuiltInShape: (config: ShapeLibraryConfig) => BuiltInShape;
107
+ export {};
@@ -0,0 +1 @@
1
+ export * from './BuiltInShapes';
@@ -0,0 +1,6 @@
1
+ import { Point, Rect } from '../api/types';
2
+ export type BorderSide = 'left' | 'right' | 'top' | 'bottom';
3
+ export type BoundaryKind = 'rect' | 'ellipse' | 'diamond';
4
+ export declare const projectPointToBoundary: (point: Point, rect: Rect, boundary: BoundaryKind) => Point;
5
+ export declare const resolveBoundarySide: (point: Point, rect: Rect, boundary: BoundaryKind) => BorderSide;
6
+ export declare const borderSideToInwardRotation: (side: BorderSide) => number;
@@ -6,4 +6,26 @@ export declare const distance: (a: Point, b: Point) => number;
6
6
  export declare const clamp: (value: number, min: number, max: number) => number;
7
7
  export declare const rectContainsPoint: (rect: Rect, point: Point) => boolean;
8
8
  export declare const rectsIntersect: (a: Rect, b: Rect) => boolean;
9
+ export declare const degreesToRadians: (degrees: number) => number;
10
+ export declare const rotatePoint: (point: Point, center: Point, degrees: number) => Point;
11
+ export declare const resolveRectRotationPivot: (topLeft: Point, size: {
12
+ width: number;
13
+ height: number;
14
+ }, anchorCenter: boolean) => Point;
15
+ export declare const getRotatedRectCorners: (topLeft: Point, size: {
16
+ width: number;
17
+ height: number;
18
+ }, rotation: number, anchorCenter?: boolean) => {
19
+ nw: Point;
20
+ ne: Point;
21
+ sw: Point;
22
+ se: Point;
23
+ };
24
+ export declare const pointInPolygon: (point: Point, polygon: Point[]) => boolean;
25
+ export declare const segmentsIntersect: (a1: Point, a2: Point, b1: Point, b2: Point) => boolean;
26
+ export declare const pointInRotatedRect: (point: Point, topLeft: Point, size: {
27
+ width: number;
28
+ height: number;
29
+ }, rotation: number, anchorCenter?: boolean) => boolean;
30
+ export declare const polygonIntersectsRect: (polygon: Point[], rect: Rect) => boolean;
9
31
  export declare const snapToGrid: (point: Point, gridSize: number) => Point;