diff --git a/ci/release/changelogs/next.md b/ci/release/changelogs/next.md
index 9a8c1e422..9c413894a 100644
--- a/ci/release/changelogs/next.md
+++ b/ci/release/changelogs/next.md
@@ -1,6 +1,7 @@
#### Features 🚀
- UTF-16 files are automatically detected and supported [#1525](https://github.com/terrastruct/d2/pull/1525)
+- Grid diagrams can now have simple edges between cells [#1586](https://github.com/terrastruct/d2/pull/1586)
#### Improvements 🧹
diff --git a/d2compiler/compile.go b/d2compiler/compile.go
index 6b40777e4..88db84d7e 100644
--- a/d2compiler/compile.go
+++ b/d2compiler/compile.go
@@ -1072,13 +1072,33 @@ func (c *compiler) validateNear(g *d2graph.Graph) {
func (c *compiler) validateEdges(g *d2graph.Graph) {
for _, edge := range g.Edges {
- if gd := edge.Src.Parent.ClosestGridDiagram(); gd != nil {
- c.errorf(edge.GetAstEdge(), "edges in grid diagrams are not supported yet")
- continue
- }
- if gd := edge.Dst.Parent.ClosestGridDiagram(); gd != nil {
- c.errorf(edge.GetAstEdge(), "edges in grid diagrams are not supported yet")
- continue
+ srcGrid := edge.Src.Parent.ClosestGridDiagram()
+ dstGrid := edge.Dst.Parent.ClosestGridDiagram()
+ if srcGrid != nil || dstGrid != nil {
+ if top := srcGrid.TopGridDiagram(); srcGrid != top {
+ // valid: grid.child1 -> grid.child2
+ // invalid: grid.childGrid.child1 -> grid.childGrid.child2
+ c.errorf(edge.GetAstEdge(), "edge must be on direct child of grid diagram %#v", top.AbsID())
+ continue
+ }
+ if top := dstGrid.TopGridDiagram(); dstGrid != top {
+ // valid: grid.child1 -> grid.child2
+ // invalid: grid.childGrid.child1 -> grid.childGrid.child2
+ c.errorf(edge.GetAstEdge(), "edge must be on direct child of grid diagram %#v", top.AbsID())
+ continue
+ }
+ if srcGrid != dstGrid {
+ // valid: a -> grid
+ // invalid: a -> grid.child
+ c.errorf(edge.GetAstEdge(), "edges into grid diagrams are not supported yet")
+ continue
+ }
+ if srcGrid != edge.Src.Parent || dstGrid != edge.Dst.Parent {
+ // valid: grid.child1 -> grid.child2
+ // invalid: grid.child1 -> grid.child2.child1
+ c.errorf(edge.GetAstEdge(), "grid diagrams can only have edges between children right now")
+ continue
+ }
}
}
}
diff --git a/d2compiler/compile_test.go b/d2compiler/compile_test.go
index 15c966eab..a8788e95e 100644
--- a/d2compiler/compile_test.go
+++ b/d2compiler/compile_test.go
@@ -2476,16 +2476,34 @@ d2/testdata/d2compiler/TestCompile/grid_gap_negative.d2:3:16: vertical-gap must
name: "grid_edge",
text: `hey: {
grid-rows: 1
- a -> b
+ a -> b: ok
}
c -> hey.b
hey.a -> c
+ hey -> hey.a
hey -> c: ok
`,
- expErr: `d2/testdata/d2compiler/TestCompile/grid_edge.d2:3:2: edges in grid diagrams are not supported yet
-d2/testdata/d2compiler/TestCompile/grid_edge.d2:5:2: edges in grid diagrams are not supported yet
-d2/testdata/d2compiler/TestCompile/grid_edge.d2:6:2: edges in grid diagrams are not supported yet`,
+ expErr: `d2/testdata/d2compiler/TestCompile/grid_edge.d2:5:2: edges into grid diagrams are not supported yet
+d2/testdata/d2compiler/TestCompile/grid_edge.d2:6:2: edges into grid diagrams are not supported yet
+d2/testdata/d2compiler/TestCompile/grid_edge.d2:7:2: edges into grid diagrams are not supported yet`,
+ },
+ {
+ name: "grid_deeper_edge",
+ text: `hey: {
+ grid-rows: 1
+ a -> b: ok
+ b: {
+ c -> d: not yet
+ }
+ a: {
+ grid-columns: 1
+ e -> f: also not yet
+ }
+}
+`,
+ expErr: `d2/testdata/d2compiler/TestCompile/grid_deeper_edge.d2:9:3: edge must be on direct child of grid diagram "hey"
+d2/testdata/d2compiler/TestCompile/grid_deeper_edge.d2:5:3: grid diagrams can only have edges between children right now`,
},
{
name: "grid_nested",
diff --git a/d2graph/d2graph.go b/d2graph/d2graph.go
index df9d12a9a..1452cf4bc 100644
--- a/d2graph/d2graph.go
+++ b/d2graph/d2graph.go
@@ -1169,6 +1169,13 @@ func (e *Edge) Text() *d2target.MText {
}
}
+func (e *Edge) Move(dx, dy float64) {
+ for _, p := range e.Route {
+ p.X += dx
+ p.Y += dy
+ }
+}
+
func (e *Edge) AbsID() string {
srcIDA := e.Src.AbsIDArray()
dstIDA := e.Dst.AbsIDArray()
diff --git a/d2graph/grid_diagram.go b/d2graph/grid_diagram.go
index b6968e8d4..62659df59 100644
--- a/d2graph/grid_diagram.go
+++ b/d2graph/grid_diagram.go
@@ -14,3 +14,22 @@ func (obj *Object) ClosestGridDiagram() *Object {
}
return obj.Parent.ClosestGridDiagram()
}
+
+// TopGridDiagram returns the least nested (outermost) grid diagram
+func (obj *Object) TopGridDiagram() *Object {
+ if obj == nil {
+ return nil
+ }
+ var gd *Object
+ if obj.IsGridDiagram() {
+ gd = obj
+ }
+ curr := obj.Parent
+ for curr != nil {
+ if curr.IsGridDiagram() {
+ gd = curr
+ }
+ curr = curr.Parent
+ }
+ return gd
+}
diff --git a/d2graph/layout.go b/d2graph/layout.go
index 51b3206b9..9f2702df7 100644
--- a/d2graph/layout.go
+++ b/d2graph/layout.go
@@ -60,7 +60,7 @@ func (g *Graph) ExtractAsNestedGraph(obj *Object) *Graph {
func pluckObjAndEdges(g *Graph, obj *Object) (descendantsObjects []*Object, edges []*Edge) {
for i := 0; i < len(g.Edges); i++ {
edge := g.Edges[i]
- if edge.Src == obj || edge.Dst == obj {
+ if edge.Src.IsDescendantOf(obj) && edge.Dst.IsDescendantOf(obj) {
edges = append(edges, edge)
g.Edges = append(g.Edges[:i], g.Edges[i+1:]...)
i--
@@ -69,15 +69,10 @@ func pluckObjAndEdges(g *Graph, obj *Object) (descendantsObjects []*Object, edge
for i := 0; i < len(g.Objects); i++ {
temp := g.Objects[i]
- if temp.AbsID() == obj.AbsID() {
- descendantsObjects = append(descendantsObjects, obj)
+ if temp.IsDescendantOf(obj) {
+ descendantsObjects = append(descendantsObjects, temp)
g.Objects = append(g.Objects[:i], g.Objects[i+1:]...)
- for _, child := range obj.ChildrenArray {
- subObjects, subEdges := pluckObjAndEdges(g, child)
- descendantsObjects = append(descendantsObjects, subObjects...)
- edges = append(edges, subEdges...)
- }
- break
+ i--
}
}
@@ -86,7 +81,12 @@ func pluckObjAndEdges(g *Graph, obj *Object) (descendantsObjects []*Object, edge
func (g *Graph) InjectNestedGraph(tempGraph *Graph, parent *Object) {
obj := tempGraph.Root.ChildrenArray[0]
- obj.MoveWithDescendantsTo(0, 0)
+ dx := 0 - obj.TopLeft.X
+ dy := 0 - obj.TopLeft.Y
+ obj.MoveWithDescendants(dx, dy)
+ for _, e := range tempGraph.Edges {
+ e.Move(dx, dy)
+ }
obj.Parent = parent
for _, obj := range tempGraph.Objects {
obj.Graph = g
diff --git a/d2layouts/d2grid/grid_diagram.go b/d2layouts/d2grid/grid_diagram.go
index bb02ca94b..cc56e82de 100644
--- a/d2layouts/d2grid/grid_diagram.go
+++ b/d2layouts/d2grid/grid_diagram.go
@@ -11,6 +11,7 @@ import (
type gridDiagram struct {
root *d2graph.Object
objects []*d2graph.Object
+ edges []*d2graph.Edge
rows int
columns int
@@ -107,6 +108,9 @@ func (gd *gridDiagram) shift(dx, dy float64) {
for _, obj := range gd.objects {
obj.MoveWithDescendants(dx, dy)
}
+ for _, e := range gd.edges {
+ e.Move(dx, dy)
+ }
}
func (gd *gridDiagram) cleanup(obj *d2graph.Object, graph *d2graph.Graph) {
@@ -122,4 +126,5 @@ func (gd *gridDiagram) cleanup(obj *d2graph.Object, graph *d2graph.Graph) {
restore(obj, child)
child.IterDescendants(restore)
}
+ graph.Edges = append(graph.Edges, gd.edges...)
}
diff --git a/d2layouts/d2grid/layout.go b/d2layouts/d2grid/layout.go
index 3e5e1d104..5e8d0125f 100644
--- a/d2layouts/d2grid/layout.go
+++ b/d2layouts/d2grid/layout.go
@@ -31,7 +31,7 @@ const (
// 7. Put grid children back in correct location
func Layout(ctx context.Context, g *d2graph.Graph, layout d2graph.LayoutGraph) d2graph.LayoutGraph {
return func(ctx context.Context, g *d2graph.Graph) error {
- gridDiagrams, objectOrder, err := withoutGridDiagrams(ctx, g, layout)
+ gridDiagrams, objectOrder, edgeOrder, err := withoutGridDiagrams(ctx, g, layout)
if err != nil {
return err
}
@@ -42,19 +42,24 @@ func Layout(ctx context.Context, g *d2graph.Graph, layout d2graph.LayoutGraph) d
return err
}
- cleanup(g, gridDiagrams, objectOrder)
+ cleanup(g, gridDiagrams, objectOrder, edgeOrder)
return nil
}
}
-func withoutGridDiagrams(ctx context.Context, g *d2graph.Graph, layout d2graph.LayoutGraph) (gridDiagrams map[string]*gridDiagram, objectOrder map[string]int, err error) {
+func withoutGridDiagrams(ctx context.Context, g *d2graph.Graph, layout d2graph.LayoutGraph) (gridDiagrams map[string]*gridDiagram, objectOrder, edgeOrder map[string]int, err error) {
toRemove := make(map[*d2graph.Object]struct{})
+ edgeToRemove := make(map[*d2graph.Edge]struct{})
gridDiagrams = make(map[string]*gridDiagram)
objectOrder = make(map[string]int)
for i, obj := range g.Objects {
objectOrder[obj.AbsID()] = i
}
+ edgeOrder = make(map[string]int)
+ for i, edge := range g.Edges {
+ edgeOrder[edge.AbsID()] = i
+ }
var processGrid func(obj *d2graph.Object) error
processGrid = func(obj *d2graph.Object) error {
@@ -79,6 +84,9 @@ func withoutGridDiagrams(ctx context.Context, g *d2graph.Graph, layout d2graph.L
sort.SliceStable(obj.ChildrenArray, func(i, j int) bool {
return objectOrder[obj.ChildrenArray[i].AbsID()] < objectOrder[obj.ChildrenArray[j].AbsID()]
})
+ sort.SliceStable(g.Edges, func(i, j int) bool {
+ return edgeOrder[g.Edges[i].AbsID()] < edgeOrder[g.Edges[j].AbsID()]
+ })
for _, o := range tempGraph.Objects {
toRemove[o] = struct{}{}
@@ -200,6 +208,28 @@ func withoutGridDiagrams(ctx context.Context, g *d2graph.Graph, layout d2graph.L
for _, o := range gd.objects {
toRemove[o] = struct{}{}
}
+
+ // simple straight line edge routing between grid objects
+ for i, e := range g.Edges {
+ edgeOrder[e.AbsID()] = i
+ if !e.Src.Parent.IsDescendantOf(obj) && !e.Dst.Parent.IsDescendantOf(obj) {
+ continue
+ }
+ // if edge is within grid, remove it from outer layout
+ gd.edges = append(gd.edges, e)
+ edgeToRemove[e] = struct{}{}
+
+ if e.Src.Parent != obj || e.Dst.Parent != obj {
+ continue
+ }
+ // if edge is grid child, use simple routing
+ e.Route = []*geo.Point{e.Src.Center(), e.Dst.Center()}
+ e.TraceToShape(e.Route, 0, 1)
+ if e.Label.Value != "" {
+ e.LabelPosition = go2.Pointer(string(label.InsideMiddleCenter))
+ }
+ }
+
return nil
}
@@ -218,7 +248,7 @@ func withoutGridDiagrams(ctx context.Context, g *d2graph.Graph, layout d2graph.L
}
if err := processGrid(obj); err != nil {
- return nil, nil, err
+ return nil, nil, nil, err
}
}
}
@@ -230,8 +260,15 @@ func withoutGridDiagrams(ctx context.Context, g *d2graph.Graph, layout d2graph.L
}
}
g.Objects = layoutObjects
+ layoutEdges := make([]*d2graph.Edge, 0, len(edgeToRemove))
+ for _, e := range g.Edges {
+ if _, exists := edgeToRemove[e]; !exists {
+ layoutEdges = append(layoutEdges, e)
+ }
+ }
+ g.Edges = layoutEdges
- return gridDiagrams, objectOrder, nil
+ return gridDiagrams, objectOrder, edgeOrder, nil
}
func layoutGrid(g *d2graph.Graph, obj *d2graph.Object) (*gridDiagram, error) {
@@ -940,11 +977,14 @@ func getDistToTarget(layout [][]*d2graph.Object, targetSize float64, horizontalG
// - translating the grid to its position placed by the core layout engine
// - restore the children of the grid
// - sorts objects to their original graph order
-func cleanup(graph *d2graph.Graph, gridDiagrams map[string]*gridDiagram, objectsOrder map[string]int) {
+func cleanup(graph *d2graph.Graph, gridDiagrams map[string]*gridDiagram, objectsOrder, edgeOrder map[string]int) {
defer func() {
sort.SliceStable(graph.Objects, func(i, j int) bool {
return objectsOrder[graph.Objects[i].AbsID()] < objectsOrder[graph.Objects[j].AbsID()]
})
+ sort.SliceStable(graph.Edges, func(i, j int) bool {
+ return edgeOrder[graph.Edges[i].AbsID()] < edgeOrder[graph.Edges[j].AbsID()]
+ })
}()
var restore func(obj *d2graph.Object)
diff --git a/e2etests/stable_test.go b/e2etests/stable_test.go
index ae6f36ac0..0e82cb2a6 100644
--- a/e2etests/stable_test.go
+++ b/e2etests/stable_test.go
@@ -2833,6 +2833,8 @@ y: profits {
loadFromFile(t, "overlapping_child_label"),
loadFromFile(t, "dagre_spacing"),
loadFromFile(t, "dagre_spacing_right"),
+ loadFromFile(t, "simple_grid_edges"),
+ loadFromFile(t, "grid_nested_simple_edges"),
}
runa(t, tcs)
diff --git a/e2etests/testdata/files/grid_nested_simple_edges.d2 b/e2etests/testdata/files/grid_nested_simple_edges.d2
new file mode 100644
index 000000000..8148fffed
--- /dev/null
+++ b/e2etests/testdata/files/grid_nested_simple_edges.d2
@@ -0,0 +1,43 @@
+direction: right
+outer-grid -> outer-container
+
+outer-grid: {
+ grid-columns: 1
+
+ inner-grid -> container -> etc
+
+ container: {
+ label.near: top-left
+ # edges not yet supported here since they must be direct grid children
+ a
+ b
+ c
+ }
+
+ inner-grid: {
+ grid-rows: 1
+ 1
+ 2
+ 3
+ # edges here are not supported yet since this is inside another grid
+ }
+}
+
+outer-container: {
+ grid -> container
+
+ grid: {
+ grid-rows: 1
+ # direct child edges ok in least nested grid
+ 1 -> 2 -> 3
+ }
+
+ container: {
+ # non grid edges ok
+ 4 -> 5 -> 6
+ nested container: {
+ # nested non grid edges ok
+ 7 -> 8
+ }
+ }
+}
diff --git a/e2etests/testdata/files/simple_grid_edges.d2 b/e2etests/testdata/files/simple_grid_edges.d2
new file mode 100644
index 000000000..078dd4c32
--- /dev/null
+++ b/e2etests/testdata/files/simple_grid_edges.d2
@@ -0,0 +1,160 @@
+grid-rows: 4
+grid-columns: 5
+horizontal-gap: 20
+vertical-gap: 5
+
+*.class: [text; blue]
+
+0,0: {
+ label: "npm i -g\n@forge/cli"
+ style: {
+ fill: "#30304c"
+ stroke: transparent
+ font-color: white
+ font: mono
+ font-size: 10
+ bold: false
+ }
+}
+0,1: {
+ label: "Set up an\nAtlassian site"
+ class: [text; gray]
+}
+0,2.class: empty
+0,3: {
+ label: "View the hello\nworld app"
+ class: [text; gray]
+}
+0,4: forge\ntunnel
+
+1*.class: note
+1*.label: ""
+1,0
+1,1
+1,2
+1,3
+1,4
+
+2,0: forge\nlogin
+2,1: forge\ncreate
+2,2: forge\ndeploy
+2,3: forge\ninstall
+2,4: {
+ shape: diamond
+ label: "Hot reload\nchanges?"
+ class: [text; gray]
+}
+
+3*.class: note
+3,0: Step 1
+3,1: Step 2
+3,2: Step 3
+3,3: Step 4
+3,4: ""
+
+4,0: "" {
+ grid-rows: 3
+ grid-columns: 1
+ grid-gap: 0
+
+ class: []
+
+ style: {
+ fill: transparent
+ stroke: transparent
+ }
+
+ *.style: {
+ fill: transparent
+ stroke: transparent
+ font-color: "#30304c"
+ font-size: 10
+ bold: false
+ }
+ *.label.near: center-left
+ *.height: 20
+ a: ⬤ Forge CLI {
+ style.font-color: "#0033cc"
+ }
+
+ b: ⬤ Required {
+ style.font-color: "#30304c"
+ }
+ c: ⬤ Optional {
+ style.font-color: "#cecece"
+ }
+}
+4,1.class: empty
+4,2.class: empty
+4,3.class: empty
+4,4: forge\ndeploy
+
+0,0 -> 2,0 -> 2,1 -> 2,2 -> 2,3 -> 2,4: {
+ class: arrow
+}
+2,1 -> 0,1: {
+ class: arrow
+ style.stroke: "#cecece"
+}
+2,3 -> 0,3: {
+ class: arrow
+ style.stroke: "#cecece"
+}
+2,4 -> 0,4: Yes {
+ class: arrow
+ style.font-size: 10
+}
+2,4 -> 4,4: No {
+ class: arrow
+ style.font-size: 10
+}
+
+classes: {
+ text.style: {
+ stroke: transparent
+ font-color: white
+ font: mono
+ font-size: 10
+ bold: false
+ }
+ text: {
+ width: 100
+ height: 60
+ }
+ blue.style: {
+ fill: "#0033cc"
+ stroke: "#0033cc"
+ border-radius: 10
+ }
+ gray.style: {
+ fill: "#cecece"
+ stroke: "#cecece"
+ border-radius: 10
+ }
+ note: {
+ height: 30
+ label.near: top-center
+ style: {
+ font-size: 10
+ bold: false
+ fill: transparent
+ stroke: transparent
+ }
+ }
+ empty: {
+ label: ""
+ width: 50
+ height: 50
+ style: {
+ fill: transparent
+ stroke: transparent
+ }
+ }
+ arrow: {
+ target-arrowhead.shape: arrow
+ style: {
+ stroke: black
+ stroke-width: 2
+ }
+ }
+}
diff --git a/e2etests/testdata/stable/grid_nested_simple_edges/dagre/board.exp.json b/e2etests/testdata/stable/grid_nested_simple_edges/dagre/board.exp.json
new file mode 100644
index 000000000..c7cfb758d
--- /dev/null
+++ b/e2etests/testdata/stable/grid_nested_simple_edges/dagre/board.exp.json
@@ -0,0 +1,1338 @@
+{
+ "name": "",
+ "isFolderOnly": false,
+ "fontFamily": "SourceSansPro",
+ "shapes": [
+ {
+ "id": "outer-grid",
+ "type": "rectangle",
+ "pos": {
+ "x": 0,
+ "y": 0
+ },
+ "width": 478,
+ "height": 589,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "B4",
+ "stroke": "B1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "outer-grid",
+ "fontSize": 28,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 116,
+ "labelHeight": 36,
+ "labelPosition": "INSIDE_TOP_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "outer-container",
+ "type": "rectangle",
+ "pos": {
+ "x": 598,
+ "y": 218
+ },
+ "width": 1038,
+ "height": 459,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "B4",
+ "stroke": "B1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "outer-container",
+ "fontSize": 28,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 185,
+ "labelHeight": 36,
+ "labelPosition": "OUTSIDE_TOP_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "outer-grid.inner-grid",
+ "type": "rectangle",
+ "pos": {
+ "x": 60,
+ "y": 60
+ },
+ "width": 358,
+ "height": 186,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "B5",
+ "stroke": "B1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "inner-grid",
+ "fontSize": 24,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 98,
+ "labelHeight": 31,
+ "labelPosition": "INSIDE_TOP_CENTER",
+ "zIndex": 0,
+ "level": 2
+ },
+ {
+ "id": "outer-grid.container",
+ "type": "rectangle",
+ "pos": {
+ "x": 60,
+ "y": 286
+ },
+ "width": 358,
+ "height": 137,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "B5",
+ "stroke": "B1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "container",
+ "fontSize": 24,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 97,
+ "labelHeight": 31,
+ "labelPosition": "INSIDE_TOP_LEFT",
+ "zIndex": 0,
+ "level": 2
+ },
+ {
+ "id": "outer-grid.etc",
+ "type": "rectangle",
+ "pos": {
+ "x": 60,
+ "y": 463
+ },
+ "width": 358,
+ "height": 66,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "B5",
+ "stroke": "B1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "etc",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 23,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 2
+ },
+ {
+ "id": "outer-grid.container.a",
+ "type": "rectangle",
+ "pos": {
+ "x": 90,
+ "y": 327
+ },
+ "width": 53,
+ "height": 66,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "B6",
+ "stroke": "B1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "a",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 8,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 3
+ },
+ {
+ "id": "outer-grid.container.b",
+ "type": "rectangle",
+ "pos": {
+ "x": 203,
+ "y": 327
+ },
+ "width": 53,
+ "height": 66,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "B6",
+ "stroke": "B1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "b",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 8,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 3
+ },
+ {
+ "id": "outer-grid.container.c",
+ "type": "rectangle",
+ "pos": {
+ "x": 316,
+ "y": 327
+ },
+ "width": 53,
+ "height": 66,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "B6",
+ "stroke": "B1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "c",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 8,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 3
+ },
+ {
+ "id": "outer-grid.inner-grid.1",
+ "type": "rectangle",
+ "pos": {
+ "x": 120,
+ "y": 120
+ },
+ "width": 52,
+ "height": 66,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "B6",
+ "stroke": "B1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "1",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 7,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 3
+ },
+ {
+ "id": "outer-grid.inner-grid.2",
+ "type": "rectangle",
+ "pos": {
+ "x": 212,
+ "y": 120
+ },
+ "width": 53,
+ "height": 66,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "B6",
+ "stroke": "B1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "2",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 8,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 3
+ },
+ {
+ "id": "outer-grid.inner-grid.3",
+ "type": "rectangle",
+ "pos": {
+ "x": 305,
+ "y": 120
+ },
+ "width": 53,
+ "height": 66,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "B6",
+ "stroke": "B1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "3",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 8,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 3
+ },
+ {
+ "id": "outer-container.grid",
+ "type": "rectangle",
+ "pos": {
+ "x": 628,
+ "y": 248
+ },
+ "width": 358,
+ "height": 186,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "B5",
+ "stroke": "B1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "grid",
+ "fontSize": 24,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 38,
+ "labelHeight": 31,
+ "labelPosition": "INSIDE_TOP_CENTER",
+ "zIndex": 0,
+ "level": 2
+ },
+ {
+ "id": "outer-container.container",
+ "type": "rectangle",
+ "pos": {
+ "x": 1106,
+ "y": 319
+ },
+ "width": 500,
+ "height": 338,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "B5",
+ "stroke": "B1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "container",
+ "fontSize": 24,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 97,
+ "labelHeight": 31,
+ "labelPosition": "OUTSIDE_TOP_CENTER",
+ "zIndex": 0,
+ "level": 2
+ },
+ {
+ "id": "outer-container.grid.1",
+ "type": "rectangle",
+ "pos": {
+ "x": 688,
+ "y": 308
+ },
+ "width": 52,
+ "height": 66,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "B6",
+ "stroke": "B1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "1",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 7,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 3
+ },
+ {
+ "id": "outer-container.grid.2",
+ "type": "rectangle",
+ "pos": {
+ "x": 780,
+ "y": 308
+ },
+ "width": 53,
+ "height": 66,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "B6",
+ "stroke": "B1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "2",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 8,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 3
+ },
+ {
+ "id": "outer-container.grid.3",
+ "type": "rectangle",
+ "pos": {
+ "x": 873,
+ "y": 308
+ },
+ "width": 53,
+ "height": 66,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "B6",
+ "stroke": "B1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "3",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 8,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 3
+ },
+ {
+ "id": "outer-container.container.4",
+ "type": "rectangle",
+ "pos": {
+ "x": 1136,
+ "y": 349
+ },
+ "width": 54,
+ "height": 66,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "B6",
+ "stroke": "B1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "4",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 9,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 3
+ },
+ {
+ "id": "outer-container.container.5",
+ "type": "rectangle",
+ "pos": {
+ "x": 1340,
+ "y": 349
+ },
+ "width": 53,
+ "height": 66,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "B6",
+ "stroke": "B1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "5",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 8,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 3
+ },
+ {
+ "id": "outer-container.container.6",
+ "type": "rectangle",
+ "pos": {
+ "x": 1493,
+ "y": 349
+ },
+ "width": 53,
+ "height": 66,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "B6",
+ "stroke": "B1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "6",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 8,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 3
+ },
+ {
+ "id": "outer-container.container.nested container",
+ "type": "rectangle",
+ "pos": {
+ "x": 1310,
+ "y": 501
+ },
+ "width": 266,
+ "height": 126,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "B6",
+ "stroke": "B1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "nested container",
+ "fontSize": 20,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 141,
+ "labelHeight": 26,
+ "labelPosition": "OUTSIDE_TOP_CENTER",
+ "zIndex": 0,
+ "level": 3
+ },
+ {
+ "id": "outer-container.container.nested container.7",
+ "type": "rectangle",
+ "pos": {
+ "x": 1340,
+ "y": 531
+ },
+ "width": 53,
+ "height": 66,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "N7",
+ "stroke": "B1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "7",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 8,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 4
+ },
+ {
+ "id": "outer-container.container.nested container.8",
+ "type": "rectangle",
+ "pos": {
+ "x": 1493,
+ "y": 531
+ },
+ "width": 53,
+ "height": 66,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "N7",
+ "stroke": "B1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "8",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 8,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 4
+ }
+ ],
+ "connections": [
+ {
+ "id": "(outer-grid -> outer-container)[0]",
+ "src": "outer-grid",
+ "srcArrow": "none",
+ "dst": "outer-container",
+ "dstArrow": "triangle",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "B1",
+ "borderRadius": 10,
+ "label": "",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 478,
+ "y": 340.5
+ },
+ {
+ "x": 518,
+ "y": 340.5
+ },
+ {
+ "x": 542,
+ "y": 340.5
+ },
+ {
+ "x": 598,
+ "y": 340.5
+ }
+ ],
+ "isCurve": true,
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "outer-grid.(inner-grid -> container)[0]",
+ "src": "outer-grid.inner-grid",
+ "srcArrow": "none",
+ "dst": "outer-grid.container",
+ "dstArrow": "triangle",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "B1",
+ "borderRadius": 10,
+ "label": "",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 239,
+ "y": 245.5
+ },
+ {
+ "x": 239,
+ "y": 286.5
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "outer-grid.(container -> etc)[0]",
+ "src": "outer-grid.container",
+ "srcArrow": "none",
+ "dst": "outer-grid.etc",
+ "dstArrow": "triangle",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "B1",
+ "borderRadius": 10,
+ "label": "",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 239,
+ "y": 423
+ },
+ {
+ "x": 239,
+ "y": 463
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "outer-container.(grid -> container)[0]",
+ "src": "outer-container.grid",
+ "srcArrow": "none",
+ "dst": "outer-container.container",
+ "dstArrow": "triangle",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "B1",
+ "borderRadius": 10,
+ "label": "",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 986,
+ "y": 381.5
+ },
+ {
+ "x": 1026,
+ "y": 381.5
+ },
+ {
+ "x": 1050,
+ "y": 381.5
+ },
+ {
+ "x": 1106,
+ "y": 381.5
+ }
+ ],
+ "isCurve": true,
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "outer-container.grid.(1 -> 2)[0]",
+ "src": "outer-container.grid.1",
+ "srcArrow": "none",
+ "dst": "outer-container.grid.2",
+ "dstArrow": "triangle",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "B1",
+ "borderRadius": 10,
+ "label": "",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 739.5,
+ "y": 341
+ },
+ {
+ "x": 780.5,
+ "y": 341
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "outer-container.grid.(2 -> 3)[0]",
+ "src": "outer-container.grid.2",
+ "srcArrow": "none",
+ "dst": "outer-container.grid.3",
+ "dstArrow": "triangle",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "B1",
+ "borderRadius": 10,
+ "label": "",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 832.5,
+ "y": 341
+ },
+ {
+ "x": 873.5,
+ "y": 341
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "outer-container.container.(4 -> 5)[0]",
+ "src": "outer-container.container.4",
+ "srcArrow": "none",
+ "dst": "outer-container.container.5",
+ "dstArrow": "triangle",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "B1",
+ "borderRadius": 10,
+ "label": "",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 1190,
+ "y": 381.5
+ },
+ {
+ "x": 1230,
+ "y": 381.5
+ },
+ {
+ "x": 1300,
+ "y": 381.5
+ },
+ {
+ "x": 1340,
+ "y": 381.5
+ }
+ ],
+ "isCurve": true,
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "outer-container.container.(5 -> 6)[0]",
+ "src": "outer-container.container.5",
+ "srcArrow": "none",
+ "dst": "outer-container.container.6",
+ "dstArrow": "triangle",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "B1",
+ "borderRadius": 10,
+ "label": "",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 1393,
+ "y": 381.5
+ },
+ {
+ "x": 1433,
+ "y": 381.5
+ },
+ {
+ "x": 1453,
+ "y": 381.5
+ },
+ {
+ "x": 1493,
+ "y": 381.5
+ }
+ ],
+ "isCurve": true,
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "outer-container.container.nested container.(7 -> 8)[0]",
+ "src": "outer-container.container.nested container.7",
+ "srcArrow": "none",
+ "dst": "outer-container.container.nested container.8",
+ "dstArrow": "triangle",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "B1",
+ "borderRadius": 10,
+ "label": "",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 1393,
+ "y": 563.5
+ },
+ {
+ "x": 1433,
+ "y": 563.5
+ },
+ {
+ "x": 1453,
+ "y": 563.5
+ },
+ {
+ "x": 1493,
+ "y": 563.5
+ }
+ ],
+ "isCurve": true,
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ }
+ ],
+ "root": {
+ "id": "",
+ "type": "",
+ "pos": {
+ "x": 0,
+ "y": 0
+ },
+ "width": 0,
+ "height": 0,
+ "opacity": 0,
+ "strokeDash": 0,
+ "strokeWidth": 0,
+ "borderRadius": 0,
+ "fill": "N7",
+ "stroke": "",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "",
+ "fontSize": 0,
+ "fontFamily": "",
+ "language": "",
+ "color": "",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "zIndex": 0,
+ "level": 0
+ }
+}
diff --git a/e2etests/testdata/stable/grid_nested_simple_edges/dagre/sketch.exp.svg b/e2etests/testdata/stable/grid_nested_simple_edges/dagre/sketch.exp.svg
new file mode 100644
index 000000000..ab1c8b638
--- /dev/null
+++ b/e2etests/testdata/stable/grid_nested_simple_edges/dagre/sketch.exp.svg
@@ -0,0 +1,123 @@
+
\ No newline at end of file
diff --git a/e2etests/testdata/stable/grid_nested_simple_edges/elk/board.exp.json b/e2etests/testdata/stable/grid_nested_simple_edges/elk/board.exp.json
new file mode 100644
index 000000000..5e210cd4f
--- /dev/null
+++ b/e2etests/testdata/stable/grid_nested_simple_edges/elk/board.exp.json
@@ -0,0 +1,1293 @@
+{
+ "name": "",
+ "isFolderOnly": false,
+ "fontFamily": "SourceSansPro",
+ "shapes": [
+ {
+ "id": "outer-grid",
+ "type": "rectangle",
+ "pos": {
+ "x": 12,
+ "y": 12
+ },
+ "width": 478,
+ "height": 618,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "B4",
+ "stroke": "B1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "outer-grid",
+ "fontSize": 28,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 116,
+ "labelHeight": 36,
+ "labelPosition": "INSIDE_TOP_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "outer-container",
+ "type": "rectangle",
+ "pos": {
+ "x": 560,
+ "y": 95
+ },
+ "width": 1150,
+ "height": 452,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "B4",
+ "stroke": "B1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "outer-container",
+ "fontSize": 28,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 185,
+ "labelHeight": 36,
+ "labelPosition": "INSIDE_TOP_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "outer-grid.inner-grid",
+ "type": "rectangle",
+ "pos": {
+ "x": 72,
+ "y": 72
+ },
+ "width": 358,
+ "height": 186,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "B5",
+ "stroke": "B1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "inner-grid",
+ "fontSize": 24,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 98,
+ "labelHeight": 31,
+ "labelPosition": "INSIDE_TOP_CENTER",
+ "zIndex": 0,
+ "level": 2
+ },
+ {
+ "id": "outer-grid.container",
+ "type": "rectangle",
+ "pos": {
+ "x": 72,
+ "y": 298
+ },
+ "width": 358,
+ "height": 166,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "B5",
+ "stroke": "B1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "container",
+ "fontSize": 24,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 97,
+ "labelHeight": 31,
+ "labelPosition": "INSIDE_TOP_LEFT",
+ "zIndex": 0,
+ "level": 2
+ },
+ {
+ "id": "outer-grid.etc",
+ "type": "rectangle",
+ "pos": {
+ "x": 72,
+ "y": 504
+ },
+ "width": 358,
+ "height": 66,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "B5",
+ "stroke": "B1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "etc",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 23,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 2
+ },
+ {
+ "id": "outer-grid.container.a",
+ "type": "rectangle",
+ "pos": {
+ "x": 122,
+ "y": 348
+ },
+ "width": 53,
+ "height": 66,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "B6",
+ "stroke": "B1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "a",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 8,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 3
+ },
+ {
+ "id": "outer-grid.container.b",
+ "type": "rectangle",
+ "pos": {
+ "x": 195,
+ "y": 348
+ },
+ "width": 53,
+ "height": 66,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "B6",
+ "stroke": "B1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "b",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 8,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 3
+ },
+ {
+ "id": "outer-grid.container.c",
+ "type": "rectangle",
+ "pos": {
+ "x": 268,
+ "y": 348
+ },
+ "width": 53,
+ "height": 66,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "B6",
+ "stroke": "B1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "c",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 8,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 3
+ },
+ {
+ "id": "outer-grid.inner-grid.1",
+ "type": "rectangle",
+ "pos": {
+ "x": 132,
+ "y": 132
+ },
+ "width": 52,
+ "height": 66,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "B6",
+ "stroke": "B1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "1",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 7,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 3
+ },
+ {
+ "id": "outer-grid.inner-grid.2",
+ "type": "rectangle",
+ "pos": {
+ "x": 224,
+ "y": 132
+ },
+ "width": 53,
+ "height": 66,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "B6",
+ "stroke": "B1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "2",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 8,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 3
+ },
+ {
+ "id": "outer-grid.inner-grid.3",
+ "type": "rectangle",
+ "pos": {
+ "x": 317,
+ "y": 132
+ },
+ "width": 53,
+ "height": 66,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "B6",
+ "stroke": "B1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "3",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 8,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 3
+ },
+ {
+ "id": "outer-container.grid",
+ "type": "rectangle",
+ "pos": {
+ "x": 610,
+ "y": 228
+ },
+ "width": 358,
+ "height": 186,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "B5",
+ "stroke": "B1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "grid",
+ "fontSize": 24,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 38,
+ "labelHeight": 31,
+ "labelPosition": "INSIDE_TOP_CENTER",
+ "zIndex": 0,
+ "level": 2
+ },
+ {
+ "id": "outer-container.container",
+ "type": "rectangle",
+ "pos": {
+ "x": 1038,
+ "y": 145
+ },
+ "width": 622,
+ "height": 352,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "B5",
+ "stroke": "B1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "container",
+ "fontSize": 24,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 97,
+ "labelHeight": 31,
+ "labelPosition": "INSIDE_TOP_CENTER",
+ "zIndex": 0,
+ "level": 2
+ },
+ {
+ "id": "outer-container.grid.1",
+ "type": "rectangle",
+ "pos": {
+ "x": 670,
+ "y": 288
+ },
+ "width": 52,
+ "height": 66,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "B6",
+ "stroke": "B1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "1",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 7,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 3
+ },
+ {
+ "id": "outer-container.grid.2",
+ "type": "rectangle",
+ "pos": {
+ "x": 762,
+ "y": 288
+ },
+ "width": 53,
+ "height": 66,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "B6",
+ "stroke": "B1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "2",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 8,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 3
+ },
+ {
+ "id": "outer-container.grid.3",
+ "type": "rectangle",
+ "pos": {
+ "x": 855,
+ "y": 288
+ },
+ "width": 53,
+ "height": 66,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "B6",
+ "stroke": "B1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "3",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 8,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 3
+ },
+ {
+ "id": "outer-container.container.4",
+ "type": "rectangle",
+ "pos": {
+ "x": 1310,
+ "y": 195
+ },
+ "width": 54,
+ "height": 66,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "B6",
+ "stroke": "B1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "4",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 9,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 3
+ },
+ {
+ "id": "outer-container.container.5",
+ "type": "rectangle",
+ "pos": {
+ "x": 1434,
+ "y": 195
+ },
+ "width": 53,
+ "height": 66,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "B6",
+ "stroke": "B1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "5",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 8,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 3
+ },
+ {
+ "id": "outer-container.container.6",
+ "type": "rectangle",
+ "pos": {
+ "x": 1557,
+ "y": 195
+ },
+ "width": 53,
+ "height": 66,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "B6",
+ "stroke": "B1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "6",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 8,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 3
+ },
+ {
+ "id": "outer-container.container.nested container",
+ "type": "rectangle",
+ "pos": {
+ "x": 1088,
+ "y": 281
+ },
+ "width": 276,
+ "height": 166,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "B6",
+ "stroke": "B1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "nested container",
+ "fontSize": 20,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 141,
+ "labelHeight": 26,
+ "labelPosition": "INSIDE_TOP_CENTER",
+ "zIndex": 0,
+ "level": 3
+ },
+ {
+ "id": "outer-container.container.nested container.7",
+ "type": "rectangle",
+ "pos": {
+ "x": 1138,
+ "y": 331
+ },
+ "width": 53,
+ "height": 66,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "N7",
+ "stroke": "B1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "7",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 8,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 4
+ },
+ {
+ "id": "outer-container.container.nested container.8",
+ "type": "rectangle",
+ "pos": {
+ "x": 1261,
+ "y": 331
+ },
+ "width": 53,
+ "height": 66,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "N7",
+ "stroke": "B1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "8",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 8,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 4
+ }
+ ],
+ "connections": [
+ {
+ "id": "(outer-grid -> outer-container)[0]",
+ "src": "outer-grid",
+ "srcArrow": "none",
+ "dst": "outer-container",
+ "dstArrow": "triangle",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "B1",
+ "borderRadius": 10,
+ "label": "",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 490,
+ "y": 321
+ },
+ {
+ "x": 560,
+ "y": 321
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "outer-grid.(inner-grid -> container)[0]",
+ "src": "outer-grid.inner-grid",
+ "srcArrow": "none",
+ "dst": "outer-grid.container",
+ "dstArrow": "triangle",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "B1",
+ "borderRadius": 10,
+ "label": "",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 251,
+ "y": 258
+ },
+ {
+ "x": 251,
+ "y": 298
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "outer-grid.(container -> etc)[0]",
+ "src": "outer-grid.container",
+ "srcArrow": "none",
+ "dst": "outer-grid.etc",
+ "dstArrow": "triangle",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "B1",
+ "borderRadius": 10,
+ "label": "",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 251,
+ "y": 464
+ },
+ {
+ "x": 251,
+ "y": 504
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "outer-container.(grid -> container)[0]",
+ "src": "outer-container.grid",
+ "srcArrow": "none",
+ "dst": "outer-container.container",
+ "dstArrow": "triangle",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "B1",
+ "borderRadius": 10,
+ "label": "",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 968,
+ "y": 321
+ },
+ {
+ "x": 1038,
+ "y": 321
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "outer-container.grid.(1 -> 2)[0]",
+ "src": "outer-container.grid.1",
+ "srcArrow": "none",
+ "dst": "outer-container.grid.2",
+ "dstArrow": "triangle",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "B1",
+ "borderRadius": 10,
+ "label": "",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 721.5,
+ "y": 321
+ },
+ {
+ "x": 762.5,
+ "y": 321
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "outer-container.grid.(2 -> 3)[0]",
+ "src": "outer-container.grid.2",
+ "srcArrow": "none",
+ "dst": "outer-container.grid.3",
+ "dstArrow": "triangle",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "B1",
+ "borderRadius": 10,
+ "label": "",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 814.5,
+ "y": 321
+ },
+ {
+ "x": 855.5,
+ "y": 321
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "outer-container.container.(4 -> 5)[0]",
+ "src": "outer-container.container.4",
+ "srcArrow": "none",
+ "dst": "outer-container.container.5",
+ "dstArrow": "triangle",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "B1",
+ "borderRadius": 10,
+ "label": "",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 1364,
+ "y": 228
+ },
+ {
+ "x": 1434,
+ "y": 228
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "outer-container.container.(5 -> 6)[0]",
+ "src": "outer-container.container.5",
+ "srcArrow": "none",
+ "dst": "outer-container.container.6",
+ "dstArrow": "triangle",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "B1",
+ "borderRadius": 10,
+ "label": "",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 1487,
+ "y": 228
+ },
+ {
+ "x": 1557,
+ "y": 228
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "outer-container.container.nested container.(7 -> 8)[0]",
+ "src": "outer-container.container.nested container.7",
+ "srcArrow": "none",
+ "dst": "outer-container.container.nested container.8",
+ "dstArrow": "triangle",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "B1",
+ "borderRadius": 10,
+ "label": "",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 1191,
+ "y": 364
+ },
+ {
+ "x": 1261,
+ "y": 364
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ }
+ ],
+ "root": {
+ "id": "",
+ "type": "",
+ "pos": {
+ "x": 0,
+ "y": 0
+ },
+ "width": 0,
+ "height": 0,
+ "opacity": 0,
+ "strokeDash": 0,
+ "strokeWidth": 0,
+ "borderRadius": 0,
+ "fill": "N7",
+ "stroke": "",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "",
+ "fontSize": 0,
+ "fontFamily": "",
+ "language": "",
+ "color": "",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "zIndex": 0,
+ "level": 0
+ }
+}
diff --git a/e2etests/testdata/stable/grid_nested_simple_edges/elk/sketch.exp.svg b/e2etests/testdata/stable/grid_nested_simple_edges/elk/sketch.exp.svg
new file mode 100644
index 000000000..482ad3419
--- /dev/null
+++ b/e2etests/testdata/stable/grid_nested_simple_edges/elk/sketch.exp.svg
@@ -0,0 +1,123 @@
+outer-gridouter-containerinner-gridcontaineretcgridcontainerabc123123456nested container78
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/e2etests/testdata/stable/simple_grid_edges/dagre/board.exp.json b/e2etests/testdata/stable/simple_grid_edges/dagre/board.exp.json
new file mode 100644
index 000000000..f12983a4d
--- /dev/null
+++ b/e2etests/testdata/stable/simple_grid_edges/dagre/board.exp.json
@@ -0,0 +1,1648 @@
+{
+ "name": "",
+ "isFolderOnly": false,
+ "fontFamily": "SourceSansPro",
+ "shapes": [
+ {
+ "id": "0,0",
+ "type": "rectangle",
+ "classes": [
+ "text",
+ "blue"
+ ],
+ "pos": {
+ "x": 0,
+ "y": 0
+ },
+ "width": 100,
+ "height": 60,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 10,
+ "fill": "#30304c",
+ "stroke": "transparent",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "npm i -g\n@forge/cli",
+ "fontSize": 10,
+ "fontFamily": "mono",
+ "language": "",
+ "color": "white",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 59,
+ "labelHeight": 23,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "0,1",
+ "type": "rectangle",
+ "classes": [
+ "text",
+ "gray"
+ ],
+ "pos": {
+ "x": 120,
+ "y": 0
+ },
+ "width": 100,
+ "height": 60,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 10,
+ "fill": "#cecece",
+ "stroke": "#cecece",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "Set up an\nAtlassian site",
+ "fontSize": 10,
+ "fontFamily": "mono",
+ "language": "",
+ "color": "white",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 84,
+ "labelHeight": 23,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "0,2",
+ "type": "rectangle",
+ "classes": [
+ "empty"
+ ],
+ "pos": {
+ "x": 240,
+ "y": 0
+ },
+ "width": 100,
+ "height": 60,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "transparent",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "0,3",
+ "type": "rectangle",
+ "classes": [
+ "text",
+ "gray"
+ ],
+ "pos": {
+ "x": 360,
+ "y": 0
+ },
+ "width": 100,
+ "height": 60,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 10,
+ "fill": "#cecece",
+ "stroke": "#cecece",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "View the hello\nworld app",
+ "fontSize": 10,
+ "fontFamily": "mono",
+ "language": "",
+ "color": "white",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 84,
+ "labelHeight": 23,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "0,4",
+ "type": "rectangle",
+ "classes": [
+ "text",
+ "blue"
+ ],
+ "pos": {
+ "x": 480,
+ "y": 0
+ },
+ "width": 120,
+ "height": 60,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 10,
+ "fill": "#0033cc",
+ "stroke": "#0033cc",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "forge\ntunnel",
+ "fontSize": 10,
+ "fontFamily": "mono",
+ "language": "",
+ "color": "white",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 36,
+ "labelHeight": 23,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "1,0",
+ "type": "rectangle",
+ "classes": [
+ "note"
+ ],
+ "pos": {
+ "x": 0,
+ "y": 65
+ },
+ "width": 100,
+ "height": 30,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "transparent",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "",
+ "fontSize": 10,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "1,1",
+ "type": "rectangle",
+ "classes": [
+ "note"
+ ],
+ "pos": {
+ "x": 120,
+ "y": 65
+ },
+ "width": 100,
+ "height": 30,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "transparent",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "",
+ "fontSize": 10,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "1,2",
+ "type": "rectangle",
+ "classes": [
+ "note"
+ ],
+ "pos": {
+ "x": 240,
+ "y": 65
+ },
+ "width": 100,
+ "height": 30,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "transparent",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "",
+ "fontSize": 10,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "1,3",
+ "type": "rectangle",
+ "classes": [
+ "note"
+ ],
+ "pos": {
+ "x": 360,
+ "y": 65
+ },
+ "width": 100,
+ "height": 30,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "transparent",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "",
+ "fontSize": 10,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "1,4",
+ "type": "rectangle",
+ "classes": [
+ "note"
+ ],
+ "pos": {
+ "x": 480,
+ "y": 65
+ },
+ "width": 120,
+ "height": 30,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "transparent",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "",
+ "fontSize": 10,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "2,0",
+ "type": "rectangle",
+ "classes": [
+ "text",
+ "blue"
+ ],
+ "pos": {
+ "x": 0,
+ "y": 100
+ },
+ "width": 100,
+ "height": 60,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 10,
+ "fill": "#0033cc",
+ "stroke": "#0033cc",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "forge\nlogin",
+ "fontSize": 10,
+ "fontFamily": "mono",
+ "language": "",
+ "color": "white",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 30,
+ "labelHeight": 23,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "2,1",
+ "type": "rectangle",
+ "classes": [
+ "text",
+ "blue"
+ ],
+ "pos": {
+ "x": 120,
+ "y": 100
+ },
+ "width": 100,
+ "height": 60,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 10,
+ "fill": "#0033cc",
+ "stroke": "#0033cc",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "forge\ncreate",
+ "fontSize": 10,
+ "fontFamily": "mono",
+ "language": "",
+ "color": "white",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 36,
+ "labelHeight": 23,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "2,2",
+ "type": "rectangle",
+ "classes": [
+ "text",
+ "blue"
+ ],
+ "pos": {
+ "x": 240,
+ "y": 100
+ },
+ "width": 100,
+ "height": 60,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 10,
+ "fill": "#0033cc",
+ "stroke": "#0033cc",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "forge\ndeploy",
+ "fontSize": 10,
+ "fontFamily": "mono",
+ "language": "",
+ "color": "white",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 36,
+ "labelHeight": 23,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "2,3",
+ "type": "rectangle",
+ "classes": [
+ "text",
+ "blue"
+ ],
+ "pos": {
+ "x": 360,
+ "y": 100
+ },
+ "width": 100,
+ "height": 60,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 10,
+ "fill": "#0033cc",
+ "stroke": "#0033cc",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "forge\ninstall",
+ "fontSize": 10,
+ "fontFamily": "mono",
+ "language": "",
+ "color": "white",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 42,
+ "labelHeight": 23,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "2,4",
+ "type": "diamond",
+ "classes": [
+ "text",
+ "gray"
+ ],
+ "pos": {
+ "x": 480,
+ "y": 100
+ },
+ "width": 120,
+ "height": 60,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 10,
+ "fill": "#cecece",
+ "stroke": "#cecece",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "Hot reload\nchanges?",
+ "fontSize": 10,
+ "fontFamily": "mono",
+ "language": "",
+ "color": "white",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 60,
+ "labelHeight": 23,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "3,0",
+ "type": "rectangle",
+ "classes": [
+ "note"
+ ],
+ "pos": {
+ "x": 0,
+ "y": 165
+ },
+ "width": 100,
+ "height": 30,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "transparent",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "Step 1",
+ "fontSize": 10,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 28,
+ "labelHeight": 13,
+ "labelPosition": "INSIDE_TOP_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "3,1",
+ "type": "rectangle",
+ "classes": [
+ "note"
+ ],
+ "pos": {
+ "x": 120,
+ "y": 165
+ },
+ "width": 100,
+ "height": 30,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "transparent",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "Step 2",
+ "fontSize": 10,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 28,
+ "labelHeight": 13,
+ "labelPosition": "INSIDE_TOP_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "3,2",
+ "type": "rectangle",
+ "classes": [
+ "note"
+ ],
+ "pos": {
+ "x": 240,
+ "y": 165
+ },
+ "width": 100,
+ "height": 30,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "transparent",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "Step 3",
+ "fontSize": 10,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 28,
+ "labelHeight": 13,
+ "labelPosition": "INSIDE_TOP_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "3,3",
+ "type": "rectangle",
+ "classes": [
+ "note"
+ ],
+ "pos": {
+ "x": 360,
+ "y": 165
+ },
+ "width": 100,
+ "height": 30,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "transparent",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "Step 4",
+ "fontSize": 10,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 29,
+ "labelHeight": 13,
+ "labelPosition": "INSIDE_TOP_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "3,4",
+ "type": "rectangle",
+ "classes": [
+ "note"
+ ],
+ "pos": {
+ "x": 480,
+ "y": 165
+ },
+ "width": 120,
+ "height": 30,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "transparent",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "",
+ "fontSize": 10,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "4,0",
+ "type": "rectangle",
+ "pos": {
+ "x": 0,
+ "y": 200
+ },
+ "width": 100,
+ "height": 60,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "transparent",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "",
+ "fontSize": 28,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "INSIDE_TOP_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "4,0.a",
+ "type": "rectangle",
+ "pos": {
+ "x": 0,
+ "y": 200
+ },
+ "width": 91,
+ "height": 20,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "transparent",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "⬤ Forge CLI",
+ "fontSize": 10,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "#0033cc",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 51,
+ "labelHeight": 13,
+ "labelPosition": "INSIDE_MIDDLE_LEFT",
+ "zIndex": 0,
+ "level": 2
+ },
+ {
+ "id": "4,0.b",
+ "type": "rectangle",
+ "pos": {
+ "x": 0,
+ "y": 220
+ },
+ "width": 91,
+ "height": 20,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "transparent",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "⬤ Required",
+ "fontSize": 10,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "#30304c",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 50,
+ "labelHeight": 13,
+ "labelPosition": "INSIDE_MIDDLE_LEFT",
+ "zIndex": 0,
+ "level": 2
+ },
+ {
+ "id": "4,0.c",
+ "type": "rectangle",
+ "pos": {
+ "x": 0,
+ "y": 240
+ },
+ "width": 91,
+ "height": 20,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "transparent",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "⬤ Optional",
+ "fontSize": 10,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "#cecece",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 48,
+ "labelHeight": 13,
+ "labelPosition": "INSIDE_MIDDLE_LEFT",
+ "zIndex": 0,
+ "level": 2
+ },
+ {
+ "id": "4,1",
+ "type": "rectangle",
+ "classes": [
+ "empty"
+ ],
+ "pos": {
+ "x": 120,
+ "y": 200
+ },
+ "width": 100,
+ "height": 60,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "transparent",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "4,2",
+ "type": "rectangle",
+ "classes": [
+ "empty"
+ ],
+ "pos": {
+ "x": 240,
+ "y": 200
+ },
+ "width": 100,
+ "height": 60,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "transparent",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "4,3",
+ "type": "rectangle",
+ "classes": [
+ "empty"
+ ],
+ "pos": {
+ "x": 360,
+ "y": 200
+ },
+ "width": 100,
+ "height": 60,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "transparent",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "4,4",
+ "type": "rectangle",
+ "classes": [
+ "text",
+ "blue"
+ ],
+ "pos": {
+ "x": 480,
+ "y": 200
+ },
+ "width": 120,
+ "height": 60,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 10,
+ "fill": "#0033cc",
+ "stroke": "#0033cc",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "forge\ndeploy",
+ "fontSize": 10,
+ "fontFamily": "mono",
+ "language": "",
+ "color": "white",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 36,
+ "labelHeight": 23,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 1
+ }
+ ],
+ "connections": [
+ {
+ "id": "(0,0 -> 2,0)[0]",
+ "classes": [
+ "arrow"
+ ],
+ "src": "0,0",
+ "srcArrow": "none",
+ "dst": "2,0",
+ "dstArrow": "arrow",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "black",
+ "borderRadius": 10,
+ "label": "",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 50,
+ "y": 60
+ },
+ {
+ "x": 50,
+ "y": 100
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "(2,0 -> 2,1)[0]",
+ "classes": [
+ "arrow"
+ ],
+ "src": "2,0",
+ "srcArrow": "none",
+ "dst": "2,1",
+ "dstArrow": "arrow",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "black",
+ "borderRadius": 10,
+ "label": "",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 100,
+ "y": 130
+ },
+ {
+ "x": 120,
+ "y": 130
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "(2,1 -> 2,2)[0]",
+ "classes": [
+ "arrow"
+ ],
+ "src": "2,1",
+ "srcArrow": "none",
+ "dst": "2,2",
+ "dstArrow": "arrow",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "black",
+ "borderRadius": 10,
+ "label": "",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 220,
+ "y": 130
+ },
+ {
+ "x": 240,
+ "y": 130
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "(2,2 -> 2,3)[0]",
+ "classes": [
+ "arrow"
+ ],
+ "src": "2,2",
+ "srcArrow": "none",
+ "dst": "2,3",
+ "dstArrow": "arrow",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "black",
+ "borderRadius": 10,
+ "label": "",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 340,
+ "y": 130
+ },
+ {
+ "x": 360,
+ "y": 130
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "(2,3 -> 2,4)[0]",
+ "classes": [
+ "arrow"
+ ],
+ "src": "2,3",
+ "srcArrow": "none",
+ "dst": "2,4",
+ "dstArrow": "arrow",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "black",
+ "borderRadius": 10,
+ "label": "",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 460,
+ "y": 130
+ },
+ {
+ "x": 480,
+ "y": 130
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "(2,1 -> 0,1)[0]",
+ "classes": [
+ "arrow"
+ ],
+ "src": "2,1",
+ "srcArrow": "none",
+ "dst": "0,1",
+ "dstArrow": "arrow",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "#cecece",
+ "borderRadius": 10,
+ "label": "",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 170,
+ "y": 100
+ },
+ {
+ "x": 170,
+ "y": 60
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "(2,3 -> 0,3)[0]",
+ "classes": [
+ "arrow"
+ ],
+ "src": "2,3",
+ "srcArrow": "none",
+ "dst": "0,3",
+ "dstArrow": "arrow",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "#cecece",
+ "borderRadius": 10,
+ "label": "",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 410,
+ "y": 100
+ },
+ {
+ "x": 410,
+ "y": 60
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "(2,4 -> 0,4)[0]",
+ "classes": [
+ "arrow"
+ ],
+ "src": "2,4",
+ "srcArrow": "none",
+ "dst": "0,4",
+ "dstArrow": "arrow",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "black",
+ "borderRadius": 10,
+ "label": "Yes",
+ "fontSize": 10,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 14,
+ "labelHeight": 13,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 540,
+ "y": 100
+ },
+ {
+ "x": 540,
+ "y": 60
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "(2,4 -> 4,4)[0]",
+ "classes": [
+ "arrow"
+ ],
+ "src": "2,4",
+ "srcArrow": "none",
+ "dst": "4,4",
+ "dstArrow": "arrow",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "black",
+ "borderRadius": 10,
+ "label": "No",
+ "fontSize": 10,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 12,
+ "labelHeight": 13,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 540,
+ "y": 160
+ },
+ {
+ "x": 540,
+ "y": 200
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ }
+ ],
+ "root": {
+ "id": "",
+ "type": "",
+ "pos": {
+ "x": 0,
+ "y": 0
+ },
+ "width": 0,
+ "height": 0,
+ "opacity": 0,
+ "strokeDash": 0,
+ "strokeWidth": 0,
+ "borderRadius": 0,
+ "fill": "N7",
+ "stroke": "",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "",
+ "fontSize": 0,
+ "fontFamily": "",
+ "language": "",
+ "color": "",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "zIndex": 0,
+ "level": 0
+ }
+}
diff --git a/e2etests/testdata/stable/simple_grid_edges/dagre/sketch.exp.svg b/e2etests/testdata/stable/simple_grid_edges/dagre/sketch.exp.svg
new file mode 100644
index 000000000..6ee1c8daa
--- /dev/null
+++ b/e2etests/testdata/stable/simple_grid_edges/dagre/sketch.exp.svg
@@ -0,0 +1,127 @@
+npm i -g@forge/cliSet up anAtlassian siteView the helloworld appforgetunnelforgeloginforgecreateforgedeployforgeinstallHot reloadchanges?Step 1Step 2Step 3Step 4forgedeploy⬤ Forge CLI⬤ Required⬤ Optional YesNo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/e2etests/testdata/stable/simple_grid_edges/elk/board.exp.json b/e2etests/testdata/stable/simple_grid_edges/elk/board.exp.json
new file mode 100644
index 000000000..f12983a4d
--- /dev/null
+++ b/e2etests/testdata/stable/simple_grid_edges/elk/board.exp.json
@@ -0,0 +1,1648 @@
+{
+ "name": "",
+ "isFolderOnly": false,
+ "fontFamily": "SourceSansPro",
+ "shapes": [
+ {
+ "id": "0,0",
+ "type": "rectangle",
+ "classes": [
+ "text",
+ "blue"
+ ],
+ "pos": {
+ "x": 0,
+ "y": 0
+ },
+ "width": 100,
+ "height": 60,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 10,
+ "fill": "#30304c",
+ "stroke": "transparent",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "npm i -g\n@forge/cli",
+ "fontSize": 10,
+ "fontFamily": "mono",
+ "language": "",
+ "color": "white",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 59,
+ "labelHeight": 23,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "0,1",
+ "type": "rectangle",
+ "classes": [
+ "text",
+ "gray"
+ ],
+ "pos": {
+ "x": 120,
+ "y": 0
+ },
+ "width": 100,
+ "height": 60,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 10,
+ "fill": "#cecece",
+ "stroke": "#cecece",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "Set up an\nAtlassian site",
+ "fontSize": 10,
+ "fontFamily": "mono",
+ "language": "",
+ "color": "white",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 84,
+ "labelHeight": 23,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "0,2",
+ "type": "rectangle",
+ "classes": [
+ "empty"
+ ],
+ "pos": {
+ "x": 240,
+ "y": 0
+ },
+ "width": 100,
+ "height": 60,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "transparent",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "0,3",
+ "type": "rectangle",
+ "classes": [
+ "text",
+ "gray"
+ ],
+ "pos": {
+ "x": 360,
+ "y": 0
+ },
+ "width": 100,
+ "height": 60,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 10,
+ "fill": "#cecece",
+ "stroke": "#cecece",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "View the hello\nworld app",
+ "fontSize": 10,
+ "fontFamily": "mono",
+ "language": "",
+ "color": "white",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 84,
+ "labelHeight": 23,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "0,4",
+ "type": "rectangle",
+ "classes": [
+ "text",
+ "blue"
+ ],
+ "pos": {
+ "x": 480,
+ "y": 0
+ },
+ "width": 120,
+ "height": 60,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 10,
+ "fill": "#0033cc",
+ "stroke": "#0033cc",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "forge\ntunnel",
+ "fontSize": 10,
+ "fontFamily": "mono",
+ "language": "",
+ "color": "white",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 36,
+ "labelHeight": 23,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "1,0",
+ "type": "rectangle",
+ "classes": [
+ "note"
+ ],
+ "pos": {
+ "x": 0,
+ "y": 65
+ },
+ "width": 100,
+ "height": 30,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "transparent",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "",
+ "fontSize": 10,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "1,1",
+ "type": "rectangle",
+ "classes": [
+ "note"
+ ],
+ "pos": {
+ "x": 120,
+ "y": 65
+ },
+ "width": 100,
+ "height": 30,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "transparent",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "",
+ "fontSize": 10,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "1,2",
+ "type": "rectangle",
+ "classes": [
+ "note"
+ ],
+ "pos": {
+ "x": 240,
+ "y": 65
+ },
+ "width": 100,
+ "height": 30,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "transparent",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "",
+ "fontSize": 10,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "1,3",
+ "type": "rectangle",
+ "classes": [
+ "note"
+ ],
+ "pos": {
+ "x": 360,
+ "y": 65
+ },
+ "width": 100,
+ "height": 30,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "transparent",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "",
+ "fontSize": 10,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "1,4",
+ "type": "rectangle",
+ "classes": [
+ "note"
+ ],
+ "pos": {
+ "x": 480,
+ "y": 65
+ },
+ "width": 120,
+ "height": 30,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "transparent",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "",
+ "fontSize": 10,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "2,0",
+ "type": "rectangle",
+ "classes": [
+ "text",
+ "blue"
+ ],
+ "pos": {
+ "x": 0,
+ "y": 100
+ },
+ "width": 100,
+ "height": 60,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 10,
+ "fill": "#0033cc",
+ "stroke": "#0033cc",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "forge\nlogin",
+ "fontSize": 10,
+ "fontFamily": "mono",
+ "language": "",
+ "color": "white",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 30,
+ "labelHeight": 23,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "2,1",
+ "type": "rectangle",
+ "classes": [
+ "text",
+ "blue"
+ ],
+ "pos": {
+ "x": 120,
+ "y": 100
+ },
+ "width": 100,
+ "height": 60,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 10,
+ "fill": "#0033cc",
+ "stroke": "#0033cc",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "forge\ncreate",
+ "fontSize": 10,
+ "fontFamily": "mono",
+ "language": "",
+ "color": "white",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 36,
+ "labelHeight": 23,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "2,2",
+ "type": "rectangle",
+ "classes": [
+ "text",
+ "blue"
+ ],
+ "pos": {
+ "x": 240,
+ "y": 100
+ },
+ "width": 100,
+ "height": 60,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 10,
+ "fill": "#0033cc",
+ "stroke": "#0033cc",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "forge\ndeploy",
+ "fontSize": 10,
+ "fontFamily": "mono",
+ "language": "",
+ "color": "white",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 36,
+ "labelHeight": 23,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "2,3",
+ "type": "rectangle",
+ "classes": [
+ "text",
+ "blue"
+ ],
+ "pos": {
+ "x": 360,
+ "y": 100
+ },
+ "width": 100,
+ "height": 60,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 10,
+ "fill": "#0033cc",
+ "stroke": "#0033cc",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "forge\ninstall",
+ "fontSize": 10,
+ "fontFamily": "mono",
+ "language": "",
+ "color": "white",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 42,
+ "labelHeight": 23,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "2,4",
+ "type": "diamond",
+ "classes": [
+ "text",
+ "gray"
+ ],
+ "pos": {
+ "x": 480,
+ "y": 100
+ },
+ "width": 120,
+ "height": 60,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 10,
+ "fill": "#cecece",
+ "stroke": "#cecece",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "Hot reload\nchanges?",
+ "fontSize": 10,
+ "fontFamily": "mono",
+ "language": "",
+ "color": "white",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 60,
+ "labelHeight": 23,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "3,0",
+ "type": "rectangle",
+ "classes": [
+ "note"
+ ],
+ "pos": {
+ "x": 0,
+ "y": 165
+ },
+ "width": 100,
+ "height": 30,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "transparent",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "Step 1",
+ "fontSize": 10,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 28,
+ "labelHeight": 13,
+ "labelPosition": "INSIDE_TOP_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "3,1",
+ "type": "rectangle",
+ "classes": [
+ "note"
+ ],
+ "pos": {
+ "x": 120,
+ "y": 165
+ },
+ "width": 100,
+ "height": 30,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "transparent",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "Step 2",
+ "fontSize": 10,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 28,
+ "labelHeight": 13,
+ "labelPosition": "INSIDE_TOP_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "3,2",
+ "type": "rectangle",
+ "classes": [
+ "note"
+ ],
+ "pos": {
+ "x": 240,
+ "y": 165
+ },
+ "width": 100,
+ "height": 30,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "transparent",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "Step 3",
+ "fontSize": 10,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 28,
+ "labelHeight": 13,
+ "labelPosition": "INSIDE_TOP_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "3,3",
+ "type": "rectangle",
+ "classes": [
+ "note"
+ ],
+ "pos": {
+ "x": 360,
+ "y": 165
+ },
+ "width": 100,
+ "height": 30,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "transparent",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "Step 4",
+ "fontSize": 10,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 29,
+ "labelHeight": 13,
+ "labelPosition": "INSIDE_TOP_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "3,4",
+ "type": "rectangle",
+ "classes": [
+ "note"
+ ],
+ "pos": {
+ "x": 480,
+ "y": 165
+ },
+ "width": 120,
+ "height": 30,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "transparent",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "",
+ "fontSize": 10,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "4,0",
+ "type": "rectangle",
+ "pos": {
+ "x": 0,
+ "y": 200
+ },
+ "width": 100,
+ "height": 60,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "transparent",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "",
+ "fontSize": 28,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "INSIDE_TOP_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "4,0.a",
+ "type": "rectangle",
+ "pos": {
+ "x": 0,
+ "y": 200
+ },
+ "width": 91,
+ "height": 20,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "transparent",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "⬤ Forge CLI",
+ "fontSize": 10,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "#0033cc",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 51,
+ "labelHeight": 13,
+ "labelPosition": "INSIDE_MIDDLE_LEFT",
+ "zIndex": 0,
+ "level": 2
+ },
+ {
+ "id": "4,0.b",
+ "type": "rectangle",
+ "pos": {
+ "x": 0,
+ "y": 220
+ },
+ "width": 91,
+ "height": 20,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "transparent",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "⬤ Required",
+ "fontSize": 10,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "#30304c",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 50,
+ "labelHeight": 13,
+ "labelPosition": "INSIDE_MIDDLE_LEFT",
+ "zIndex": 0,
+ "level": 2
+ },
+ {
+ "id": "4,0.c",
+ "type": "rectangle",
+ "pos": {
+ "x": 0,
+ "y": 240
+ },
+ "width": 91,
+ "height": 20,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "transparent",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "⬤ Optional",
+ "fontSize": 10,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "#cecece",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 48,
+ "labelHeight": 13,
+ "labelPosition": "INSIDE_MIDDLE_LEFT",
+ "zIndex": 0,
+ "level": 2
+ },
+ {
+ "id": "4,1",
+ "type": "rectangle",
+ "classes": [
+ "empty"
+ ],
+ "pos": {
+ "x": 120,
+ "y": 200
+ },
+ "width": 100,
+ "height": 60,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "transparent",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "4,2",
+ "type": "rectangle",
+ "classes": [
+ "empty"
+ ],
+ "pos": {
+ "x": 240,
+ "y": 200
+ },
+ "width": 100,
+ "height": 60,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "transparent",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "4,3",
+ "type": "rectangle",
+ "classes": [
+ "empty"
+ ],
+ "pos": {
+ "x": 360,
+ "y": 200
+ },
+ "width": 100,
+ "height": 60,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "transparent",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "4,4",
+ "type": "rectangle",
+ "classes": [
+ "text",
+ "blue"
+ ],
+ "pos": {
+ "x": 480,
+ "y": 200
+ },
+ "width": 120,
+ "height": 60,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 10,
+ "fill": "#0033cc",
+ "stroke": "#0033cc",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "forge\ndeploy",
+ "fontSize": 10,
+ "fontFamily": "mono",
+ "language": "",
+ "color": "white",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 36,
+ "labelHeight": 23,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 1
+ }
+ ],
+ "connections": [
+ {
+ "id": "(0,0 -> 2,0)[0]",
+ "classes": [
+ "arrow"
+ ],
+ "src": "0,0",
+ "srcArrow": "none",
+ "dst": "2,0",
+ "dstArrow": "arrow",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "black",
+ "borderRadius": 10,
+ "label": "",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 50,
+ "y": 60
+ },
+ {
+ "x": 50,
+ "y": 100
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "(2,0 -> 2,1)[0]",
+ "classes": [
+ "arrow"
+ ],
+ "src": "2,0",
+ "srcArrow": "none",
+ "dst": "2,1",
+ "dstArrow": "arrow",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "black",
+ "borderRadius": 10,
+ "label": "",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 100,
+ "y": 130
+ },
+ {
+ "x": 120,
+ "y": 130
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "(2,1 -> 2,2)[0]",
+ "classes": [
+ "arrow"
+ ],
+ "src": "2,1",
+ "srcArrow": "none",
+ "dst": "2,2",
+ "dstArrow": "arrow",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "black",
+ "borderRadius": 10,
+ "label": "",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 220,
+ "y": 130
+ },
+ {
+ "x": 240,
+ "y": 130
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "(2,2 -> 2,3)[0]",
+ "classes": [
+ "arrow"
+ ],
+ "src": "2,2",
+ "srcArrow": "none",
+ "dst": "2,3",
+ "dstArrow": "arrow",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "black",
+ "borderRadius": 10,
+ "label": "",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 340,
+ "y": 130
+ },
+ {
+ "x": 360,
+ "y": 130
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "(2,3 -> 2,4)[0]",
+ "classes": [
+ "arrow"
+ ],
+ "src": "2,3",
+ "srcArrow": "none",
+ "dst": "2,4",
+ "dstArrow": "arrow",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "black",
+ "borderRadius": 10,
+ "label": "",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 460,
+ "y": 130
+ },
+ {
+ "x": 480,
+ "y": 130
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "(2,1 -> 0,1)[0]",
+ "classes": [
+ "arrow"
+ ],
+ "src": "2,1",
+ "srcArrow": "none",
+ "dst": "0,1",
+ "dstArrow": "arrow",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "#cecece",
+ "borderRadius": 10,
+ "label": "",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 170,
+ "y": 100
+ },
+ {
+ "x": 170,
+ "y": 60
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "(2,3 -> 0,3)[0]",
+ "classes": [
+ "arrow"
+ ],
+ "src": "2,3",
+ "srcArrow": "none",
+ "dst": "0,3",
+ "dstArrow": "arrow",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "#cecece",
+ "borderRadius": 10,
+ "label": "",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 410,
+ "y": 100
+ },
+ {
+ "x": 410,
+ "y": 60
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "(2,4 -> 0,4)[0]",
+ "classes": [
+ "arrow"
+ ],
+ "src": "2,4",
+ "srcArrow": "none",
+ "dst": "0,4",
+ "dstArrow": "arrow",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "black",
+ "borderRadius": 10,
+ "label": "Yes",
+ "fontSize": 10,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 14,
+ "labelHeight": 13,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 540,
+ "y": 100
+ },
+ {
+ "x": 540,
+ "y": 60
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "(2,4 -> 4,4)[0]",
+ "classes": [
+ "arrow"
+ ],
+ "src": "2,4",
+ "srcArrow": "none",
+ "dst": "4,4",
+ "dstArrow": "arrow",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "black",
+ "borderRadius": 10,
+ "label": "No",
+ "fontSize": 10,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 12,
+ "labelHeight": 13,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 540,
+ "y": 160
+ },
+ {
+ "x": 540,
+ "y": 200
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ }
+ ],
+ "root": {
+ "id": "",
+ "type": "",
+ "pos": {
+ "x": 0,
+ "y": 0
+ },
+ "width": 0,
+ "height": 0,
+ "opacity": 0,
+ "strokeDash": 0,
+ "strokeWidth": 0,
+ "borderRadius": 0,
+ "fill": "N7",
+ "stroke": "",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "",
+ "fontSize": 0,
+ "fontFamily": "",
+ "language": "",
+ "color": "",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "zIndex": 0,
+ "level": 0
+ }
+}
diff --git a/e2etests/testdata/stable/simple_grid_edges/elk/sketch.exp.svg b/e2etests/testdata/stable/simple_grid_edges/elk/sketch.exp.svg
new file mode 100644
index 000000000..6ee1c8daa
--- /dev/null
+++ b/e2etests/testdata/stable/simple_grid_edges/elk/sketch.exp.svg
@@ -0,0 +1,127 @@
+npm i -g@forge/cliSet up anAtlassian siteView the helloworld appforgetunnelforgeloginforgecreateforgedeployforgeinstallHot reloadchanges?Step 1Step 2Step 3Step 4forgedeploy⬤ Forge CLI⬤ Required⬤ Optional YesNo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/testdata/d2compiler/TestCompile/grid_deeper_edge.exp.json b/testdata/d2compiler/TestCompile/grid_deeper_edge.exp.json
new file mode 100644
index 000000000..abe81dc64
--- /dev/null
+++ b/testdata/d2compiler/TestCompile/grid_deeper_edge.exp.json
@@ -0,0 +1,15 @@
+{
+ "graph": null,
+ "err": {
+ "errs": [
+ {
+ "range": "d2/testdata/d2compiler/TestCompile/grid_deeper_edge.d2,8:2:86-8:8:92",
+ "errmsg": "d2/testdata/d2compiler/TestCompile/grid_deeper_edge.d2:9:3: edge must be on direct child of grid diagram \"hey\""
+ },
+ {
+ "range": "d2/testdata/d2compiler/TestCompile/grid_deeper_edge.d2,4:2:41-4:8:47",
+ "errmsg": "d2/testdata/d2compiler/TestCompile/grid_deeper_edge.d2:5:3: grid diagrams can only have edges between children right now"
+ }
+ ]
+ }
+}
diff --git a/testdata/d2compiler/TestCompile/grid_edge.exp.json b/testdata/d2compiler/TestCompile/grid_edge.exp.json
index e1a46d1d8..01dc6d78b 100644
--- a/testdata/d2compiler/TestCompile/grid_edge.exp.json
+++ b/testdata/d2compiler/TestCompile/grid_edge.exp.json
@@ -3,16 +3,16 @@
"err": {
"errs": [
{
- "range": "d2/testdata/d2compiler/TestCompile/grid_edge.d2,2:1:22-2:7:28",
- "errmsg": "d2/testdata/d2compiler/TestCompile/grid_edge.d2:3:2: edges in grid diagrams are not supported yet"
+ "range": "d2/testdata/d2compiler/TestCompile/grid_edge.d2,4:1:36-4:11:46",
+ "errmsg": "d2/testdata/d2compiler/TestCompile/grid_edge.d2:5:2: edges into grid diagrams are not supported yet"
},
{
- "range": "d2/testdata/d2compiler/TestCompile/grid_edge.d2,4:1:32-4:11:42",
- "errmsg": "d2/testdata/d2compiler/TestCompile/grid_edge.d2:5:2: edges in grid diagrams are not supported yet"
+ "range": "d2/testdata/d2compiler/TestCompile/grid_edge.d2,5:1:48-5:11:58",
+ "errmsg": "d2/testdata/d2compiler/TestCompile/grid_edge.d2:6:2: edges into grid diagrams are not supported yet"
},
{
- "range": "d2/testdata/d2compiler/TestCompile/grid_edge.d2,5:1:44-5:11:54",
- "errmsg": "d2/testdata/d2compiler/TestCompile/grid_edge.d2:6:2: edges in grid diagrams are not supported yet"
+ "range": "d2/testdata/d2compiler/TestCompile/grid_edge.d2,6:1:60-6:13:72",
+ "errmsg": "d2/testdata/d2compiler/TestCompile/grid_edge.d2:7:2: edges into grid diagrams are not supported yet"
}
]
}