@principal-ai/principal-view-react 0.14.6 → 0.14.7

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.
@@ -1 +1 @@
1
- {"version":3,"file":"elkLayout.d.ts","sourceRoot":"","sources":["../../src/utils/elkLayout.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAEhD,sDAAsD;AACtD,MAAM,MAAM,eAAe,GAAG,YAAY,GAAG,SAAS,GAAG,UAAU,CAAC;AAEpE,6BAA6B;AAC7B,MAAM,WAAW,gBAAgB;IAC/B;;;;;OAKG;IACH,YAAY,CAAC,EAAE,eAAe,CAAC;IAE/B;;;;;OAKG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAEhC;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;CAC9C;AAED,uCAAuC;AACvC,MAAM,WAAW,eAAe;IAC9B,uEAAuE;IACvE,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,uDAAuD;IACvD,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,6CAA6C;IAC7C,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC3D;AAED,wBAAwB;AACxB,MAAM,WAAW,KAAK;IACpB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAyBD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CASpD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,YAAY,GAAE,MAAU,GAAG,MAAM,CAoDpF;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAmC5D;AAwCD;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,IAAI,EAAE,EACb,KAAK,EAAE,IAAI,EAAE,EACb,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,eAAe,CAAC,CAiJ1B;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,gBAAqB,WAC/C,IAAI,EAAE,SAAS,IAAI,EAAE,8BACrC"}
1
+ {"version":3,"file":"elkLayout.d.ts","sourceRoot":"","sources":["../../src/utils/elkLayout.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAEhD,sDAAsD;AACtD,MAAM,MAAM,eAAe,GAAG,YAAY,GAAG,SAAS,GAAG,UAAU,CAAC;AAEpE,6BAA6B;AAC7B,MAAM,WAAW,gBAAgB;IAC/B;;;;;OAKG;IACH,YAAY,CAAC,EAAE,eAAe,CAAC;IAE/B;;;;;OAKG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAEhC;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;CAC9C;AAED,uCAAuC;AACvC,MAAM,WAAW,eAAe;IAC9B,uEAAuE;IACvE,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,uDAAuD;IACvD,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,6CAA6C;IAC7C,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC3D;AAED,wBAAwB;AACxB,MAAM,WAAW,KAAK;IACpB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAyBD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CASpD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,YAAY,GAAE,MAAU,GAAG,MAAM,CAoDpF;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAmC5D;AAkDD;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,IAAI,EAAE,EACb,KAAK,EAAE,IAAI,EAAE,EACb,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,eAAe,CAAC,CAkN1B;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,gBAAqB,WAC/C,IAAI,EAAE,SAAS,IAAI,EAAE,8BACrC"}
@@ -120,11 +120,21 @@ function getElkOptions(options) {
120
120
  const baseOptions = {
121
121
  'elk.algorithm': 'layered',
122
122
  'elk.direction': direction,
123
+ // Spacing
123
124
  'elk.spacing.nodeNode': String(nodeSpacing),
124
125
  'elk.spacing.edgeEdge': String(edgeSpacing),
125
126
  'elk.spacing.edgeNode': String(edgeNodeSpacing),
126
127
  'elk.layered.spacing.edgeEdgeBetweenLayers': String(edgeSpacing),
127
128
  'elk.layered.spacing.edgeNodeBetweenLayers': String(edgeNodeSpacing),
129
+ // Port constraints - edges connect at specific sides
130
+ 'elk.portConstraints': 'FIXED_SIDE',
131
+ // Improve orthogonal routing quality
132
+ 'elk.layered.nodePlacement.strategy': 'NETWORK_SIMPLEX',
133
+ 'elk.layered.crossingMinimization.strategy': 'LAYER_SWEEP',
134
+ // Merge edges going same direction for cleaner routing
135
+ 'elk.layered.mergeEdges': 'true',
136
+ // Higher thoroughness = better edge routing (1-100)
137
+ 'elk.layered.thoroughness': '50',
128
138
  };
129
139
  // Set edge routing style
130
140
  switch (routingStyle) {
@@ -150,7 +160,13 @@ function getElkOptions(options) {
150
160
  */
151
161
  export async function computeElkLayout(nodes, edges, options = {}) {
152
162
  const { preserveNodePositions = true } = options;
153
- // Convert nodes to ELK format - simple, no ports
163
+ // Build a map of original node positions BEFORE passing to ELK
164
+ // (ELK mutates the input nodes in place, so we must save positions first)
165
+ const originalPositions = new Map();
166
+ for (const node of nodes) {
167
+ originalPositions.set(node.id, { x: node.position.x, y: node.position.y });
168
+ }
169
+ // Convert nodes to ELK format with ports for clean edge routing
154
170
  const elkNodes = nodes.map((node) => {
155
171
  const width = node.measured?.width ?? node.width ?? 200;
156
172
  const height = node.measured?.height ?? node.height ?? 100;
@@ -160,14 +176,56 @@ export async function computeElkLayout(nodes, edges, options = {}) {
160
176
  height,
161
177
  x: node.position.x,
162
178
  y: node.position.y,
179
+ // Add ports on each side for edge connections
180
+ ports: [
181
+ { id: `${node.id}_top`, properties: { 'port.side': 'NORTH' } },
182
+ { id: `${node.id}_right`, properties: { 'port.side': 'EAST' } },
183
+ { id: `${node.id}_bottom`, properties: { 'port.side': 'SOUTH' } },
184
+ { id: `${node.id}_left`, properties: { 'port.side': 'WEST' } },
185
+ ],
186
+ properties: {
187
+ 'portConstraints': 'FIXED_SIDE',
188
+ },
189
+ };
190
+ });
191
+ // Determine which port to use based on relative node positions
192
+ const getPortSide = (sourceId, targetId) => {
193
+ const sourcePos = originalPositions.get(sourceId);
194
+ const targetPos = originalPositions.get(targetId);
195
+ if (!sourcePos || !targetPos) {
196
+ return { sourcePort: `${sourceId}_right`, targetPort: `${targetId}_left` };
197
+ }
198
+ const dx = targetPos.x - sourcePos.x;
199
+ const dy = targetPos.y - sourcePos.y;
200
+ // Determine primary direction
201
+ if (Math.abs(dx) > Math.abs(dy)) {
202
+ // Horizontal movement dominates
203
+ if (dx > 0) {
204
+ return { sourcePort: `${sourceId}_right`, targetPort: `${targetId}_left` };
205
+ }
206
+ else {
207
+ return { sourcePort: `${sourceId}_left`, targetPort: `${targetId}_right` };
208
+ }
209
+ }
210
+ else {
211
+ // Vertical movement dominates
212
+ if (dy > 0) {
213
+ return { sourcePort: `${sourceId}_bottom`, targetPort: `${targetId}_top` };
214
+ }
215
+ else {
216
+ return { sourcePort: `${sourceId}_top`, targetPort: `${targetId}_bottom` };
217
+ }
218
+ }
219
+ };
220
+ // Convert edges to ELK format with port references
221
+ const elkEdges = edges.map((edge) => {
222
+ const { sourcePort, targetPort } = getPortSide(edge.source, edge.target);
223
+ return {
224
+ id: edge.id,
225
+ sources: [sourcePort],
226
+ targets: [targetPort],
163
227
  };
164
228
  });
165
- // Convert edges to ELK format - simple node references
166
- const elkEdges = edges.map((edge) => ({
167
- id: edge.id,
168
- sources: [edge.source],
169
- targets: [edge.target],
170
- }));
171
229
  // Create ELK graph
172
230
  const elkGraph = {
173
231
  id: 'root',
@@ -177,11 +235,6 @@ export async function computeElkLayout(nodes, edges, options = {}) {
177
235
  };
178
236
  // Run ELK layout
179
237
  const layoutedGraph = await getElkInstance().layout(elkGraph);
180
- // Build a map of original node positions (what we passed in)
181
- const originalPositions = new Map();
182
- for (const node of elkNodes) {
183
- originalPositions.set(node.id, { x: node.x ?? 0, y: node.y ?? 0 });
184
- }
185
238
  // Build a map of ELK-computed node positions
186
239
  const elkPositions = new Map();
187
240
  if (layoutedGraph.children) {
@@ -218,9 +271,6 @@ export async function computeElkLayout(nodes, edges, options = {}) {
218
271
  // The edge path is relative to ELK's layout, so we translate it
219
272
  if (preserveNodePositions && sourceOriginal && sourceElk && targetOriginal && targetElk) {
220
273
  // Calculate the offset from ELK space to original space
221
- // For the start point, use source node offset
222
- // For the end point, use target node offset
223
- // For middle points, interpolate based on x position
224
274
  const sourceOffset = {
225
275
  x: sourceOriginal.x - sourceElk.x,
226
276
  y: sourceOriginal.y - sourceElk.y,
@@ -229,19 +279,40 @@ export async function computeElkLayout(nodes, edges, options = {}) {
229
279
  x: targetOriginal.x - targetElk.x,
230
280
  y: targetOriginal.y - targetElk.y,
231
281
  };
232
- // Get the x-range of the path for interpolation
233
- const minX = Math.min(...allPoints.map(p => p.x));
234
- const maxX = Math.max(...allPoints.map(p => p.x));
235
- const xRange = maxX - minX || 1;
236
- // Offset each point - interpolate between source and target offset based on x position
282
+ // For orthogonal routing, use index-based offset assignment
283
+ // First point uses source offset, last point uses target offset
284
+ // Middle points use offset based on their position in the path
285
+ const lastIdx = allPoints.length - 1;
237
286
  for (let i = 0; i < allPoints.length; i++) {
238
- const t = (allPoints[i].x - minX) / xRange; // 0 at source, 1 at target
287
+ // Use path position (index) for interpolation instead of X position
288
+ // This preserves orthogonal segment shapes
289
+ const t = lastIdx > 0 ? i / lastIdx : 0;
239
290
  allPoints[i] = {
240
291
  x: allPoints[i].x + sourceOffset.x + (targetOffset.x - sourceOffset.x) * t,
241
292
  y: allPoints[i].y + sourceOffset.y + (targetOffset.y - sourceOffset.y) * t,
242
293
  };
243
294
  }
244
295
  }
296
+ // For orthogonal routing, rebuild the path with proper right-angle bends
297
+ // The transformation can distort ELK's bend points, so we compute fresh bends
298
+ if (options.routingStyle === 'orthogonal') {
299
+ const start = allPoints[0];
300
+ const end = allPoints[allPoints.length - 1];
301
+ const dx = Math.abs(end.x - start.x);
302
+ const dy = Math.abs(end.y - start.y);
303
+ // Clear intermediate points and regenerate orthogonal path
304
+ allPoints.length = 0;
305
+ allPoints.push(start);
306
+ // If not aligned horizontally or vertically, insert bend points
307
+ if (dx > 1 && dy > 1) {
308
+ // Create a step pattern: horizontal → vertical → horizontal
309
+ const midX = (start.x + end.x) / 2;
310
+ // Two bend points for a proper step/channel pattern
311
+ allPoints.push({ x: midX, y: start.y });
312
+ allPoints.push({ x: midX, y: end.y });
313
+ }
314
+ allPoints.push(end);
315
+ }
245
316
  // Convert to path
246
317
  const path = options.routingStyle === 'orthogonal'
247
318
  ? pointsToSmoothPath(allPoints, 8)
@@ -1 +1 @@
1
- {"version":3,"file":"elkLayout.js","sourceRoot":"","sources":["../../src/utils/elkLayout.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"elkLayout.js","sourceRoot":"","sources":["../../src/utils/elkLayout.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@principal-ai/principal-view-react",
3
- "version": "0.14.6",
3
+ "version": "0.14.7",
4
4
  "description": "React components for graph-based principal view framework",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -85,6 +85,88 @@ export const Level1_TwoNodes_ELK: Story = {
85
85
  },
86
86
  };
87
87
 
88
+ // =============================================================================
89
+ // Level 1b: Two nodes with vertical offset
90
+ // =============================================================================
91
+ const twoNodeVerticalOffsetCanvas: ExtendedCanvas = {
92
+ nodes: [
93
+ createNode('a', 0, 0, 'Node A', 5),
94
+ createNode('b', 250, 100, 'Node B', 4),
95
+ ],
96
+ edges: [
97
+ { id: 'e1', fromNode: 'a', toNode: 'b', fromSide: 'right', toSide: 'left', pv: { edgeType: 'flow' } },
98
+ ],
99
+ pv: {
100
+ version: '1.0.0',
101
+ name: 'Two Nodes Vertical Offset',
102
+ edgeTypes: {
103
+ flow: { style: 'solid', color: '#3b82f6', width: 2, directed: true },
104
+ },
105
+ },
106
+ };
107
+
108
+ export const Level1b_TwoNodesVerticalOffset: Story = {
109
+ args: {
110
+ canvas: twoNodeVerticalOffsetCanvas,
111
+ width: 500,
112
+ height: 250,
113
+ showBackground: true,
114
+ backgroundVariant: 'dots',
115
+ },
116
+ };
117
+
118
+ export const Level1b_TwoNodesVerticalOffset_ELK: Story = {
119
+ args: {
120
+ canvas: twoNodeVerticalOffsetCanvas,
121
+ width: 500,
122
+ height: 250,
123
+ showBackground: true,
124
+ backgroundVariant: 'dots',
125
+ elkLayout: { enabled: true, routingStyle: 'orthogonal' },
126
+ },
127
+ };
128
+
129
+ // =============================================================================
130
+ // Level 1c: Two nodes stacked vertically (target below source)
131
+ // =============================================================================
132
+ const twoNodeStackedCanvas: ExtendedCanvas = {
133
+ nodes: [
134
+ createNode('a', 50, 0, 'Node A', 5),
135
+ createNode('b', 50, 120, 'Node B', 4),
136
+ ],
137
+ edges: [
138
+ { id: 'e1', fromNode: 'a', toNode: 'b', fromSide: 'bottom', toSide: 'top', pv: { edgeType: 'flow' } },
139
+ ],
140
+ pv: {
141
+ version: '1.0.0',
142
+ name: 'Two Nodes Stacked',
143
+ edgeTypes: {
144
+ flow: { style: 'solid', color: '#3b82f6', width: 2, directed: true },
145
+ },
146
+ },
147
+ };
148
+
149
+ export const Level1c_TwoNodesStacked: Story = {
150
+ args: {
151
+ canvas: twoNodeStackedCanvas,
152
+ width: 300,
153
+ height: 300,
154
+ showBackground: true,
155
+ backgroundVariant: 'dots',
156
+ },
157
+ };
158
+
159
+ export const Level1c_TwoNodesStacked_ELK: Story = {
160
+ args: {
161
+ canvas: twoNodeStackedCanvas,
162
+ width: 300,
163
+ height: 300,
164
+ showBackground: true,
165
+ backgroundVariant: 'dots',
166
+ elkLayout: { enabled: true, routingStyle: 'orthogonal' },
167
+ },
168
+ };
169
+
88
170
  // =============================================================================
89
171
  // Level 2: Three nodes in a line
90
172
  // =============================================================================
@@ -222,11 +222,21 @@ function getElkOptions(options: ElkLayoutOptions): LayoutOptions {
222
222
  const baseOptions: LayoutOptions = {
223
223
  'elk.algorithm': 'layered',
224
224
  'elk.direction': direction,
225
+ // Spacing
225
226
  'elk.spacing.nodeNode': String(nodeSpacing),
226
227
  'elk.spacing.edgeEdge': String(edgeSpacing),
227
228
  'elk.spacing.edgeNode': String(edgeNodeSpacing),
228
229
  'elk.layered.spacing.edgeEdgeBetweenLayers': String(edgeSpacing),
229
230
  'elk.layered.spacing.edgeNodeBetweenLayers': String(edgeNodeSpacing),
231
+ // Port constraints - edges connect at specific sides
232
+ 'elk.portConstraints': 'FIXED_SIDE',
233
+ // Improve orthogonal routing quality
234
+ 'elk.layered.nodePlacement.strategy': 'NETWORK_SIMPLEX',
235
+ 'elk.layered.crossingMinimization.strategy': 'LAYER_SWEEP',
236
+ // Merge edges going same direction for cleaner routing
237
+ 'elk.layered.mergeEdges': 'true',
238
+ // Higher thoroughness = better edge routing (1-100)
239
+ 'elk.layered.thoroughness': '50',
230
240
  };
231
241
 
232
242
  // Set edge routing style
@@ -260,7 +270,14 @@ export async function computeElkLayout(
260
270
  ): Promise<ElkLayoutResult> {
261
271
  const { preserveNodePositions = true } = options;
262
272
 
263
- // Convert nodes to ELK format - simple, no ports
273
+ // Build a map of original node positions BEFORE passing to ELK
274
+ // (ELK mutates the input nodes in place, so we must save positions first)
275
+ const originalPositions = new Map<string, { x: number; y: number }>();
276
+ for (const node of nodes) {
277
+ originalPositions.set(node.id, { x: node.position.x, y: node.position.y });
278
+ }
279
+
280
+ // Convert nodes to ELK format with ports for clean edge routing
264
281
  const elkNodes: ElkNode[] = nodes.map((node) => {
265
282
  const width = node.measured?.width ?? node.width ?? 200;
266
283
  const height = node.measured?.height ?? node.height ?? 100;
@@ -271,15 +288,58 @@ export async function computeElkLayout(
271
288
  height,
272
289
  x: node.position.x,
273
290
  y: node.position.y,
291
+ // Add ports on each side for edge connections
292
+ ports: [
293
+ { id: `${node.id}_top`, properties: { 'port.side': 'NORTH' } },
294
+ { id: `${node.id}_right`, properties: { 'port.side': 'EAST' } },
295
+ { id: `${node.id}_bottom`, properties: { 'port.side': 'SOUTH' } },
296
+ { id: `${node.id}_left`, properties: { 'port.side': 'WEST' } },
297
+ ],
298
+ properties: {
299
+ 'portConstraints': 'FIXED_SIDE',
300
+ },
274
301
  };
275
302
  });
276
303
 
277
- // Convert edges to ELK format - simple node references
278
- const elkEdges: ElkExtendedEdge[] = edges.map((edge) => ({
279
- id: edge.id,
280
- sources: [edge.source],
281
- targets: [edge.target],
282
- }));
304
+ // Determine which port to use based on relative node positions
305
+ const getPortSide = (sourceId: string, targetId: string): { sourcePort: string; targetPort: string } => {
306
+ const sourcePos = originalPositions.get(sourceId);
307
+ const targetPos = originalPositions.get(targetId);
308
+
309
+ if (!sourcePos || !targetPos) {
310
+ return { sourcePort: `${sourceId}_right`, targetPort: `${targetId}_left` };
311
+ }
312
+
313
+ const dx = targetPos.x - sourcePos.x;
314
+ const dy = targetPos.y - sourcePos.y;
315
+
316
+ // Determine primary direction
317
+ if (Math.abs(dx) > Math.abs(dy)) {
318
+ // Horizontal movement dominates
319
+ if (dx > 0) {
320
+ return { sourcePort: `${sourceId}_right`, targetPort: `${targetId}_left` };
321
+ } else {
322
+ return { sourcePort: `${sourceId}_left`, targetPort: `${targetId}_right` };
323
+ }
324
+ } else {
325
+ // Vertical movement dominates
326
+ if (dy > 0) {
327
+ return { sourcePort: `${sourceId}_bottom`, targetPort: `${targetId}_top` };
328
+ } else {
329
+ return { sourcePort: `${sourceId}_top`, targetPort: `${targetId}_bottom` };
330
+ }
331
+ }
332
+ };
333
+
334
+ // Convert edges to ELK format with port references
335
+ const elkEdges: ElkExtendedEdge[] = edges.map((edge) => {
336
+ const { sourcePort, targetPort } = getPortSide(edge.source, edge.target);
337
+ return {
338
+ id: edge.id,
339
+ sources: [sourcePort],
340
+ targets: [targetPort],
341
+ };
342
+ });
283
343
 
284
344
  // Create ELK graph
285
345
  const elkGraph: ElkNode = {
@@ -292,12 +352,6 @@ export async function computeElkLayout(
292
352
  // Run ELK layout
293
353
  const layoutedGraph = await getElkInstance().layout(elkGraph);
294
354
 
295
- // Build a map of original node positions (what we passed in)
296
- const originalPositions = new Map<string, { x: number; y: number }>();
297
- for (const node of elkNodes) {
298
- originalPositions.set(node.id, { x: node.x ?? 0, y: node.y ?? 0 });
299
- }
300
-
301
355
  // Build a map of ELK-computed node positions
302
356
  const elkPositions = new Map<string, { x: number; y: number }>();
303
357
  if (layoutedGraph.children) {
@@ -340,10 +394,6 @@ export async function computeElkLayout(
340
394
  // The edge path is relative to ELK's layout, so we translate it
341
395
  if (preserveNodePositions && sourceOriginal && sourceElk && targetOriginal && targetElk) {
342
396
  // Calculate the offset from ELK space to original space
343
- // For the start point, use source node offset
344
- // For the end point, use target node offset
345
- // For middle points, interpolate based on x position
346
-
347
397
  const sourceOffset = {
348
398
  x: sourceOriginal.x - sourceElk.x,
349
399
  y: sourceOriginal.y - sourceElk.y,
@@ -353,14 +403,14 @@ export async function computeElkLayout(
353
403
  y: targetOriginal.y - targetElk.y,
354
404
  };
355
405
 
356
- // Get the x-range of the path for interpolation
357
- const minX = Math.min(...allPoints.map(p => p.x));
358
- const maxX = Math.max(...allPoints.map(p => p.x));
359
- const xRange = maxX - minX || 1;
360
-
361
- // Offset each point - interpolate between source and target offset based on x position
406
+ // For orthogonal routing, use index-based offset assignment
407
+ // First point uses source offset, last point uses target offset
408
+ // Middle points use offset based on their position in the path
409
+ const lastIdx = allPoints.length - 1;
362
410
  for (let i = 0; i < allPoints.length; i++) {
363
- const t = (allPoints[i].x - minX) / xRange; // 0 at source, 1 at target
411
+ // Use path position (index) for interpolation instead of X position
412
+ // This preserves orthogonal segment shapes
413
+ const t = lastIdx > 0 ? i / lastIdx : 0;
364
414
  allPoints[i] = {
365
415
  x: allPoints[i].x + sourceOffset.x + (targetOffset.x - sourceOffset.x) * t,
366
416
  y: allPoints[i].y + sourceOffset.y + (targetOffset.y - sourceOffset.y) * t,
@@ -368,6 +418,31 @@ export async function computeElkLayout(
368
418
  }
369
419
  }
370
420
 
421
+ // For orthogonal routing, rebuild the path with proper right-angle bends
422
+ // The transformation can distort ELK's bend points, so we compute fresh bends
423
+ if (options.routingStyle === 'orthogonal') {
424
+ const start = allPoints[0];
425
+ const end = allPoints[allPoints.length - 1];
426
+ const dx = Math.abs(end.x - start.x);
427
+ const dy = Math.abs(end.y - start.y);
428
+
429
+ // Clear intermediate points and regenerate orthogonal path
430
+ allPoints.length = 0;
431
+ allPoints.push(start);
432
+
433
+ // If not aligned horizontally or vertically, insert bend points
434
+ if (dx > 1 && dy > 1) {
435
+ // Create a step pattern: horizontal → vertical → horizontal
436
+ const midX = (start.x + end.x) / 2;
437
+
438
+ // Two bend points for a proper step/channel pattern
439
+ allPoints.push({ x: midX, y: start.y });
440
+ allPoints.push({ x: midX, y: end.y });
441
+ }
442
+
443
+ allPoints.push(end);
444
+ }
445
+
371
446
  // Convert to path
372
447
  const path =
373
448
  options.routingStyle === 'orthogonal'