diff --git a/ci/release/changelogs/next.md b/ci/release/changelogs/next.md
index 4cee2c279..af4479824 100644
--- a/ci/release/changelogs/next.md
+++ b/ci/release/changelogs/next.md
@@ -10,3 +10,6 @@
- `d2 fmt` only rewrites if it has changes, instead of always rewriting. [#470](https://github.com/terrastruct/d2/pull/470)
- Fixed an issue where text could overflow in sql_table shapes. [#458](https://github.com/terrastruct/d2/pull/458)
+- Fixed an issue with elk layouts accounting for edge labels as if they were placed on the side of the edge. [#483](https://github.com/terrastruct/d2/pull/483)
+- Fixed an issue where dagre layouts may not have enough spacing for all edge labels. [#484](https://github.com/terrastruct/d2/pull/484)
+- Fixed connections being clipped if they were at the very top or left edges of the diagram. [#493](https://github.com/terrastruct/d2/pull/493)
diff --git a/d2layouts/d2dagrelayout/layout.go b/d2layouts/d2dagrelayout/layout.go
index 3ae70e35a..68d8ec0f6 100644
--- a/d2layouts/d2dagrelayout/layout.go
+++ b/d2layouts/d2dagrelayout/layout.go
@@ -64,22 +64,35 @@ func Layout(ctx context.Context, g *d2graph.Graph) (err error) {
}
rootAttrs := dagreGraphAttrs{
- ranksep: 100,
edgesep: 40,
nodesep: 60,
}
+ isHorizontal := false
switch g.Root.Attributes.Direction.Value {
case "down":
rootAttrs.rankdir = "TB"
case "right":
rootAttrs.rankdir = "LR"
+ isHorizontal = true
case "left":
rootAttrs.rankdir = "RL"
+ isHorizontal = true
case "up":
rootAttrs.rankdir = "BT"
default:
rootAttrs.rankdir = "TB"
}
+
+ maxLabelSize := 0
+ for _, edge := range g.Edges {
+ size := edge.LabelDimensions.Width
+ if !isHorizontal {
+ size = edge.LabelDimensions.Height
+ }
+ maxLabelSize = go2.Max(maxLabelSize, size)
+ }
+ rootAttrs.ranksep = go2.Max(100, maxLabelSize+40)
+
configJS := setGraphAttrs(rootAttrs)
if _, err := vm.RunString(configJS); err != nil {
return err
diff --git a/d2layouts/d2elklayout/layout.go b/d2layouts/d2elklayout/layout.go
index fb364ceba..be40c6bff 100644
--- a/d2layouts/d2elklayout/layout.go
+++ b/d2layouts/d2elklayout/layout.go
@@ -43,11 +43,12 @@ type ELKNode struct {
}
type ELKLabel struct {
- Text string `json:"text"`
- X float64 `json:"x"`
- Y float64 `json:"y"`
- Width float64 `json:"width"`
- Height float64 `json:"height"`
+ Text string `json:"text"`
+ X float64 `json:"x"`
+ Y float64 `json:"y"`
+ Width float64 `json:"width"`
+ Height float64 `json:"height"`
+ LayoutOptions *ELKLayoutOptions `json:"layoutOptions,omitempty"`
}
type ELKPoint struct {
@@ -85,6 +86,7 @@ type ELKLayoutOptions struct {
EdgeNodeSpacing float64 `json:"spacing.edgeNodeBetweenLayers,omitempty"`
Direction string `json:"elk.direction"`
SelfLoopSpacing float64 `json:"elk.spacing.nodeSelfLoop"`
+ InlineEdgeLabels bool `json:"elk.edgeLabels.inline,omitempty"`
}
func Layout(ctx context.Context, g *d2graph.Graph) (err error) {
@@ -186,6 +188,9 @@ func Layout(ctx context.Context, g *d2graph.Graph) (err error) {
Text: edge.Attributes.Label.Value,
Width: float64(edge.LabelDimensions.Width),
Height: float64(edge.LabelDimensions.Height),
+ LayoutOptions: &ELKLayoutOptions{
+ InlineEdgeLabels: true,
+ },
})
}
elkGraph.Edges = append(elkGraph.Edges, e)
diff --git a/d2renderers/d2svg/d2svg.go b/d2renderers/d2svg/d2svg.go
index c90e66a7a..7bd081068 100644
--- a/d2renderers/d2svg/d2svg.go
+++ b/d2renderers/d2svg/d2svg.go
@@ -393,32 +393,6 @@ func drawConnection(writer io.Writer, labelMaskID string, connection d2target.Co
labelTL.Y = math.Round(labelTL.Y)
if label.Position(connection.LabelPosition).IsOnEdge() {
- strokeWidth := float64(connection.StrokeWidth)
- tl, br := geo.Route(connection.Route).GetBoundingBox()
- tl.X -= strokeWidth
- tl.Y -= strokeWidth
- br.X += strokeWidth
- br.Y += strokeWidth
- if connection.SrcArrow != d2target.NoArrowhead {
- width, height := arrowheadDimensions(connection.SrcArrow, strokeWidth)
- tl.X -= width
- tl.Y -= height
- br.X += width
- br.Y += height
- }
- if connection.DstArrow != d2target.NoArrowhead {
- width, height := arrowheadDimensions(connection.DstArrow, strokeWidth)
- tl.X -= width
- tl.Y -= height
- br.X += width
- br.Y += height
- }
-
- tl.X = math.Min(tl.X, labelTL.X)
- tl.Y = math.Min(tl.Y, labelTL.Y)
- br.X = math.Max(br.X, labelTL.X+float64(connection.LabelWidth))
- br.Y = math.Max(br.Y, labelTL.Y+float64(connection.LabelHeight))
-
labelMask = makeLabelMask(labelTL, connection.LabelWidth, connection.LabelHeight)
}
}
@@ -1093,12 +1067,11 @@ func Render(diagram *d2target.Diagram, opts *RenderOpts) ([]byte, error) {
// Note: we always want this since we reference it on connections even if there end up being no masked labels
fmt.Fprint(buf, strings.Join([]string{
- fmt.Sprintf(``,
- labelMaskID, w, h,
+ fmt.Sprintf(``,
+ labelMaskID, -pad, -pad, w, h,
),
- fmt.Sprintf(``,
- w,
- h,
+ fmt.Sprintf(``,
+ -pad, -pad, w, h,
),
strings.Join(labelMasks, "\n"),
``,
diff --git a/e2etests/regression_test.go b/e2etests/regression_test.go
index 7df5efff3..6498d9ef3 100644
--- a/e2etests/regression_test.go
+++ b/e2etests/regression_test.go
@@ -69,6 +69,108 @@ table_constrained: sql_table_constrained_overflow {
constraint: foreign_key
}
}
+`,
+ },
+ {
+ name: "elk_alignment",
+ script: `
+direction: down
+
+build_workflow: lambda-build.yaml {
+
+ push: Push to main branch {
+ style.font-size: 25
+ }
+
+ GHA: GitHub Actions {
+ style.font-size: 25
+ }
+
+ S3.style.font-size: 25
+ Terraform.style.font-size: 25
+ AWS.style.font-size: 25
+
+ push -> GHA: Triggers {
+ style.font-size: 20
+ }
+
+ GHA -> S3: Builds zip and pushes it {
+ style.font-size: 20
+ }
+
+ S3 <-> Terraform: Pulls zip to deploy {
+ style.font-size: 20
+ }
+
+ Terraform -> AWS: Changes live lambdas {
+ style.font-size: 20
+ }
+}
+
+deploy_workflow: lambda-deploy.yaml {
+
+ manual: Manual Trigger {
+ style.font-size: 25
+ }
+
+ GHA: GitHub Actions {
+ style.font-size: 25
+ }
+
+ AWS.style.font-size: 25
+
+ Manual -> GHA: Launches {
+ style.font-size: 20
+ }
+
+ GHA -> AWS: Builds zip\npushes them to S3.\n\nDeploys lambdas\nusing Terraform {
+ style.font-size: 20
+ }
+}
+
+apollo_workflow: apollo-deploy.yaml {
+
+ apollo: Apollo Repo {
+ style.font-size: 25
+ }
+
+ GHA: GitHub Actions {
+ style.font-size: 25
+ }
+
+ AWS.style.font-size: 25
+
+ apollo -> GHA: Triggered manually/push to master test test test test test test test {
+ style.font-size: 20
+ }
+
+ GHA -> AWS: test {
+ style.font-size: 20
+ }
+}
+`,
+ },
+ {
+ name: "dagre_edge_label_spacing",
+ script: `direction: right
+
+build_workflow: lambda-build.yaml {
+
+ push: Push to main branch {
+ style.font-size: 25
+ }
+ GHA: GitHub Actions {
+ style.font-size: 25
+ }
+ S3.style.font-size: 25
+ Terraform.style.font-size: 25
+ AWS.style.font-size: 25
+
+ push -> GHA: Triggers
+ GHA -> S3: Builds zip & pushes it
+ S3 <-> Terraform: Pulls zip to deploy
+ Terraform -> AWS: Changes the live lambdas
+}
`,
},
}
diff --git a/e2etests/testdata/regression/dagre_edge_label_spacing/dagre/board.exp.json b/e2etests/testdata/regression/dagre_edge_label_spacing/dagre/board.exp.json
new file mode 100644
index 000000000..50eca01cc
--- /dev/null
+++ b/e2etests/testdata/regression/dagre_edge_label_spacing/dagre/board.exp.json
@@ -0,0 +1,439 @@
+{
+ "name": "",
+ "shapes": [
+ {
+ "id": "build_workflow",
+ "type": "",
+ "pos": {
+ "x": 0,
+ "y": 0
+ },
+ "width": 2148,
+ "height": 237,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "#E3E9FD",
+ "stroke": "#0D32B2",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "lambda-build.yaml",
+ "fontSize": 28,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "#0A0F25",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 226,
+ "labelHeight": 41,
+ "labelPosition": "INSIDE_TOP_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "build_workflow.push",
+ "type": "",
+ "pos": {
+ "x": 105,
+ "y": 50
+ },
+ "width": 330,
+ "height": 137,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "#EDF0FD",
+ "stroke": "#0D32B2",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "Push to main branch",
+ "fontSize": 25,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "#0A0F25",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 230,
+ "labelHeight": 37,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 2
+ },
+ {
+ "id": "build_workflow.GHA",
+ "type": "",
+ "pos": {
+ "x": 644,
+ "y": 50
+ },
+ "width": 269,
+ "height": 137,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "#EDF0FD",
+ "stroke": "#0D32B2",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "GitHub Actions",
+ "fontSize": 25,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "#0A0F25",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 169,
+ "labelHeight": 37,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 2
+ },
+ {
+ "id": "build_workflow.S3",
+ "type": "",
+ "pos": {
+ "x": 1122,
+ "y": 50
+ },
+ "width": 131,
+ "height": 137,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "#EDF0FD",
+ "stroke": "#0D32B2",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "S3",
+ "fontSize": 25,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "#0A0F25",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 31,
+ "labelHeight": 37,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 2
+ },
+ {
+ "id": "build_workflow.Terraform",
+ "type": "",
+ "pos": {
+ "x": 1462,
+ "y": 50
+ },
+ "width": 218,
+ "height": 137,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "#EDF0FD",
+ "stroke": "#0D32B2",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "Terraform",
+ "fontSize": 25,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "#0A0F25",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 118,
+ "labelHeight": 37,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 2
+ },
+ {
+ "id": "build_workflow.AWS",
+ "type": "",
+ "pos": {
+ "x": 1889,
+ "y": 50
+ },
+ "width": 155,
+ "height": 137,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "#EDF0FD",
+ "stroke": "#0D32B2",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "AWS",
+ "fontSize": 25,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "#0A0F25",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 55,
+ "labelHeight": 37,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 2
+ }
+ ],
+ "connections": [
+ {
+ "id": "build_workflow.(push -> GHA)[0]",
+ "src": "build_workflow.push",
+ "srcArrow": "none",
+ "srcLabel": "",
+ "dst": "build_workflow.GHA",
+ "dstArrow": "triangle",
+ "dstLabel": "",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "#0D32B2",
+ "label": "Triggers",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "#676C7E",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 54,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 435.5,
+ "y": 118.5
+ },
+ {
+ "x": 518.3,
+ "y": 118.5
+ },
+ {
+ "x": 559.9,
+ "y": 118.5
+ },
+ {
+ "x": 643.5,
+ "y": 118.5
+ }
+ ],
+ "isCurve": true,
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "build_workflow.(GHA -> S3)[0]",
+ "src": "build_workflow.GHA",
+ "srcArrow": "none",
+ "srcLabel": "",
+ "dst": "build_workflow.S3",
+ "dstArrow": "triangle",
+ "dstLabel": "",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "#0D32B2",
+ "label": "Builds zip & pushes it",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "#676C7E",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 138,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 913.5,
+ "y": 118.5
+ },
+ {
+ "x": 996.3,
+ "y": 118.5
+ },
+ {
+ "x": 1037.9,
+ "y": 118.5
+ },
+ {
+ "x": 1121.5,
+ "y": 118.5
+ }
+ ],
+ "isCurve": true,
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "build_workflow.(S3 <-> Terraform)[0]",
+ "src": "build_workflow.S3",
+ "srcArrow": "triangle",
+ "srcLabel": "",
+ "dst": "build_workflow.Terraform",
+ "dstArrow": "triangle",
+ "dstLabel": "",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "#0D32B2",
+ "label": "Pulls zip to deploy",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "#676C7E",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 119,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 1253.5,
+ "y": 118.5
+ },
+ {
+ "x": 1336.3,
+ "y": 118.5
+ },
+ {
+ "x": 1377.9,
+ "y": 118.5
+ },
+ {
+ "x": 1461.5,
+ "y": 118.5
+ }
+ ],
+ "isCurve": true,
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "build_workflow.(Terraform -> AWS)[0]",
+ "src": "build_workflow.Terraform",
+ "srcArrow": "none",
+ "srcLabel": "",
+ "dst": "build_workflow.AWS",
+ "dstArrow": "triangle",
+ "dstLabel": "",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "#0D32B2",
+ "label": "Changes the live lambdas",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "#676C7E",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 169,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 1680.5,
+ "y": 118.5
+ },
+ {
+ "x": 1763.3,
+ "y": 118.5
+ },
+ {
+ "x": 1804.9,
+ "y": 118.5
+ },
+ {
+ "x": 1888.5,
+ "y": 118.5
+ }
+ ],
+ "isCurve": true,
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ }
+ ]
+}
diff --git a/e2etests/testdata/regression/dagre_edge_label_spacing/dagre/sketch.exp.svg b/e2etests/testdata/regression/dagre_edge_label_spacing/dagre/sketch.exp.svg
new file mode 100644
index 000000000..6da3ce848
--- /dev/null
+++ b/e2etests/testdata/regression/dagre_edge_label_spacing/dagre/sketch.exp.svg
@@ -0,0 +1,48 @@
+
+
\ No newline at end of file
diff --git a/e2etests/testdata/regression/dagre_edge_label_spacing/elk/board.exp.json b/e2etests/testdata/regression/dagre_edge_label_spacing/elk/board.exp.json
new file mode 100644
index 000000000..6ea04a102
--- /dev/null
+++ b/e2etests/testdata/regression/dagre_edge_label_spacing/elk/board.exp.json
@@ -0,0 +1,403 @@
+{
+ "name": "",
+ "shapes": [
+ {
+ "id": "build_workflow",
+ "type": "",
+ "pos": {
+ "x": 12,
+ "y": 12
+ },
+ "width": 1893,
+ "height": 287,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "#E3E9FD",
+ "stroke": "#0D32B2",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "lambda-build.yaml",
+ "fontSize": 28,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "#0A0F25",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 226,
+ "labelHeight": 41,
+ "labelPosition": "INSIDE_TOP_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "build_workflow.push",
+ "type": "",
+ "pos": {
+ "x": 87,
+ "y": 87
+ },
+ "width": 330,
+ "height": 137,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "#EDF0FD",
+ "stroke": "#0D32B2",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "Push to main branch",
+ "fontSize": 25,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "#0A0F25",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 230,
+ "labelHeight": 37,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 2
+ },
+ {
+ "id": "build_workflow.GHA",
+ "type": "",
+ "pos": {
+ "x": 511,
+ "y": 87
+ },
+ "width": 269,
+ "height": 137,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "#EDF0FD",
+ "stroke": "#0D32B2",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "GitHub Actions",
+ "fontSize": 25,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "#0A0F25",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 169,
+ "labelHeight": 37,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 2
+ },
+ {
+ "id": "build_workflow.S3",
+ "type": "",
+ "pos": {
+ "x": 958,
+ "y": 87
+ },
+ "width": 131,
+ "height": 137,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "#EDF0FD",
+ "stroke": "#0D32B2",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "S3",
+ "fontSize": 25,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "#0A0F25",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 31,
+ "labelHeight": 37,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 2
+ },
+ {
+ "id": "build_workflow.Terraform",
+ "type": "",
+ "pos": {
+ "x": 1248,
+ "y": 87
+ },
+ "width": 218,
+ "height": 137,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "#EDF0FD",
+ "stroke": "#0D32B2",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "Terraform",
+ "fontSize": 25,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "#0A0F25",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 118,
+ "labelHeight": 37,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 2
+ },
+ {
+ "id": "build_workflow.AWS",
+ "type": "",
+ "pos": {
+ "x": 1675,
+ "y": 87
+ },
+ "width": 155,
+ "height": 137,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "#EDF0FD",
+ "stroke": "#0D32B2",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "AWS",
+ "fontSize": 25,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "#0A0F25",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 55,
+ "labelHeight": 37,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 2
+ }
+ ],
+ "connections": [
+ {
+ "id": "build_workflow.(push -> GHA)[0]",
+ "src": "build_workflow.push",
+ "srcArrow": "none",
+ "srcLabel": "",
+ "dst": "build_workflow.GHA",
+ "dstArrow": "triangle",
+ "dstLabel": "",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "#0D32B2",
+ "label": "Triggers",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "#676C7E",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 54,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 417,
+ "y": 155.5
+ },
+ {
+ "x": 511,
+ "y": 155.5
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "build_workflow.(GHA -> S3)[0]",
+ "src": "build_workflow.GHA",
+ "srcArrow": "none",
+ "srcLabel": "",
+ "dst": "build_workflow.S3",
+ "dstArrow": "triangle",
+ "dstLabel": "",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "#0D32B2",
+ "label": "Builds zip & pushes it",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "#676C7E",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 138,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 780,
+ "y": 155.5
+ },
+ {
+ "x": 958,
+ "y": 155.5
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "build_workflow.(S3 <-> Terraform)[0]",
+ "src": "build_workflow.S3",
+ "srcArrow": "triangle",
+ "srcLabel": "",
+ "dst": "build_workflow.Terraform",
+ "dstArrow": "triangle",
+ "dstLabel": "",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "#0D32B2",
+ "label": "Pulls zip to deploy",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "#676C7E",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 119,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 1089,
+ "y": 155.5
+ },
+ {
+ "x": 1248,
+ "y": 155.5
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "build_workflow.(Terraform -> AWS)[0]",
+ "src": "build_workflow.Terraform",
+ "srcArrow": "none",
+ "srcLabel": "",
+ "dst": "build_workflow.AWS",
+ "dstArrow": "triangle",
+ "dstLabel": "",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "#0D32B2",
+ "label": "Changes the live lambdas",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "#676C7E",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 169,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 1466,
+ "y": 155.5
+ },
+ {
+ "x": 1675,
+ "y": 155.5
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ }
+ ]
+}
diff --git a/e2etests/testdata/regression/dagre_edge_label_spacing/elk/sketch.exp.svg b/e2etests/testdata/regression/dagre_edge_label_spacing/elk/sketch.exp.svg
new file mode 100644
index 000000000..814c60100
--- /dev/null
+++ b/e2etests/testdata/regression/dagre_edge_label_spacing/elk/sketch.exp.svg
@@ -0,0 +1,48 @@
+
+
\ No newline at end of file
diff --git a/e2etests/testdata/regression/dagre_special_ids/dagre/sketch.exp.svg b/e2etests/testdata/regression/dagre_special_ids/dagre/sketch.exp.svg
index f7a7922d5..d5d44ead7 100644
--- a/e2etests/testdata/regression/dagre_special_ids/dagre/sketch.exp.svg
+++ b/e2etests/testdata/regression/dagre_special_ids/dagre/sketch.exp.svg
@@ -18,8 +18,8 @@ width="1427" height="568" viewBox="-100 -100 1427 568">ninetynineeighty
eightseventy
sevena\yodetherea\"odea\node
-
+ninetynineeighty
eightseventy
sevena\yodetherea\"odea\node
+
ninetynineeighty
eightseventy
sevena\yodetherea\"odea\node
-
+ninetynineeighty
eightseventy
sevena\yodetherea\"odea\node
+
lambda-build.yamllambda-deploy.yamlapollo-deploy.yamlPush to main branchGitHub ActionsS3TerraformAWSManual TriggerGitHub ActionsAWSApollo RepoGitHub ActionsAWS TriggersBuilds zip and pushes it Pulls zip to deployChanges live lambdasLaunchesBuilds zippushes them to S3. Deploys lambdasusing TerraformTriggered manually/push to master test test test test test test testtest
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/e2etests/testdata/regression/elk_alignment/elk/board.exp.json b/e2etests/testdata/regression/elk_alignment/elk/board.exp.json
new file mode 100644
index 000000000..57c9b3ee5
--- /dev/null
+++ b/e2etests/testdata/regression/elk_alignment/elk/board.exp.json
@@ -0,0 +1,879 @@
+{
+ "name": "",
+ "shapes": [
+ {
+ "id": "build_workflow",
+ "type": "",
+ "pos": {
+ "x": 716,
+ "y": 12
+ },
+ "width": 480,
+ "height": 1099,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "#E3E9FD",
+ "stroke": "#0D32B2",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "lambda-build.yaml",
+ "fontSize": 28,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "#0A0F25",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 226,
+ "labelHeight": 41,
+ "labelPosition": "INSIDE_TOP_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "build_workflow.push",
+ "type": "",
+ "pos": {
+ "x": 791,
+ "y": 87
+ },
+ "width": 330,
+ "height": 137,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "#EDF0FD",
+ "stroke": "#0D32B2",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "Push to main branch",
+ "fontSize": 25,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "#0A0F25",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 230,
+ "labelHeight": 37,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 2
+ },
+ {
+ "id": "build_workflow.GHA",
+ "type": "",
+ "pos": {
+ "x": 822,
+ "y": 290
+ },
+ "width": 269,
+ "height": 137,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "#EDF0FD",
+ "stroke": "#0D32B2",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "GitHub Actions",
+ "fontSize": 25,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "#0A0F25",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 169,
+ "labelHeight": 37,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 2
+ },
+ {
+ "id": "build_workflow.S3",
+ "type": "",
+ "pos": {
+ "x": 891,
+ "y": 493
+ },
+ "width": 131,
+ "height": 137,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "#EDF0FD",
+ "stroke": "#0D32B2",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "S3",
+ "fontSize": 25,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "#0A0F25",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 31,
+ "labelHeight": 37,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 2
+ },
+ {
+ "id": "build_workflow.Terraform",
+ "type": "",
+ "pos": {
+ "x": 847,
+ "y": 696
+ },
+ "width": 218,
+ "height": 137,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "#EDF0FD",
+ "stroke": "#0D32B2",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "Terraform",
+ "fontSize": 25,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "#0A0F25",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 118,
+ "labelHeight": 37,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 2
+ },
+ {
+ "id": "build_workflow.AWS",
+ "type": "",
+ "pos": {
+ "x": 879,
+ "y": 899
+ },
+ "width": 155,
+ "height": 137,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "#EDF0FD",
+ "stroke": "#0D32B2",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "AWS",
+ "fontSize": 25,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "#0A0F25",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 55,
+ "labelHeight": 37,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 2
+ },
+ {
+ "id": "deploy_workflow",
+ "type": "",
+ "pos": {
+ "x": 1216,
+ "y": 175
+ },
+ "width": 421,
+ "height": 773,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "#E3E9FD",
+ "stroke": "#0D32B2",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "lambda-deploy.yaml",
+ "fontSize": 28,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "#0A0F25",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 247,
+ "labelHeight": 41,
+ "labelPosition": "INSIDE_TOP_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "deploy_workflow.manual",
+ "type": "",
+ "pos": {
+ "x": 1291,
+ "y": 250
+ },
+ "width": 271,
+ "height": 137,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "#EDF0FD",
+ "stroke": "#0D32B2",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "Manual Trigger",
+ "fontSize": 25,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "#0A0F25",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 171,
+ "labelHeight": 37,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 2
+ },
+ {
+ "id": "deploy_workflow.GHA",
+ "type": "",
+ "pos": {
+ "x": 1292,
+ "y": 453
+ },
+ "width": 269,
+ "height": 137,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "#EDF0FD",
+ "stroke": "#0D32B2",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "GitHub Actions",
+ "fontSize": 25,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "#0A0F25",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 169,
+ "labelHeight": 37,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 2
+ },
+ {
+ "id": "deploy_workflow.AWS",
+ "type": "",
+ "pos": {
+ "x": 1349,
+ "y": 736
+ },
+ "width": 155,
+ "height": 137,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "#EDF0FD",
+ "stroke": "#0D32B2",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "AWS",
+ "fontSize": 25,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "#0A0F25",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 55,
+ "labelHeight": 37,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 2
+ },
+ {
+ "id": "apollo_workflow",
+ "type": "",
+ "pos": {
+ "x": 12,
+ "y": 215
+ },
+ "width": 684,
+ "height": 693,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "#E3E9FD",
+ "stroke": "#0D32B2",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "apollo-deploy.yaml",
+ "fontSize": 28,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "#0A0F25",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 232,
+ "labelHeight": 41,
+ "labelPosition": "INSIDE_TOP_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "apollo_workflow.apollo",
+ "type": "",
+ "pos": {
+ "x": 235,
+ "y": 290
+ },
+ "width": 238,
+ "height": 137,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "#EDF0FD",
+ "stroke": "#0D32B2",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "Apollo Repo",
+ "fontSize": 25,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "#0A0F25",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 138,
+ "labelHeight": 37,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 2
+ },
+ {
+ "id": "apollo_workflow.GHA",
+ "type": "",
+ "pos": {
+ "x": 219,
+ "y": 493
+ },
+ "width": 269,
+ "height": 137,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "#EDF0FD",
+ "stroke": "#0D32B2",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "GitHub Actions",
+ "fontSize": 25,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "#0A0F25",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 169,
+ "labelHeight": 37,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 2
+ },
+ {
+ "id": "apollo_workflow.AWS",
+ "type": "",
+ "pos": {
+ "x": 276,
+ "y": 696
+ },
+ "width": 155,
+ "height": 137,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "#EDF0FD",
+ "stroke": "#0D32B2",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "AWS",
+ "fontSize": 25,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "#0A0F25",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 55,
+ "labelHeight": 37,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 2
+ }
+ ],
+ "connections": [
+ {
+ "id": "build_workflow.(push -> GHA)[0]",
+ "src": "build_workflow.push",
+ "srcArrow": "none",
+ "srcLabel": "",
+ "dst": "build_workflow.GHA",
+ "dstArrow": "triangle",
+ "dstLabel": "",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "#0D32B2",
+ "label": "Triggers",
+ "fontSize": 20,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "#676C7E",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 67,
+ "labelHeight": 26,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 956,
+ "y": 224
+ },
+ {
+ "x": 956,
+ "y": 290
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "build_workflow.(GHA -> S3)[0]",
+ "src": "build_workflow.GHA",
+ "srcArrow": "none",
+ "srcLabel": "",
+ "dst": "build_workflow.S3",
+ "dstArrow": "triangle",
+ "dstLabel": "",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "#0D32B2",
+ "label": "Builds zip and pushes it",
+ "fontSize": 20,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "#676C7E",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 192,
+ "labelHeight": 26,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 956,
+ "y": 427
+ },
+ {
+ "x": 956,
+ "y": 493
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "build_workflow.(S3 <-> Terraform)[0]",
+ "src": "build_workflow.S3",
+ "srcArrow": "triangle",
+ "srcLabel": "",
+ "dst": "build_workflow.Terraform",
+ "dstArrow": "triangle",
+ "dstLabel": "",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "#0D32B2",
+ "label": "Pulls zip to deploy",
+ "fontSize": 20,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "#676C7E",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 149,
+ "labelHeight": 26,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 956,
+ "y": 630
+ },
+ {
+ "x": 956,
+ "y": 696
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "build_workflow.(Terraform -> AWS)[0]",
+ "src": "build_workflow.Terraform",
+ "srcArrow": "none",
+ "srcLabel": "",
+ "dst": "build_workflow.AWS",
+ "dstArrow": "triangle",
+ "dstLabel": "",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "#0D32B2",
+ "label": "Changes live lambdas",
+ "fontSize": 20,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "#676C7E",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 179,
+ "labelHeight": 26,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 956,
+ "y": 833
+ },
+ {
+ "x": 956,
+ "y": 899
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "deploy_workflow.(manual -> GHA)[0]",
+ "src": "deploy_workflow.manual",
+ "srcArrow": "none",
+ "srcLabel": "",
+ "dst": "deploy_workflow.GHA",
+ "dstArrow": "triangle",
+ "dstLabel": "",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "#0D32B2",
+ "label": "Launches",
+ "fontSize": 20,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "#676C7E",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 78,
+ "labelHeight": 26,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 1426.5,
+ "y": 387
+ },
+ {
+ "x": 1426.5,
+ "y": 453
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "deploy_workflow.(GHA -> AWS)[0]",
+ "src": "deploy_workflow.GHA",
+ "srcArrow": "none",
+ "srcLabel": "",
+ "dst": "deploy_workflow.AWS",
+ "dstArrow": "triangle",
+ "dstLabel": "",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "#0D32B2",
+ "label": "Builds zip\npushes them to S3.\n\nDeploys lambdas\nusing Terraform",
+ "fontSize": 20,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "#676C7E",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 153,
+ "labelHeight": 106,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 1426.5,
+ "y": 590
+ },
+ {
+ "x": 1426.5,
+ "y": 736
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "apollo_workflow.(apollo -> GHA)[0]",
+ "src": "apollo_workflow.apollo",
+ "srcArrow": "none",
+ "srcLabel": "",
+ "dst": "apollo_workflow.GHA",
+ "dstArrow": "triangle",
+ "dstLabel": "",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "#0D32B2",
+ "label": "Triggered manually/push to master test test test test test test test",
+ "fontSize": 20,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "#676C7E",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 533,
+ "labelHeight": 26,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 353.5,
+ "y": 427
+ },
+ {
+ "x": 353.5,
+ "y": 493
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "apollo_workflow.(GHA -> AWS)[0]",
+ "src": "apollo_workflow.GHA",
+ "srcArrow": "none",
+ "srcLabel": "",
+ "dst": "apollo_workflow.AWS",
+ "dstArrow": "triangle",
+ "dstLabel": "",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "#0D32B2",
+ "label": "test",
+ "fontSize": 20,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "#676C7E",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 31,
+ "labelHeight": 26,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 353.5,
+ "y": 630
+ },
+ {
+ "x": 353.5,
+ "y": 696
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ }
+ ]
+}
diff --git a/e2etests/testdata/regression/elk_alignment/elk/sketch.exp.svg b/e2etests/testdata/regression/elk_alignment/elk/sketch.exp.svg
new file mode 100644
index 000000000..487f8dc2a
--- /dev/null
+++ b/e2etests/testdata/regression/elk_alignment/elk/sketch.exp.svg
@@ -0,0 +1,52 @@
+
+
\ No newline at end of file
diff --git a/e2etests/testdata/regression/empty_sequence/dagre/sketch.exp.svg b/e2etests/testdata/regression/empty_sequence/dagre/sketch.exp.svg
index 47c42c577..192e116cb 100644
--- a/e2etests/testdata/regression/empty_sequence/dagre/sketch.exp.svg
+++ b/e2etests/testdata/regression/empty_sequence/dagre/sketch.exp.svg
@@ -18,8 +18,8 @@ width="366" height="552" viewBox="-100 -100 366 552">hellogoodbye
-
+hellogoodbye
+
hellogoodbye
-
+hellogoodbye
+
foofoobarabcd
-
+foofoobarabcd
+
foofoobarabcd
-
+foofoobarabcd
+
AB
-
+AB
+
AB
-
+AB
+
b
-
+b
+
b
-
+b
+
abc
-
+abc
+
abc
-
+abc
+
ab
-
+ab
+
ab
-
+ab
+
acbd
-
+acbd
+
acbd
-
+acbd
+
ab hello
-
+ab hello
+
ab hello
-
+ab hello
+
-
+
+
\ No newline at end of file
diff --git a/e2etests/testdata/sanity/empty/elk/sketch.exp.svg b/e2etests/testdata/sanity/empty/elk/sketch.exp.svg
index 20d55bdc1..243722dc6 100644
--- a/e2etests/testdata/sanity/empty/elk/sketch.exp.svg
+++ b/e2etests/testdata/sanity/empty/elk/sketch.exp.svg
@@ -18,7 +18,7 @@ width="200" height="200" viewBox="-100 -100 200 200">
-
+
+
\ No newline at end of file
diff --git a/e2etests/testdata/stable/all_shapes/dagre/sketch.exp.svg b/e2etests/testdata/stable/all_shapes/dagre/sketch.exp.svg
index 095790f60..0ff95d243 100644
--- a/e2etests/testdata/stable/all_shapes/dagre/sketch.exp.svg
+++ b/e2etests/testdata/stable/all_shapes/dagre/sketch.exp.svg
@@ -18,8 +18,8 @@ width="1539" height="824" viewBox="-100 -100 1539 824">rectanglesquarepageparallelogramdocumentcylinderqueuepackagestepcalloutstored_datapersondiamondovalcirclehexagoncloud
-
+rectanglesquarepageparallelogramdocumentcylinderqueuepackagestepcalloutstored_datapersondiamondovalcirclehexagoncloud
+
rectanglesquarepageparallelogramdocumentcylinderqueuepackagestepcalloutstored_datapersondiamondovalcirclehexagoncloud
-
+rectanglesquarepageparallelogramdocumentcylinderqueuepackagestepcalloutstored_datapersondiamondovalcirclehexagoncloud
+
rectanglesquarepageparallelogramdocumentcylinderqueuepackagestepcalloutstored_datapersondiamondovalcirclehexagoncloud
-
+rectanglesquarepageparallelogramdocumentcylinderqueuepackagestepcalloutstored_datapersondiamondovalcirclehexagoncloud
+
rectanglesquarepageparallelogramdocumentcylinderqueuepackagestepcalloutstored_datapersondiamondovalcirclehexagoncloud
-
+rectanglesquarepageparallelogramdocumentcylinderqueuepackagestepcalloutstored_datapersondiamondovalcirclehexagoncloud
+
cba *
-
+cba *
+
cba *
-
+cba *
+
ab To err is human, to moo bovine1*
-
+ab To err is human, to moo bovine1*
+
ab To err is human, to moo bovine1*
-
-
+ab To err is human, to moo bovine1*
+
+
abcdefghijklmno
-
+abcdefghijklmno
+
abcdefghijklmno
-
+abcdefghijklmno
+
aaadddeeebbbccc111 222
-
+aaadddeeebbbccc111 222
+
aaadddeeebbbccc111 222
-
+aaadddeeebbbccc111 222
+
aabbllmmoocciikkddhhjjff1122 334455667788
-
+ff1122 334455667788
+
diff --git a/e2etests/testdata/stable/chaos2/elk/board.exp.json b/e2etests/testdata/stable/chaos2/elk/board.exp.json
index 71ec18ffd..b89ab998b 100644
--- a/e2etests/testdata/stable/chaos2/elk/board.exp.json
+++ b/e2etests/testdata/stable/chaos2/elk/board.exp.json
@@ -9,7 +9,7 @@
"x": 12,
"y": 12
},
- "width": 892,
+ "width": 880,
"height": 1707,
"opacity": 1,
"strokeDash": 0,
@@ -46,7 +46,7 @@
"id": "aa.bb",
"type": "",
"pos": {
- "x": 144,
+ "x": 132,
"y": 445
},
"width": 685,
@@ -86,7 +86,7 @@
"id": "aa.bb.cc",
"type": "",
"pos": {
- "x": 290,
+ "x": 278,
"y": 841
},
"width": 464,
@@ -126,7 +126,7 @@
"id": "aa.bb.cc.dd",
"type": "rectangle",
"pos": {
- "x": 376,
+ "x": 364,
"y": 916
},
"width": 303,
@@ -166,7 +166,7 @@
"id": "aa.bb.cc.dd.ee",
"type": "text",
"pos": {
- "x": 588,
+ "x": 576,
"y": 1093
},
"width": 16,
@@ -205,7 +205,7 @@
"id": "aa.bb.cc.dd.ff",
"type": "",
"pos": {
- "x": 451,
+ "x": 439,
"y": 991
},
"width": 117,
@@ -245,7 +245,7 @@
"id": "aa.bb.cc.gg",
"type": "text",
"pos": {
- "x": 585,
+ "x": 573,
"y": 1258
},
"width": 17,
@@ -284,7 +284,7 @@
"id": "aa.bb.cc.hh",
"type": "",
"pos": {
- "x": 532,
+ "x": 520,
"y": 1343
},
"width": 123,
@@ -324,7 +324,7 @@
"id": "aa.bb.ii",
"type": "package",
"pos": {
- "x": 376,
+ "x": 364,
"y": 520
},
"width": 265,
@@ -364,7 +364,7 @@
"id": "aa.bb.ii.jj",
"type": "diamond",
"pos": {
- "x": 451,
+ "x": 439,
"y": 595
},
"width": 115,
@@ -404,7 +404,7 @@
"id": "aa.bb.kk",
"type": "oval",
"pos": {
- "x": 219,
+ "x": 207,
"y": 595
},
"width": 126,
@@ -444,7 +444,7 @@
"id": "aa.ll",
"type": "",
"pos": {
- "x": 357,
+ "x": 355,
"y": 233
},
"width": 114,
@@ -484,7 +484,7 @@
"id": "aa.mm",
"type": "cylinder",
"pos": {
- "x": 462,
+ "x": 446,
"y": 87
},
"width": 131,
@@ -524,7 +524,7 @@
"id": "aa.nn",
"type": "text",
"pos": {
- "x": 424,
+ "x": 408,
"y": 138
},
"width": 18,
@@ -563,7 +563,7 @@
"id": "aa.oo",
"type": "",
"pos": {
- "x": 613,
+ "x": 597,
"y": 87
},
"width": 123,
@@ -627,11 +627,11 @@
"labelPercentage": 0,
"route": [
{
- "x": 596,
+ "x": 584,
"y": 1117
},
{
- "x": 596,
+ "x": 584,
"y": 1258
}
],
@@ -666,11 +666,11 @@
"labelPercentage": 0,
"route": [
{
- "x": 593.1666666666666,
+ "x": 581.1666666666666,
"y": 1282
},
{
- "x": 593.1666666666666,
+ "x": 581.1666666666666,
"y": 1343
}
],
@@ -705,19 +705,19 @@
"labelPercentage": 0,
"route": [
{
- "x": 553,
+ "x": 541,
"y": 796
},
{
- "x": 552.6666666666666,
+ "x": 540.6666666666666,
"y": 816
},
{
- "x": 451,
+ "x": 439,
"y": 816
},
{
- "x": 451,
+ "x": 439.00000000000006,
"y": 916
}
],
@@ -752,19 +752,19 @@
"labelPercentage": 0,
"route": [
{
- "x": 424.9000000000001,
+ "x": 422.9000000000001,
"y": 359
},
{
- "x": 424.9000000000001,
+ "x": 422.9000000000001,
"y": 420
},
{
- "x": 345.00000000000006,
+ "x": 333.00000000000006,
"y": 420
},
{
- "x": 345.00000000000006,
+ "x": 333.00000000000006,
"y": 445
}
],
@@ -799,27 +799,27 @@
"labelPercentage": 0,
"route": [
{
- "x": 567,
+ "x": 551,
"y": 209
},
{
- "x": 566.5,
+ "x": 550.5,
"y": 420
},
{
- "x": 651,
+ "x": 639,
"y": 420
},
{
- "x": 651,
+ "x": 639,
"y": 826
},
{
- "x": 461.00000000000006,
+ "x": 449.00000000000006,
"y": 826
},
{
- "x": 461.00000000000006,
+ "x": 449.00000000000006,
"y": 841
}
],
@@ -854,19 +854,19 @@
"labelPercentage": 0,
"route": [
{
- "x": 488,
+ "x": 472,
"y": 209
},
{
- "x": 487.90000000000003,
+ "x": 471.90000000000003,
"y": 223
},
{
- "x": 413.50000000000006,
+ "x": 411.50000000000006,
"y": 223
},
{
- "x": 413.50000000000006,
+ "x": 411.50000000000006,
"y": 233
}
],
@@ -901,27 +901,27 @@
"labelPercentage": 0,
"route": [
{
- "x": 540,
+ "x": 524,
"y": 213
},
{
- "x": 540.3000000000001,
+ "x": 524.3000000000001,
"y": 223
},
{
- "x": 537.5,
+ "x": 523.5,
"y": 223
},
{
- "x": 537.5,
+ "x": 523.5,
"y": 420
},
{
- "x": 518.5,
+ "x": 506.50000000000006,
"y": 420
},
{
- "x": 518.5,
+ "x": 506.50000000000006,
"y": 445
}
],
@@ -956,27 +956,27 @@
"labelPercentage": 0,
"route": [
{
- "x": 447.70000000000005,
+ "x": 445.70000000000005,
"y": 359
},
{
- "x": 447.70000000000005,
+ "x": 445.70000000000005,
"y": 430
},
{
- "x": 365.00000000000006,
+ "x": 353.00000000000006,
"y": 430
},
{
- "x": 365.00000000000006,
+ "x": 353.00000000000006,
"y": 1248
},
{
- "x": 590.3333333333334,
+ "x": 578.3333333333334,
"y": 1248
},
{
- "x": 590.3333333333334,
+ "x": 578.3333333333334,
"y": 1258
}
],
@@ -1011,19 +1011,19 @@
"labelPercentage": 0,
"route": [
{
- "x": 514,
+ "x": 498,
"y": 213
},
{
- "x": 514.1,
+ "x": 498.1,
"y": 223
},
{
- "x": 508.50000000000006,
+ "x": 496.50000000000006,
"y": 223
},
{
- "x": 509,
+ "x": 497,
"y": 575
}
],
@@ -1058,27 +1058,27 @@
"labelPercentage": 0,
"route": [
{
- "x": 461.00000000000006,
+ "x": 449,
"y": 1544
},
{
- "x": 461.0000000000001,
+ "x": 449.0000000000001,
"y": 1644
},
{
- "x": 105.00000000000006,
+ "x": 95.00000000000011,
"y": 1644
},
{
- "x": 105.00000000000006,
+ "x": 95.00000000000011,
"y": 369
},
{
- "x": 379.3000000000001,
+ "x": 377.3000000000001,
"y": 369
},
{
- "x": 379.3000000000001,
+ "x": 377.3000000000001,
"y": 359
}
],
@@ -1113,35 +1113,35 @@
"labelPercentage": 0,
"route": [
{
- "x": 464,
+ "x": 452,
"y": 796
},
{
- "x": 464.33333333333337,
+ "x": 452.3333333333333,
"y": 806
},
{
- "x": 279.00000000000006,
+ "x": 267,
"y": 806
},
{
- "x": 279.0000000000001,
+ "x": 267.0000000000001,
"y": 1634
},
{
- "x": 134.0000000000001,
+ "x": 122.00000000000011,
"y": 1634
},
{
- "x": 134.0000000000001,
+ "x": 122.00000000000011,
"y": 379
},
{
- "x": 402.10000000000014,
+ "x": 400.10000000000014,
"y": 379
},
{
- "x": 402.10000000000014,
+ "x": 400.10000000000014,
"y": 359
}
],
diff --git a/e2etests/testdata/stable/chaos2/elk/sketch.exp.svg b/e2etests/testdata/stable/chaos2/elk/sketch.exp.svg
index 96c477b53..69dc2c003 100644
--- a/e2etests/testdata/stable/chaos2/elk/sketch.exp.svg
+++ b/e2etests/testdata/stable/chaos2/elk/sketch.exp.svg
@@ -2,7 +2,7 @@
Code
Unlike a pre-formatted code block, a code span indicates code within a
normal paragraph. For example:
-ab
-
+ab
+
hello
-
+hello
+
hello
-
+hello
+
ab
-
+ab
+
ab
-
+ab
+
aabbccddllffwwyyadnniijjkkssuurmeemmmmgghhzzooppqqrrttvvxxabac 123456
-
+aabbccddllffwwyyadnniijjkkssuurmeemmmmgghhzzooppqqrrttvvxxabac 123456
+
diff --git a/e2etests/testdata/stable/investigate/elk/board.exp.json b/e2etests/testdata/stable/investigate/elk/board.exp.json
index 94ba1baf0..3d54d87bb 100644
--- a/e2etests/testdata/stable/investigate/elk/board.exp.json
+++ b/e2etests/testdata/stable/investigate/elk/board.exp.json
@@ -6,7 +6,7 @@
"id": "aa",
"type": "step",
"pos": {
- "x": 435,
+ "x": 429,
"y": 12
},
"width": 122,
@@ -46,7 +46,7 @@
"id": "bb",
"type": "step",
"pos": {
- "x": 292,
+ "x": 286,
"y": 238
},
"width": 123,
@@ -86,7 +86,7 @@
"id": "cc",
"type": "step",
"pos": {
- "x": 314,
+ "x": 307,
"y": 464
},
"width": 121,
@@ -126,7 +126,7 @@
"id": "dd",
"type": "",
"pos": {
- "x": 238,
+ "x": 231,
"y": 816
},
"width": 415,
@@ -166,7 +166,7 @@
"id": "dd.ee",
"type": "diamond",
"pos": {
- "x": 456,
+ "x": 449,
"y": 891
},
"width": 122,
@@ -206,7 +206,7 @@
"id": "ll",
"type": "",
"pos": {
- "x": 253,
+ "x": 246,
"y": 3120
},
"width": 425,
@@ -246,7 +246,7 @@
"id": "ll.mm",
"type": "oval",
"pos": {
- "x": 472,
+ "x": 465,
"y": 3195
},
"width": 131,
@@ -286,7 +286,7 @@
"id": "ff",
"type": "",
"pos": {
- "x": 254,
+ "x": 247,
"y": 2462
},
"width": 424,
@@ -326,7 +326,7 @@
"id": "ff.mm",
"type": "oval",
"pos": {
- "x": 472,
+ "x": 465,
"y": 2537
},
"width": 131,
@@ -366,7 +366,7 @@
"id": "ff.gg",
"type": "diamond",
"pos": {
- "x": 329,
+ "x": 322,
"y": 2539
},
"width": 123,
@@ -406,7 +406,7 @@
"id": "dd.hh",
"type": "diamond",
"pos": {
- "x": 313,
+ "x": 306,
"y": 891
},
"width": 123,
@@ -446,7 +446,7 @@
"id": "ww",
"type": "queue",
"pos": {
- "x": 127,
+ "x": 120,
"y": 2195
},
"width": 131,
@@ -497,7 +497,7 @@
"id": "yy",
"type": "",
"pos": {
- "x": 75,
+ "x": 68,
"y": 3657
},
"width": 273,
@@ -537,7 +537,7 @@
"id": "yy.zz",
"type": "queue",
"pos": {
- "x": 152,
+ "x": 145,
"y": 3732
},
"width": 120,
@@ -588,7 +588,7 @@
"id": "ad",
"type": "parallelogram",
"pos": {
- "x": 333,
+ "x": 327,
"y": 4606
},
"width": 123,
@@ -628,7 +628,7 @@
"id": "nn",
"type": "cylinder",
"pos": {
- "x": 117,
+ "x": 110,
"y": 4225
},
"width": 557,
@@ -668,7 +668,7 @@
"id": "ii",
"type": "",
"pos": {
- "x": 460,
+ "x": 453,
"y": 1197
},
"width": 114,
@@ -708,7 +708,7 @@
"id": "jj",
"type": "",
"pos": {
- "x": 459,
+ "x": 453,
"y": 1503
},
"width": 115,
@@ -748,7 +748,7 @@
"id": "kk",
"type": "",
"pos": {
- "x": 456,
+ "x": 449,
"y": 1914
},
"width": 122,
@@ -788,7 +788,7 @@
"id": "nn.oo",
"type": "",
"pos": {
- "x": 476,
+ "x": 469,
"y": 4300
},
"width": 123,
@@ -828,7 +828,7 @@
"id": "ff.pp",
"type": "",
"pos": {
- "x": 329,
+ "x": 322,
"y": 2688
},
"width": 123,
@@ -868,7 +868,7 @@
"id": "ll.qq",
"type": "",
"pos": {
- "x": 328,
+ "x": 321,
"y": 3198
},
"width": 124,
@@ -908,7 +908,7 @@
"id": "ll.rr",
"type": "",
"pos": {
- "x": 331,
+ "x": 324,
"y": 3346
},
"width": 118,
@@ -948,7 +948,7 @@
"id": "ss",
"type": "",
"pos": {
- "x": 37,
+ "x": 30,
"y": 1428
},
"width": 268,
@@ -988,7 +988,7 @@
"id": "ss.tt",
"type": "",
"pos": {
- "x": 112,
+ "x": 105,
"y": 1503
},
"width": 118,
@@ -1028,7 +1028,7 @@
"id": "uu",
"type": "",
"pos": {
- "x": 34,
+ "x": 28,
"y": 1814
},
"width": 273,
@@ -1068,7 +1068,7 @@
"id": "uu.vv",
"type": "",
"pos": {
- "x": 109,
+ "x": 103,
"y": 1889
},
"width": 123,
@@ -1108,7 +1108,7 @@
"id": "rm",
"type": "",
"pos": {
- "x": 109,
+ "x": 102,
"y": 3321
},
"width": 124,
@@ -1148,7 +1148,7 @@
"id": "nn.xx",
"type": "",
"pos": {
- "x": 192,
+ "x": 185,
"y": 4300
},
"width": 122,
@@ -1188,7 +1188,7 @@
"id": "yy.ab",
"type": "",
"pos": {
- "x": 150,
+ "x": 143,
"y": 3904
},
"width": 123,
@@ -1228,7 +1228,7 @@
"id": "nn.ac",
"type": "",
"pos": {
- "x": 334,
+ "x": 327,
"y": 4300
},
"width": 122,
@@ -1292,19 +1292,19 @@
"labelPercentage": 0,
"route": [
{
- "x": 476,
+ "x": 470,
"y": 138
},
{
- "x": 476,
+ "x": 469.5,
"y": 188
},
{
- "x": 353.66666666666663,
+ "x": 347.16666666666663,
"y": 188
},
{
- "x": 354,
+ "x": 347,
"y": 238
}
],
@@ -1339,11 +1339,11 @@
"labelPercentage": 0,
"route": [
{
- "x": 374,
+ "x": 368,
"y": 364
},
{
- "x": 374,
+ "x": 368,
"y": 464
}
],
@@ -1378,11 +1378,11 @@
"labelPercentage": 0,
"route": [
{
- "x": 517,
+ "x": 510,
"y": 138
},
{
- "x": 517,
+ "x": 510,
"y": 891
}
],
@@ -1417,28 +1417,28 @@
"labelPercentage": 0,
"route": [
{
- "x": 333,
+ "x": 327,
"y": 364
},
{
- "x": 333.16666666666663,
+ "x": 326.66666666666663,
"y": 414
},
{
- "x": 23,
+ "x": 16.5,
"y": 414
},
{
- "x": 23,
+ "x": 16.5,
"y": 2407
},
{
- "x": 369.5,
+ "x": 363,
"y": 2407
},
{
- "x": 369,
- "y": 2560
+ "x": 363,
+ "y": 2559
}
],
"animated": false,
@@ -1472,11 +1472,11 @@
"labelPercentage": 0,
"route": [
{
- "x": 374,
+ "x": 368,
"y": 590
},
{
- "x": 374,
+ "x": 368,
"y": 891
}
],
@@ -1511,11 +1511,11 @@
"labelPercentage": 0,
"route": [
{
- "x": 517,
+ "x": 510,
"y": 1017
},
{
- "x": 516.6666666666666,
+ "x": 510.16666666666663,
"y": 1197
}
],
@@ -1550,11 +1550,11 @@
"labelPercentage": 0,
"route": [
{
- "x": 516.6666666666666,
+ "x": 510.16666666666663,
"y": 1323
},
{
- "x": 516.6666666666666,
+ "x": 510.16666666666663,
"y": 1503
}
],
@@ -1589,11 +1589,11 @@
"labelPercentage": 0,
"route": [
{
- "x": 516.6666666666666,
+ "x": 510.16666666666663,
"y": 1629
},
{
- "x": 516.6666666666666,
+ "x": 510.16666666666663,
"y": 1914
}
],
@@ -1628,11 +1628,11 @@
"labelPercentage": 0,
"route": [
{
- "x": 537,
+ "x": 530.5,
"y": 2040
},
{
- "x": 537,
+ "x": 531,
"y": 2537
}
],
@@ -1667,11 +1667,11 @@
"labelPercentage": 0,
"route": [
{
- "x": 537,
+ "x": 531,
"y": 2668
},
{
- "x": 537,
+ "x": 531,
"y": 3195
}
],
@@ -1706,11 +1706,11 @@
"labelPercentage": 0,
"route": [
{
- "x": 537,
+ "x": 531,
"y": 3326
},
{
- "x": 537,
+ "x": 530.5,
"y": 4300
}
],
@@ -1745,11 +1745,11 @@
"labelPercentage": 0,
"route": [
{
- "x": 391,
+ "x": 384,
"y": 2665
},
{
- "x": 390.5,
+ "x": 383.5,
"y": 2688
}
],
@@ -1784,19 +1784,19 @@
"labelPercentage": 0,
"route": [
{
- "x": 390,
+ "x": 383.5,
"y": 2814
},
{
- "x": 390,
+ "x": 383.5,
"y": 2944
},
{
- "x": 389.5,
+ "x": 383,
"y": 2944
},
{
- "x": 389.5,
+ "x": 383,
"y": 3197.5
}
],
@@ -1831,11 +1831,11 @@
"labelPercentage": 0,
"route": [
{
- "x": 390,
+ "x": 383,
"y": 3323.5
},
{
- "x": 390,
+ "x": 383,
"y": 3346
}
],
@@ -1870,19 +1870,19 @@
"labelPercentage": 0,
"route": [
{
- "x": 374,
+ "x": 368,
"y": 1017
},
{
- "x": 374.16666666666663,
+ "x": 367.66666666666663,
"y": 1147
},
{
- "x": 170.49999999999997,
+ "x": 163.99999999999997,
"y": 1147
},
{
- "x": 170.49999999999997,
+ "x": 163.99999999999997,
"y": 1503
}
],
@@ -1917,11 +1917,11 @@
"labelPercentage": 0,
"route": [
{
- "x": 170.5,
+ "x": 164,
"y": 1629
},
{
- "x": 170.5,
+ "x": 164,
"y": 1889
}
],
@@ -1956,19 +1956,19 @@
"labelPercentage": 0,
"route": [
{
- "x": 496.3333333333333,
+ "x": 489.8333333333333,
"y": 2040
},
{
- "x": 496.3333333333333,
+ "x": 489.8333333333333,
"y": 2145
},
{
- "x": 214.16666666666669,
+ "x": 207.66666666666669,
"y": 2145
},
{
- "x": 214,
+ "x": 208,
"y": 2195
}
],
@@ -2003,11 +2003,11 @@
"labelPercentage": 0,
"route": [
{
- "x": 170.5,
+ "x": 164,
"y": 2015
},
{
- "x": 171,
+ "x": 164,
"y": 2195
}
],
@@ -2042,11 +2042,11 @@
"labelPercentage": 0,
"route": [
{
- "x": 170,
+ "x": 164,
"y": 2347
},
{
- "x": 170.5,
+ "x": 164,
"y": 3320.6666666666665
}
],
@@ -2081,27 +2081,27 @@
"labelPercentage": 0,
"route": [
{
- "x": 149.83333333333331,
+ "x": 143.33333333333331,
"y": 3446.6666666666665
},
{
- "x": 149.83333333333331,
+ "x": 143.33333333333331,
"y": 3602
},
{
- "x": 63.666666666666664,
+ "x": 57.166666666666664,
"y": 3602
},
{
- "x": 63.666666666666664,
+ "x": 57.166666666666664,
"y": 4170
},
{
- "x": 252.5,
+ "x": 246,
"y": 4170
},
{
- "x": 252.5,
+ "x": 246,
"y": 4300
}
],
@@ -2136,19 +2136,19 @@
"labelPercentage": 0,
"route": [
{
- "x": 389.5,
+ "x": 383,
"y": 3472
},
{
- "x": 389.5,
+ "x": 383,
"y": 3602
},
{
- "x": 231.16666666666666,
+ "x": 224.66666666666666,
"y": 3602
},
{
- "x": 231,
+ "x": 225,
"y": 3732
}
],
@@ -2183,11 +2183,11 @@
"labelPercentage": 0,
"route": [
{
- "x": 191.16666666666666,
+ "x": 184.66666666666666,
"y": 3446.6666666666665
},
{
- "x": 191,
+ "x": 185,
"y": 3732
}
],
@@ -2222,11 +2222,11 @@
"labelPercentage": 0,
"route": [
{
- "x": 211,
+ "x": 204,
"y": 3884
},
{
- "x": 211.5,
+ "x": 204.5,
"y": 3904
}
],
@@ -2261,19 +2261,19 @@
"labelPercentage": 0,
"route": [
{
- "x": 211.16666666666666,
+ "x": 204.66666666666666,
"y": 4030
},
{
- "x": 211.16666666666666,
+ "x": 204.66666666666666,
"y": 4160
},
{
- "x": 394.5,
+ "x": 388,
"y": 4160
},
{
- "x": 394.5,
+ "x": 388,
"y": 4300
}
],
@@ -2308,11 +2308,11 @@
"labelPercentage": 0,
"route": [
{
- "x": 394.5,
+ "x": 388,
"y": 4426
},
{
- "x": 395,
+ "x": 388,
"y": 4606
}
],
@@ -2347,20 +2347,20 @@
"labelPercentage": 0,
"route": [
{
- "x": 214,
+ "x": 208,
"y": 2347
},
{
- "x": 214.16666666666669,
+ "x": 207.66666666666669,
"y": 2397
},
{
- "x": 410.5,
+ "x": 404,
"y": 2397
},
{
- "x": 411,
- "y": 2558
+ "x": 404,
+ "y": 2559
}
],
"animated": false,
diff --git a/e2etests/testdata/stable/investigate/elk/sketch.exp.svg b/e2etests/testdata/stable/investigate/elk/sketch.exp.svg
index bf4e54b9b..65a4e7714 100644
--- a/e2etests/testdata/stable/investigate/elk/sketch.exp.svg
+++ b/e2etests/testdata/stable/investigate/elk/sketch.exp.svg
@@ -2,7 +2,7 @@