diff --git a/cameleer3-server-app/src/main/java/com/cameleer3/server/app/diagram/ElkDiagramRenderer.java b/cameleer3-server-app/src/main/java/com/cameleer3/server/app/diagram/ElkDiagramRenderer.java index b3bec6ec..76b5067f 100644 --- a/cameleer3-server-app/src/main/java/com/cameleer3/server/app/diagram/ElkDiagramRenderer.java +++ b/cameleer3-server-app/src/main/java/com/cameleer3/server/app/diagram/ElkDiagramRenderer.java @@ -309,8 +309,22 @@ public class ElkDiagramRenderer implements DiagramRenderer { if (ctx.compoundNodeIds.contains(re.getSource()) && isDescendantOf(targetElk, sourceElk)) { continue; } - // Skip edges that cross ELK root boundaries - if (getElkRoot(sourceElk) != getElkRoot(targetElk)) continue; + // Skip edges that cross ELK root boundaries — but allow continuation + // edges that exit a compound (source inside compound, target outside) + if (getElkRoot(sourceElk) != getElkRoot(targetElk)) { + // Allow if source and target share the same grandparent (main root) + // i.e., one is inside a compound and the other is a sibling + ElkNode sourceRoot = getElkRoot(sourceElk); + ElkNode targetRoot = getElkRoot(targetElk); + boolean sameGrandparent = sourceRoot.getParent() != null + && targetRoot.getParent() != null + && sourceRoot.getParent() == targetRoot.getParent(); + boolean sourceExitsCompound = sourceRoot.getParent() != null + && targetRoot == sourceRoot.getParent(); + boolean targetExitsCompound = targetRoot.getParent() != null + && sourceRoot == targetRoot.getParent(); + if (!sameGrandparent && !sourceExitsCompound && !targetExitsCompound) continue; + } ElkEdge elkEdge = ctx.factory.createElkEdge(); elkEdge.setContainingNode(findCommonParent(sourceElk, targetElk));