diff --git a/src/Workflow/__Libraries/StellaOps.Workflow.Renderer.Svg/WorkflowRenderSvgRenderer.cs b/src/Workflow/__Libraries/StellaOps.Workflow.Renderer.Svg/WorkflowRenderSvgRenderer.cs index 2cbfaf020..644d088e7 100644 --- a/src/Workflow/__Libraries/StellaOps.Workflow.Renderer.Svg/WorkflowRenderSvgRenderer.cs +++ b/src/Workflow/__Libraries/StellaOps.Workflow.Renderer.Svg/WorkflowRenderSvgRenderer.cs @@ -2038,27 +2038,35 @@ public sealed class WorkflowRenderSvgRenderer } // Remove tiny jog segments (< 8px) that create weird curves. - // These are routing artifacts from small boundary adjustments. - var cleaned = new List { points[0] }; - for (var i = 1; i < points.Count - 1; i++) + // When removing a jog, snap the next point to the previous point's + // axis so we get a clean L-shape instead of a diagonal. + var mutablePoints = points.ToList(); + var cleaned = new List { mutablePoints[0] }; + for (var i = 1; i < mutablePoints.Count; i++) { var prev = cleaned[^1]; - var curr = points[i]; - var next = points[i + 1]; + var curr = mutablePoints[i]; var dxIn = Math.Abs(curr.X - prev.X); var dyIn = Math.Abs(curr.Y - prev.Y); var segLen = dxIn + dyIn; - if (segLen < 8d && i < points.Count - 2) + if (segLen < 8d && i < mutablePoints.Count - 1) { - // Skip this tiny segment — connect prev directly to next + var next = mutablePoints[i + 1]; + if (dxIn < dyIn) + { + mutablePoints[i + 1] = new WorkflowRenderPoint { X = next.X, Y = prev.Y }; + } + else + { + mutablePoints[i + 1] = new WorkflowRenderPoint { X = prev.X, Y = next.Y }; + } + continue; } cleaned.Add(curr); } - cleaned.Add(points[^1]); - var builder = new StringBuilder(); var p0 = cleaned[0]; builder.Append($"M {Format(p0.X + offsetX)},{Format(p0.Y + offsetY)}");