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,7 +1,8 @@
1
- import { DiagramEngineHandle, DiagramState, EngineChangeEvent, EngineSelectionEvent } from './types';
1
+ import { DiagramEngineHandle, DiagramState, ElementShapeHoverControlActivationEvent, ElementShapeHoverControlInteractionEvent, ElementShapeHoverControls, EngineChangeEvent, EngineSelectionEvent } from './types';
2
+ import { type BuiltInShapeKind } from '../shapes';
2
3
  export type SimpleShape = {
3
4
  id: string;
4
- kind: 'rect' | 'circle' | 'diamond' | 'triangle';
5
+ kind: BuiltInShapeKind;
5
6
  style?: Record<string, unknown>;
6
7
  };
7
8
  export type DiagramEditorConfig = {
@@ -12,11 +13,15 @@ export type DiagramEditorConfig = {
12
13
  elementShapes?: SimpleShape[];
13
14
  portShapes?: SimpleShape[];
14
15
  panKey?: 'Control' | 'Shift' | 'Alt' | 'Meta';
16
+ elementShapeHoverControls?: ElementShapeHoverControls;
17
+ onElementShapeHoverControlInteraction?: (event: ElementShapeHoverControlInteractionEvent) => void;
18
+ onElementShapeHoverControlActivated?: (event: ElementShapeHoverControlActivationEvent) => void;
15
19
  onChange?: (event: EngineChangeEvent) => void;
16
20
  onSelection?: (event: EngineSelectionEvent) => void;
17
21
  };
18
22
  export type DiagramEditorHandle = DiagramEngineHandle & {
19
23
  resize: (width: number, height: number) => void;
24
+ setElementShapeHoverControls: (controls?: ElementShapeHoverControls) => void;
20
25
  destroy: () => void;
21
26
  };
22
27
  export declare const createDiagramEditor: (config: DiagramEditorConfig) => DiagramEditorHandle;
@@ -20,6 +20,130 @@ export type DiagramContainer = {
20
20
  getBoundingClientRect: () => ClientRectLike;
21
21
  };
22
22
  export type MoveConstraint = 'free' | 'inside' | 'border';
23
+ export type BorderSide = 'left' | 'right' | 'top' | 'bottom';
24
+ export type HostAnchorPreset = 'vertices' | 'cardinal';
25
+ export type PortAnchor = {
26
+ id: string;
27
+ position: Point;
28
+ side?: BorderSide;
29
+ normal?: Point;
30
+ meta?: Record<string, unknown>;
31
+ };
32
+ export type PortAnchorConstraint = {
33
+ preset: HostAnchorPreset;
34
+ fallback?: 'nearest';
35
+ };
36
+ export type ResolvePortAnchorsOptions = {
37
+ preset: HostAnchorPreset;
38
+ };
39
+ export type ShapeVertexTarget = {
40
+ id: string;
41
+ position: Point;
42
+ };
43
+ export type ShapeEdgeTarget = {
44
+ id: string;
45
+ start: Point;
46
+ end: Point;
47
+ midpoint: Point;
48
+ };
49
+ export declare enum EllipseMidPoint {
50
+ top = "top",
51
+ right = "right",
52
+ bottom = "bottom",
53
+ left = "left"
54
+ }
55
+ export type ShapeEllipseMidPointTarget = {
56
+ id: EllipseMidPoint;
57
+ ellipseMidPoint: EllipseMidPoint;
58
+ position: Point;
59
+ };
60
+ export type ShapeHoverGeometry = {
61
+ vertices: ShapeVertexTarget[];
62
+ edges: ShapeEdgeTarget[];
63
+ };
64
+ export type HoverControlIcon = {
65
+ svgPath: string;
66
+ size?: Size;
67
+ style?: Record<string, unknown>;
68
+ };
69
+ export type ShapeControlTargetKind = 'vertex' | 'edge' | 'midpoint' | 'ellipse-midpoint';
70
+ export type ShapeControlVisibilityTrigger = 'element-hover' | 'target-hover';
71
+ export type ShapeControlDefinition = {
72
+ id: string;
73
+ targetKind: ShapeControlTargetKind;
74
+ icon: HoverControlIcon;
75
+ targetIndices?: number[];
76
+ ellipseMidPoints?: EllipseMidPoint | EllipseMidPoint[];
77
+ allowAllTargets?: boolean;
78
+ visibilityTriggers?: ShapeControlVisibilityTrigger[];
79
+ lineStyle?: Record<string, unknown>;
80
+ tolerance?: number;
81
+ };
82
+ /**
83
+ * @deprecated Use ShapeControlDefinition with targetKind='edge'.
84
+ */
85
+ export type EdgeHoverControl = {
86
+ kind: 'edge';
87
+ icon: HoverControlIcon;
88
+ lineStyle?: Record<string, unknown>;
89
+ tolerance?: number;
90
+ };
91
+ /**
92
+ * @deprecated Use ShapeControlDefinition with targetKind='vertex'.
93
+ */
94
+ export type VertexHoverControl = {
95
+ kind: 'vertex';
96
+ icon: HoverControlIcon;
97
+ tolerance?: number;
98
+ };
99
+ export type ElementShapeHoverControls = {
100
+ controls?: ShapeControlDefinition[];
101
+ /**
102
+ * @deprecated Legacy singleton edge control. Use controls[] instead.
103
+ */
104
+ edge?: EdgeHoverControl;
105
+ /**
106
+ * @deprecated Legacy singleton vertex control. Use controls[] instead.
107
+ */
108
+ vertex?: VertexHoverControl;
109
+ /**
110
+ * @deprecated Legacy resolution preference for singleton edge/vertex controls.
111
+ */
112
+ priority?: 'vertex-first';
113
+ };
114
+ export type ElementShapeControlEventType = 'click' | 'drag-start' | 'drag-move' | 'drag-end';
115
+ export type ElementShapeControlDragEvent = {
116
+ sessionId: string;
117
+ startPointer: EnginePointerInfo;
118
+ delta: Point;
119
+ };
120
+ export type ElementShapeHoverControlInteractionEvent = {
121
+ eventType: ElementShapeControlEventType;
122
+ controlId: string;
123
+ elementId: string;
124
+ targetKind: ShapeControlTargetKind;
125
+ targetIndex: number;
126
+ pointer: EnginePointerInfo;
127
+ edge?: ShapeEdgeTarget;
128
+ vertex?: ShapeVertexTarget;
129
+ ellipseMidPoint?: EllipseMidPoint;
130
+ drag?: ElementShapeControlDragEvent;
131
+ };
132
+ /**
133
+ * @deprecated Use ElementShapeHoverControlInteractionEvent with eventType='click'.
134
+ */
135
+ export type ElementShapeHoverControlActivationEvent = {
136
+ controlKind: 'edge' | 'vertex';
137
+ elementId: string;
138
+ targetId: string;
139
+ pointer: EnginePointerInfo;
140
+ edge?: ShapeEdgeTarget;
141
+ vertex?: ShapeVertexTarget;
142
+ };
143
+ export type ElementPortMovementPolicy = {
144
+ moveMode: MoveConstraint | 'anchors';
145
+ anchorConstraint?: PortAnchorConstraint;
146
+ };
23
147
  export type LinkRoutingMode = 'auto' | 'manual';
24
148
  export type AnchorReference = 'top-left' | 'center';
25
149
  export type RerouteLinksOptions = {
@@ -27,6 +151,11 @@ export type RerouteLinksOptions = {
27
151
  };
28
152
  export type ElementLayoutMode = 'manual' | 'horizontal' | 'vertical';
29
153
  export type ElementLayoutAlign = 'start' | 'center' | 'end';
154
+ export type ElementLayoutChildFitMainAxis = 'none' | 'distribute';
155
+ export type ElementLayoutChildFitCrossAxis = 'none' | 'stretch';
156
+ export type TextLayoutBoundsMode = 'owner-width' | 'owner-box' | 'fixed';
157
+ export type TextLayoutWrapMode = 'none' | 'word' | 'char';
158
+ export type TextLayoutOverflowMode = 'clip' | 'ellipsis-end' | 'ellipsis-middle' | 'ellipsis-start';
30
159
  export type ElementLayout = {
31
160
  mode: ElementLayoutMode;
32
161
  padding?: number | {
@@ -35,6 +164,18 @@ export type ElementLayout = {
35
164
  };
36
165
  gap?: number;
37
166
  align?: ElementLayoutAlign;
167
+ childFitMainAxis?: ElementLayoutChildFitMainAxis;
168
+ childFitCrossAxis?: ElementLayoutChildFitCrossAxis;
169
+ childFitMinSize?: Partial<Size>;
170
+ childFitMaxSize?: Partial<Size>;
171
+ };
172
+ export type TextLayout = {
173
+ boundsMode?: TextLayoutBoundsMode;
174
+ wrap?: TextLayoutWrapMode;
175
+ overflow?: TextLayoutOverflowMode;
176
+ padding?: number;
177
+ maxLines?: number;
178
+ fixedSize?: Size;
38
179
  };
39
180
  export type ElementDropEvent = {
40
181
  elementId: string;
@@ -68,6 +209,7 @@ export type ElementData = {
68
209
  moveMode?: MoveConstraint;
69
210
  anchorCenter?: boolean;
70
211
  layout?: ElementLayout;
212
+ portMovement?: ElementPortMovementPolicy;
71
213
  };
72
214
  export type PortData = {
73
215
  id: string;
@@ -79,6 +221,8 @@ export type PortData = {
79
221
  textIds?: string[];
80
222
  moveMode?: MoveConstraint;
81
223
  anchorCenter?: boolean;
224
+ orientToHostBorder?: boolean;
225
+ currentAnchorId?: string;
82
226
  };
83
227
  export type ShapeDrawContext = {
84
228
  ctx: CanvasRenderingContext2D;
@@ -100,6 +244,10 @@ export type TextData = {
100
244
  size?: Size;
101
245
  style?: Record<string, unknown>;
102
246
  ownerId?: string | null;
247
+ layout?: TextLayout;
248
+ displayContent?: string;
249
+ displayOffset?: Point;
250
+ displayClipSize?: Size;
103
251
  };
104
252
  export type DiagramState = {
105
253
  elements: ElementData[];
@@ -172,6 +320,26 @@ export type ElementResizedEvent = {
172
320
  export type ElementDeletedEvent = {
173
321
  elementId: string;
174
322
  };
323
+ export type PortDeletedEvent = {
324
+ portId: string;
325
+ elementId: string;
326
+ };
327
+ export type LinkDeletedEvent = {
328
+ linkId: string;
329
+ sourcePortId: string;
330
+ targetPortId: string;
331
+ };
332
+ export type TextDeletedEvent = {
333
+ textId: string;
334
+ ownerId?: string | null;
335
+ };
336
+ export type TextUpdatedEvent = {
337
+ textId: string;
338
+ ownerId?: string | null;
339
+ content: string;
340
+ displayContent: string;
341
+ reason: 'content' | 'layout';
342
+ };
175
343
  export type ElementLinkStartedEvent = {
176
344
  sourcePortId: string;
177
345
  sourceElementId: string;
@@ -218,6 +386,10 @@ export type EngineEventMap = {
218
386
  elementMoved: ElementMovedEvent;
219
387
  elementResized: ElementResizedEvent;
220
388
  elementDeleted: ElementDeletedEvent;
389
+ portDeleted: PortDeletedEvent;
390
+ linkDeleted: LinkDeletedEvent;
391
+ textDeleted: TextDeletedEvent;
392
+ textUpdated: TextUpdatedEvent;
221
393
  elementSelected: ElementSelectedEvent;
222
394
  elementLinkStarted: ElementLinkStartedEvent;
223
395
  elementLinkConnecting: ElementLinkConnectingEvent;
@@ -262,10 +434,16 @@ export type DiagramEngineHandle = {
262
434
  setSnapping: (snapper: unknown) => void;
263
435
  registerShape: (shape: {
264
436
  id: string;
437
+ baseRotation?: number;
265
438
  draw?: (context: ShapeDrawContext) => void;
266
439
  createNode?: (model: ElementData | PortData) => unknown;
267
440
  svgPath?: string;
268
441
  svgSize?: Size;
442
+ projectToBorder?: (point: Point, rect: Rect) => Point;
443
+ resolveBorderSide?: (point: Point, rect: Rect) => BorderSide;
444
+ resolvePortAnchors?: (rect: Rect, options: ResolvePortAnchorsOptions) => PortAnchor[];
445
+ resolveHoverGeometry?: (rect: Rect) => ShapeHoverGeometry | undefined;
446
+ resolveEllipseMidPoints?: (rect: Rect) => ShapeEllipseMidPointTarget[] | undefined;
269
447
  }) => void;
270
448
  render: () => void;
271
449
  };
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ declare const DeletionEventsDemo: () => React.JSX.Element;
3
+ export default DeletionEventsDemo;
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ declare const ShapeHoverControlsDemo: () => React.JSX.Element;
3
+ export default ShapeHoverControlsDemo;
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ declare const TextLayoutDemo: () => React.JSX.Element;
3
+ export default TextLayoutDemo;
@@ -0,0 +1,2 @@
1
+ import type { DemoConfig } from '../types';
2
+ export declare const deletionEventsDemoConfig: DemoConfig;
@@ -0,0 +1,2 @@
1
+ import type { DemoConfig } from '../types';
2
+ export declare const rotatedCreationDemoConfig: DemoConfig;
@@ -0,0 +1,2 @@
1
+ import type { DemoConfig } from '../types';
2
+ export declare const roundedRectRadiusDemoConfig: DemoConfig;
@@ -0,0 +1,2 @@
1
+ import type { DemoConfig } from '../types';
2
+ export declare const shapeBorderMovementDemoConfig: DemoConfig;
@@ -0,0 +1,10 @@
1
+ import type { DemoConfig } from '../types';
2
+ export declare const shapeHoverDemoIds: {
3
+ readonly drawer: "hover-drawer";
4
+ readonly diamond: "hover-diamond";
5
+ readonly target: "hover-target-rect";
6
+ readonly ellipse: "hover-ellipse-host";
7
+ readonly circle: "hover-circle-host";
8
+ readonly noopRect: "hover-noop-rect";
9
+ };
10
+ export declare const shapeHoverControlsDemoConfig: DemoConfig;
@@ -1,2 +1,6 @@
1
1
  import type { DemoConfig } from '../types';
2
+ export declare const textDemoOwnerId = "text-layout-owner";
3
+ export declare const textDemoOwnedTextId = "text-owned-overflow";
4
+ export declare const textDemoFloatingTextId = "text-floating-overflow";
5
+ export declare const textDemoLongSample = "Long diagram label: middle ellipsis should keep the beginning and end visible while preserving the full canonical content in model state.";
2
6
  export declare const textDemoConfig: DemoConfig;
@@ -1,5 +1,5 @@
1
1
  /// <reference types="react" />
2
- import type { DiagramEditorHandle, DiagramState, SimpleShape } from '../api';
2
+ import type { DiagramEditorHandle, DiagramState, ElementShapeHoverControlActivationEvent, ElementShapeHoverControlInteractionEvent, ElementShapeHoverControls, SimpleShape } from '../api';
3
3
  import type { RouterStrategy } from '../strategies/RouterStrategy';
4
4
  import type { ViewportSnapshot } from './types';
5
5
  type DemoEditorConfig = {
@@ -8,8 +8,11 @@ type DemoEditorConfig = {
8
8
  portShapes?: SimpleShape[];
9
9
  router?: RouterStrategy;
10
10
  snapDefault?: boolean;
11
+ elementShapeHoverControls?: ElementShapeHoverControls;
12
+ onElementShapeHoverControlInteraction?: (event: ElementShapeHoverControlInteractionEvent) => void;
13
+ onElementShapeHoverControlActivated?: (event: ElementShapeHoverControlActivationEvent) => void;
11
14
  };
12
- declare const useDemoEditor: ({ createState, elementShapes, portShapes, router, snapDefault }: DemoEditorConfig) => {
15
+ declare const useDemoEditor: ({ createState, elementShapes, portShapes, router, snapDefault, elementShapeHoverControls, onElementShapeHoverControlInteraction, onElementShapeHoverControlActivated, }: DemoEditorConfig) => {
13
16
  containerRef: import("react").MutableRefObject<HTMLDivElement | null>;
14
17
  editorRef: import("react").MutableRefObject<DiagramEditorHandle | null>;
15
18
  diagramState: DiagramState | null;
@@ -0,0 +1,24 @@
1
+ import { DiagramPatch } from '../api/types';
2
+ import DiagramModel from '../models/DiagramModel';
3
+ import CommandQueue from './CommandQueue';
4
+ export type AutoLayoutResult = {
5
+ patches: DiagramPatch[];
6
+ movedPortIds: string[];
7
+ };
8
+ export type AutoLayoutServiceConfig = {
9
+ model: DiagramModel;
10
+ commandQueue: CommandQueue;
11
+ collectElementPortIds: (elementId: string) => string[];
12
+ };
13
+ export default class AutoLayoutService {
14
+ private model;
15
+ private commandQueue;
16
+ private collectElementPortIds;
17
+ constructor(config: AutoLayoutServiceConfig);
18
+ applyLayoutForParent(parentId: string): AutoLayoutResult;
19
+ applyLayoutCascade(startParentId: string | null): AutoLayoutResult;
20
+ applyAllLayouts(): AutoLayoutResult;
21
+ private resolveLayoutPadding;
22
+ private clampLayoutSize;
23
+ private distributeLayoutSizes;
24
+ }
@@ -3,7 +3,7 @@ import { Renderer } from '../renderer/Renderer';
3
3
  import RenderScheduler from '../renderer/RenderScheduler';
4
4
  import { RouterStrategy } from '../strategies/RouterStrategy';
5
5
  import { SnapStrategy } from '../strategies/SnapStrategy';
6
- import { ShapeDefinition, ShapeRegistry } from '../renderer/RenderTypes';
6
+ import { ShapeDefinition, ShapeRegistry, ShapeResizeHandle } from '../renderer/RenderTypes';
7
7
  import { TextMeasurer } from '../measure/TextMeasurer';
8
8
  export type DiagramEngineConfig = {
9
9
  renderer: Renderer;
@@ -21,10 +21,12 @@ export default class DiagramEngine {
21
21
  private viewport;
22
22
  private renderer;
23
23
  private scheduler;
24
- private router;
25
24
  private snapper;
26
25
  private shapeRegistry;
27
- private textMeasurer;
26
+ private textLayoutService;
27
+ private autoLayoutService;
28
+ private linkRoutingService;
29
+ private mutationPipeline;
28
30
  constructor(config: DiagramEngineConfig);
29
31
  static create(config: DiagramEngineConfig): DiagramEngine;
30
32
  load(state: DiagramState): void;
@@ -63,6 +65,18 @@ export default class DiagramEngine {
63
65
  toggleSelection(id: string): void;
64
66
  getSelection(): string[];
65
67
  getElementWorldPosition(id: string): Point | null;
68
+ getElementRotation(id: string): number;
69
+ normalizeElementResize(id: string, proposal: {
70
+ x: number;
71
+ y: number;
72
+ width: number;
73
+ height: number;
74
+ }, handle: ShapeResizeHandle, minSize?: number): {
75
+ x: number;
76
+ y: number;
77
+ width: number;
78
+ height: number;
79
+ };
66
80
  getPortWorldPosition(id: string): Point | null;
67
81
  getTextWorldPosition(id: string): Point | null;
68
82
  getPortElementId(portId: string): string | null;
@@ -92,24 +106,28 @@ export default class DiagramEngine {
92
106
  cancelled: boolean;
93
107
  }): void;
94
108
  private emitChange;
109
+ private appendTextLayoutPatches;
110
+ private reprojectBorderPortsForResizedElements;
111
+ private collectResizedElementSizes;
112
+ private resolveBorderPortResizeProjection;
113
+ private resolveConstrainedPortRelativePosition;
114
+ private resolveEffectivePortMoveMode;
115
+ private resolvePortAnchorsForElement;
116
+ private resolveNearestPortAnchor;
117
+ private findNearestPortAnchor;
118
+ private resolveAnchoredPortResizeProjection;
119
+ private resolveTextPresentation;
95
120
  private emitSelection;
96
- private resolveLayoutPadding;
97
121
  private applyLayoutForParent;
98
122
  private applyLayoutCascade;
99
123
  private applyAllLayouts;
100
124
  private updateLinksForPorts;
101
125
  private collectElementPortIds;
102
- private resolveLinkPointsForUpdate;
103
- private updateManualRoute;
104
126
  private computeAutoRoute;
105
- private buildRouteContext;
106
- private getElementRect;
107
- private getAncestorChain;
108
- private getAncestorExclusions;
109
- private resolveRouteBounds;
110
- private isPointOnRectEdge;
111
- private resolveEdgeSide;
127
+ private constrainPortToHostBorder;
128
+ private projectPointToHostBorder;
112
129
  private routeLinksWithEmptyPoints;
113
- private computeRemovalPatches;
130
+ private computeRemovalDiff;
131
+ private emitEntityDeletionEvents;
114
132
  }
115
133
  export declare const createDiagramEngine: (config: DiagramEngineConfig) => DiagramEngineHandle;
@@ -14,7 +14,10 @@ export declare const createResizeElementCommand: (id: string, size: {
14
14
  export declare const createRemoveElementCommand: (id: string) => EngineCommand;
15
15
  export declare const createSetElementLayoutCommand: (id: string, layout: ElementData['layout']) => EngineCommand;
16
16
  export declare const createAddPortCommand: (port: PortData) => EngineCommand;
17
- export declare const createMovePortCommand: (id: string, position: Point) => EngineCommand;
17
+ export declare const createMovePortCommand: (id: string, update: {
18
+ position: Point;
19
+ currentAnchorId?: string | null;
20
+ }) => EngineCommand;
18
21
  export declare const createRemovePortCommand: (id: string) => EngineCommand;
19
22
  export declare const createAddLinkCommand: (link: LinkData) => EngineCommand;
20
23
  export declare const createUpdateLinkCommand: (id: string, update: {
@@ -0,0 +1,35 @@
1
+ import { DiagramPatch, LinkData, Point } from '../api/types';
2
+ import DiagramModel from '../models/DiagramModel';
3
+ import { ShapeRegistry } from '../renderer/RenderTypes';
4
+ import { RouterStrategy } from '../strategies/RouterStrategy';
5
+ import CommandQueue from './CommandQueue';
6
+ export type LinkRoutingServiceConfig = {
7
+ model: DiagramModel;
8
+ commandQueue: CommandQueue;
9
+ router: RouterStrategy;
10
+ shapeRegistry: ShapeRegistry;
11
+ };
12
+ export default class LinkRoutingService {
13
+ private model;
14
+ private commandQueue;
15
+ private router;
16
+ private shapeRegistry;
17
+ constructor(config: LinkRoutingServiceConfig);
18
+ setRouter(router: RouterStrategy): void;
19
+ updateLinksForPorts(portIds: string[]): DiagramPatch[];
20
+ routeLinksWithEmptyPoints(): DiagramPatch[];
21
+ computeAutoRoute(link: LinkData, source: Point, target: Point): Point[];
22
+ private resolveLinkPointsForUpdate;
23
+ private updateManualRoute;
24
+ private buildRouteContext;
25
+ private resolveEndpointGeometry;
26
+ private resolveCornerTieBreakSide;
27
+ private resolveElementShape;
28
+ private isPointOnProjectedBorder;
29
+ private getElementRect;
30
+ private getAncestorChain;
31
+ private getAncestorExclusions;
32
+ private resolveRouteBounds;
33
+ private isPointOnRectEdge;
34
+ private resolveEdgeSide;
35
+ }
@@ -0,0 +1,23 @@
1
+ import { DiagramPatch } from '../api/types';
2
+ import { AutoLayoutResult } from './AutoLayoutService';
3
+ export type MutationPipelineConfig = {
4
+ routeLinksWithEmptyPoints: () => DiagramPatch[];
5
+ reprojectBorderPortsForResizedElements: (patches: DiagramPatch[]) => {
6
+ patches: DiagramPatch[];
7
+ movedPortIds: string[];
8
+ };
9
+ updateLinksForPorts: (portIds: string[]) => DiagramPatch[];
10
+ };
11
+ export type MutationPipelineRunOptions = {
12
+ basePatches: DiagramPatch[];
13
+ layoutSteps?: Array<() => AutoLayoutResult>;
14
+ movedPortIds?: string[];
15
+ includeEmptyLinkRouting?: boolean;
16
+ };
17
+ export default class MutationPipeline {
18
+ private routeLinksWithEmptyPoints;
19
+ private reprojectBorderPortsForResizedElements;
20
+ private updateLinksForPorts;
21
+ constructor(config: MutationPipelineConfig);
22
+ run(options: MutationPipelineRunOptions): DiagramPatch[];
23
+ }
@@ -0,0 +1,40 @@
1
+ import { DiagramPatch, EngineEventMap, Point, TextData } from '../api/types';
2
+ import { TextMeasurer } from '../measure/TextMeasurer';
3
+ import DiagramModel from '../models/DiagramModel';
4
+ export type ResolvedTextPresentation = {
5
+ size: {
6
+ width: number;
7
+ height: number;
8
+ };
9
+ displayContent: string;
10
+ displayOffset?: Point;
11
+ displayClipSize?: {
12
+ width: number;
13
+ height: number;
14
+ };
15
+ };
16
+ export type TextLayoutServiceConfig = {
17
+ model: DiagramModel;
18
+ textMeasurer: TextMeasurer;
19
+ };
20
+ export default class TextLayoutService {
21
+ private model;
22
+ private textMeasurer;
23
+ constructor(config: TextLayoutServiceConfig);
24
+ resolveTextPresentation(text: TextData): ResolvedTextPresentation;
25
+ appendTextLayoutPatches(patches: DiagramPatch[], options?: {
26
+ emitTextUpdated?: boolean;
27
+ onTextUpdated?: (payload: EngineEventMap['textUpdated']) => void;
28
+ }): DiagramPatch[];
29
+ private collectResizedElementIds;
30
+ private shouldTrackOwnerBoundLayout;
31
+ private resolveTextLayoutBounds;
32
+ private wrapText;
33
+ private wrapByWord;
34
+ private wrapByChar;
35
+ private truncateToWidth;
36
+ private clipToWidth;
37
+ private measureTextWidth;
38
+ private resolveTruncationWidthSafety;
39
+ private resolveTextRenderPadding;
40
+ }
@@ -0,0 +1,2 @@
1
+ export { demoTabs, baseElementShapes, basePortShapes, customGalleryShapes, defaultGhostSize, defaultSvgPath, defaultSvgPathSize, externalToolboxItems, } from '../displaybox/demos';
2
+ export type { DemoAction, DemoActionHelpers, DemoConfig, DemoDefinition, ToolboxItem, DiagramCounts, ViewportSnapshot, DisplayBoxMetrics, } from '../displaybox/types';
@@ -0,0 +1,9 @@
1
+ export declare const DEFAULT_TEXT_FONT_SIZE = 12;
2
+ export declare const DEFAULT_TEXT_FONT_FAMILY = "Arial";
3
+ export declare const DEFAULT_TEXT_LINE_HEIGHT = 1.2;
4
+ export type ResolvedTextStyle = {
5
+ fontSize: number;
6
+ fontFamily: string;
7
+ lineHeight: number;
8
+ };
9
+ export declare const resolveTextStyleDefaults: (style?: Record<string, unknown>) => ResolvedTextStyle;
@@ -31,6 +31,7 @@ export default class DiagramModel {
31
31
  removeElement(id: string): void;
32
32
  addPort(data: PortData): PortModel;
33
33
  movePort(id: string, position: Point): void;
34
+ setPortCurrentAnchorId(id: string, currentAnchorId?: string): void;
34
35
  removePort(id: string): void;
35
36
  addLink(data: LinkData): LinkModel;
36
37
  updateLinkPoints(id: string, points: Point[]): void;
@@ -11,6 +11,7 @@ export default class ElementModel {
11
11
  moveMode?: MoveConstraint;
12
12
  anchorCenter?: boolean;
13
13
  layout?: ElementData['layout'];
14
+ portMovement?: ElementData['portMovement'];
14
15
  constructor(data: ElementData);
15
16
  setPosition(position: Point): void;
16
17
  setSize(size: Size): void;
@@ -9,8 +9,11 @@ export default class PortModel {
9
9
  textIds: string[];
10
10
  moveMode?: MoveConstraint;
11
11
  anchorCenter?: boolean;
12
+ orientToHostBorder: boolean;
13
+ currentAnchorId?: string;
12
14
  constructor(data: PortData);
13
15
  setPosition(position: Point): void;
16
+ setCurrentAnchorId(currentAnchorId?: string): void;
14
17
  addText(textId: string): void;
15
18
  removeText(textId: string): void;
16
19
  toData(): PortData;
@@ -6,9 +6,17 @@ export default class TextModel {
6
6
  size?: Size;
7
7
  style?: Record<string, unknown>;
8
8
  ownerId?: string | null;
9
+ layout?: TextData['layout'];
10
+ displayContent?: string;
11
+ displayOffset?: Point;
12
+ displayClipSize?: Size;
9
13
  constructor(data: TextData);
10
14
  setContent(content: string): void;
11
15
  setSize(size: Size): void;
16
+ setDisplayContent(content: string): void;
17
+ setDisplayOffset(offset: Point | undefined): void;
18
+ setDisplayClipSize(size: Size | undefined): void;
19
+ setLayout(layout: TextData['layout']): void;
12
20
  setPosition(position: Point): void;
13
21
  toData(): TextData;
14
22
  }