Merge pull request #1602 from gavin-ts/redesign-nested-layout
Redesign nested layout
|
|
@ -17,9 +17,8 @@ import (
|
|||
"oss.terrastruct.com/d2/d2compiler"
|
||||
"oss.terrastruct.com/d2/d2exporter"
|
||||
"oss.terrastruct.com/d2/d2graph"
|
||||
"oss.terrastruct.com/d2/d2layouts"
|
||||
"oss.terrastruct.com/d2/d2layouts/d2dagrelayout"
|
||||
"oss.terrastruct.com/d2/d2layouts/d2grid"
|
||||
"oss.terrastruct.com/d2/d2layouts/d2sequence"
|
||||
"oss.terrastruct.com/d2/d2lib"
|
||||
"oss.terrastruct.com/d2/d2target"
|
||||
"oss.terrastruct.com/d2/lib/geo"
|
||||
|
|
@ -235,7 +234,8 @@ func run(t *testing.T, tc testCase) {
|
|||
err = g.SetDimensions(nil, ruler, nil)
|
||||
assert.JSON(t, nil, err)
|
||||
|
||||
err = d2sequence.Layout(ctx, g, d2grid.Layout(ctx, g, d2dagrelayout.DefaultLayout))
|
||||
graphInfo := d2layouts.NestedGraphInfo(g.Root)
|
||||
err = d2layouts.LayoutNested(ctx, g, graphInfo, d2dagrelayout.DefaultLayout)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1090,6 +1090,21 @@ func (obj *Object) OuterNearContainer() *Object {
|
|||
return nil
|
||||
}
|
||||
|
||||
func (obj *Object) IsConstantNear() bool {
|
||||
if obj.NearKey == nil {
|
||||
return false
|
||||
}
|
||||
keyPath := Key(obj.NearKey)
|
||||
|
||||
// interesting if there is a shape with id=top-left, then top-left isn't treated a constant near
|
||||
_, isKey := obj.Graph.Root.HasChild(keyPath)
|
||||
if isKey {
|
||||
return false
|
||||
}
|
||||
_, isConst := NearConstants[keyPath[0]]
|
||||
return isConst
|
||||
}
|
||||
|
||||
type Edge struct {
|
||||
Index int `json:"index"`
|
||||
|
||||
|
|
@ -1910,7 +1925,7 @@ func (g *Graph) PrintString() string {
|
|||
buf := &bytes.Buffer{}
|
||||
fmt.Fprint(buf, "Objects: [")
|
||||
for _, obj := range g.Objects {
|
||||
fmt.Fprintf(buf, "%#v @(%v)", obj.AbsID(), obj.TopLeft.ToString())
|
||||
fmt.Fprintf(buf, "%v, ", obj.AbsID())
|
||||
}
|
||||
fmt.Fprint(buf, "]")
|
||||
return buf.String()
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ func (obj *Object) MoveWithDescendantsTo(x, y float64) {
|
|||
obj.MoveWithDescendants(dx, dy)
|
||||
}
|
||||
|
||||
func (parent *Object) removeChild(child *Object) {
|
||||
func (parent *Object) RemoveChild(child *Object) {
|
||||
delete(parent.Children, strings.ToLower(child.ID))
|
||||
for i := 0; i < len(parent.ChildrenArray); i++ {
|
||||
if parent.ChildrenArray[i] == child {
|
||||
|
|
@ -51,7 +51,7 @@ func (g *Graph) ExtractAsNestedGraph(obj *Object) *Graph {
|
|||
tempGraph.Objects = descendantObjects
|
||||
tempGraph.Edges = edges
|
||||
|
||||
obj.Parent.removeChild(obj)
|
||||
obj.Parent.RemoveChild(obj)
|
||||
obj.Parent = tempGraph.Root
|
||||
|
||||
return tempGraph
|
||||
|
|
|
|||
|
|
@ -5,7 +5,6 @@ import (
|
|||
"context"
|
||||
"fmt"
|
||||
"math"
|
||||
"sort"
|
||||
|
||||
"oss.terrastruct.com/d2/d2graph"
|
||||
"oss.terrastruct.com/d2/d2target"
|
||||
|
|
@ -21,257 +20,160 @@ const (
|
|||
|
||||
// Layout runs the grid layout on containers with rows/columns
|
||||
// Note: children are not allowed edges or descendants
|
||||
//
|
||||
// 1. Traverse graph from root, skip objects with no rows/columns
|
||||
// 2. Construct a grid with the container children
|
||||
// 3. Remove the children from the main graph
|
||||
// 4. Run grid layout
|
||||
// 5. Set the resulting dimensions to the main graph shape
|
||||
// 6. Run core layouts (without grid children)
|
||||
// 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, edgeOrder, err := withoutGridDiagrams(ctx, g, layout)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
// 1. Run grid layout on the graph root
|
||||
// 2. Set the resulting dimensions to the graph root
|
||||
func Layout(ctx context.Context, g *d2graph.Graph) error {
|
||||
obj := g.Root
|
||||
|
||||
if g.Root.IsGridDiagram() && len(g.Root.ChildrenArray) != 0 {
|
||||
g.Root.TopLeft = geo.NewPoint(0, 0)
|
||||
} else if err := layout(ctx, g); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
cleanup(g, gridDiagrams, objectOrder, edgeOrder)
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
gd, err := layoutGrid(g, obj)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var processGrid func(obj *d2graph.Object) error
|
||||
processGrid = func(obj *d2graph.Object) error {
|
||||
for _, child := range obj.ChildrenArray {
|
||||
if len(child.ChildrenArray) == 0 {
|
||||
continue
|
||||
}
|
||||
if child.IsGridDiagram() {
|
||||
if err := processGrid(child); err != nil {
|
||||
return err
|
||||
}
|
||||
} else {
|
||||
tempGraph := g.ExtractAsNestedGraph(child)
|
||||
if err := layout(ctx, tempGraph); err != nil {
|
||||
return err
|
||||
}
|
||||
g.InjectNestedGraph(tempGraph, obj)
|
||||
|
||||
sort.SliceStable(g.Objects, func(i, j int) bool {
|
||||
return objectOrder[g.Objects[i].AbsID()] < objectOrder[g.Objects[j].AbsID()]
|
||||
})
|
||||
sort.SliceStable(child.ChildrenArray, func(i, j int) bool {
|
||||
return objectOrder[child.ChildrenArray[i].AbsID()] < objectOrder[child.ChildrenArray[j].AbsID()]
|
||||
})
|
||||
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{}{}
|
||||
}
|
||||
}
|
||||
if obj.Box != nil {
|
||||
// CONTAINER_PADDING is default, but use gap value if set
|
||||
horizontalPadding, verticalPadding := CONTAINER_PADDING, CONTAINER_PADDING
|
||||
if obj.GridGap != nil || obj.HorizontalGap != nil {
|
||||
horizontalPadding = gd.horizontalGap
|
||||
}
|
||||
if obj.GridGap != nil || obj.VerticalGap != nil {
|
||||
verticalPadding = gd.verticalGap
|
||||
}
|
||||
|
||||
gd, err := layoutGrid(g, obj)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
obj.Children = make(map[string]*d2graph.Object)
|
||||
obj.ChildrenArray = nil
|
||||
// size shape according to grid
|
||||
obj.SizeToContent(gd.width, gd.height, float64(2*horizontalPadding), float64(2*verticalPadding))
|
||||
|
||||
if obj.Box != nil {
|
||||
// CONTAINER_PADDING is default, but use gap value if set
|
||||
horizontalPadding, verticalPadding := CONTAINER_PADDING, CONTAINER_PADDING
|
||||
if obj.GridGap != nil || obj.HorizontalGap != nil {
|
||||
horizontalPadding = gd.horizontalGap
|
||||
}
|
||||
if obj.GridGap != nil || obj.VerticalGap != nil {
|
||||
verticalPadding = gd.verticalGap
|
||||
}
|
||||
|
||||
// size shape according to grid
|
||||
obj.SizeToContent(gd.width, gd.height, float64(2*horizontalPadding), float64(2*verticalPadding))
|
||||
|
||||
// compute where the grid should be placed inside shape
|
||||
s := obj.ToShape()
|
||||
innerBox := s.GetInnerBox()
|
||||
if innerBox.TopLeft.X != 0 || innerBox.TopLeft.Y != 0 {
|
||||
gd.shift(innerBox.TopLeft.X, innerBox.TopLeft.Y)
|
||||
}
|
||||
|
||||
// compute how much space the label and icon occupy
|
||||
var occupiedWidth, occupiedHeight float64
|
||||
if obj.Icon != nil {
|
||||
iconSpace := float64(d2target.MAX_ICON_SIZE + 2*label.PADDING)
|
||||
occupiedWidth = iconSpace
|
||||
occupiedHeight = iconSpace
|
||||
}
|
||||
|
||||
var dx, dy float64
|
||||
if obj.LabelDimensions.Height != 0 {
|
||||
occupiedHeight = math.Max(
|
||||
occupiedHeight,
|
||||
float64(obj.LabelDimensions.Height)+2*label.PADDING,
|
||||
)
|
||||
}
|
||||
if obj.LabelDimensions.Width != 0 {
|
||||
// . ├────┤───────├────┤
|
||||
// . icon label icon
|
||||
// with an icon in top left we need 2x the space to fit the label in the center
|
||||
occupiedWidth *= 2
|
||||
occupiedWidth += float64(obj.LabelDimensions.Width) + 2*label.PADDING
|
||||
if occupiedWidth > obj.Width {
|
||||
dx = (occupiedWidth - obj.Width) / 2
|
||||
obj.Width = occupiedWidth
|
||||
}
|
||||
}
|
||||
|
||||
// also check for grid cells with outside top labels or icons
|
||||
// the first grid object is at the top (and always exists)
|
||||
topY := gd.objects[0].TopLeft.Y
|
||||
highestOutside := topY
|
||||
for _, o := range gd.objects {
|
||||
// we only want to compute label positions for objects at the top of the grid
|
||||
if o.TopLeft.Y > topY {
|
||||
if gd.rowDirected {
|
||||
// if the grid is rowDirected (row1, row2, etc) we can stop after finishing the first row
|
||||
break
|
||||
} else {
|
||||
// otherwise we continue until the next column
|
||||
continue
|
||||
}
|
||||
}
|
||||
if o.LabelPosition != nil {
|
||||
labelPosition := label.Position(*o.LabelPosition)
|
||||
if labelPosition.IsOutside() {
|
||||
labelTL := o.GetLabelTopLeft()
|
||||
if labelTL.Y < highestOutside {
|
||||
highestOutside = labelTL.Y
|
||||
}
|
||||
}
|
||||
}
|
||||
if o.IconPosition != nil {
|
||||
switch label.Position(*o.IconPosition) {
|
||||
case label.OutsideTopLeft, label.OutsideTopCenter, label.OutsideTopRight:
|
||||
iconSpace := float64(d2target.MAX_ICON_SIZE + label.PADDING)
|
||||
if topY-iconSpace < highestOutside {
|
||||
highestOutside = topY - iconSpace
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if highestOutside < topY {
|
||||
occupiedHeight += topY - highestOutside + 2*label.PADDING
|
||||
}
|
||||
if occupiedHeight > float64(verticalPadding) {
|
||||
// if the label doesn't fit within the padding, we need to add more
|
||||
dy = occupiedHeight - float64(verticalPadding)
|
||||
obj.Height += dy
|
||||
}
|
||||
|
||||
// we need to center children if we have to expand to fit the container label
|
||||
if dx != 0 || dy != 0 {
|
||||
gd.shift(dx, dy)
|
||||
}
|
||||
// compute where the grid should be placed inside shape
|
||||
s := obj.ToShape()
|
||||
innerBox := s.GetInnerBox()
|
||||
if innerBox.TopLeft.X != 0 || innerBox.TopLeft.Y != 0 {
|
||||
gd.shift(innerBox.TopLeft.X, innerBox.TopLeft.Y)
|
||||
}
|
||||
|
||||
if obj.HasLabel() {
|
||||
obj.LabelPosition = go2.Pointer(string(label.InsideTopCenter))
|
||||
}
|
||||
// compute how much space the label and icon occupy
|
||||
var occupiedWidth, occupiedHeight float64
|
||||
if obj.Icon != nil {
|
||||
obj.IconPosition = go2.Pointer(string(label.InsideTopLeft))
|
||||
iconSpace := float64(d2target.MAX_ICON_SIZE + 2*label.PADDING)
|
||||
occupiedWidth = iconSpace
|
||||
occupiedHeight = iconSpace
|
||||
}
|
||||
gridDiagrams[obj.AbsID()] = gd
|
||||
|
||||
var dx, dy float64
|
||||
if obj.LabelDimensions.Height != 0 {
|
||||
occupiedHeight = math.Max(
|
||||
occupiedHeight,
|
||||
float64(obj.LabelDimensions.Height)+2*label.PADDING,
|
||||
)
|
||||
}
|
||||
if obj.LabelDimensions.Width != 0 {
|
||||
// . ├────┤───────├────┤
|
||||
// . icon label icon
|
||||
// with an icon in top left we need 2x the space to fit the label in the center
|
||||
occupiedWidth *= 2
|
||||
occupiedWidth += float64(obj.LabelDimensions.Width) + 2*label.PADDING
|
||||
if occupiedWidth > obj.Width {
|
||||
dx = (occupiedWidth - obj.Width) / 2
|
||||
obj.Width = occupiedWidth
|
||||
}
|
||||
}
|
||||
|
||||
// also check for grid cells with outside top labels or icons
|
||||
// the first grid object is at the top (and always exists)
|
||||
topY := gd.objects[0].TopLeft.Y
|
||||
highestOutside := topY
|
||||
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
|
||||
// we only want to compute label positions for objects at the top of the grid
|
||||
if o.TopLeft.Y > topY {
|
||||
if gd.rowDirected {
|
||||
// if the grid is rowDirected (row1, row2, etc) we can stop after finishing the first row
|
||||
break
|
||||
} else {
|
||||
// otherwise we continue until the next column
|
||||
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 o.LabelPosition != nil {
|
||||
labelPosition := label.Position(*o.LabelPosition)
|
||||
if labelPosition.IsOutside() {
|
||||
labelTL := o.GetLabelTopLeft()
|
||||
if labelTL.Y < highestOutside {
|
||||
highestOutside = labelTL.Y
|
||||
}
|
||||
}
|
||||
}
|
||||
// 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))
|
||||
if o.IconPosition != nil {
|
||||
switch label.Position(*o.IconPosition) {
|
||||
case label.OutsideTopLeft, label.OutsideTopCenter, label.OutsideTopRight:
|
||||
iconSpace := float64(d2target.MAX_ICON_SIZE + label.PADDING)
|
||||
if topY-iconSpace < highestOutside {
|
||||
highestOutside = topY - iconSpace
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if highestOutside < topY {
|
||||
occupiedHeight += topY - highestOutside + 2*label.PADDING
|
||||
}
|
||||
if occupiedHeight > float64(verticalPadding) {
|
||||
// if the label doesn't fit within the padding, we need to add more
|
||||
dy = occupiedHeight - float64(verticalPadding)
|
||||
obj.Height += dy
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
if len(g.Objects) > 0 {
|
||||
queue := make([]*d2graph.Object, 1, len(g.Objects))
|
||||
queue[0] = g.Root
|
||||
for len(queue) > 0 {
|
||||
obj := queue[0]
|
||||
queue = queue[1:]
|
||||
if len(obj.ChildrenArray) == 0 {
|
||||
continue
|
||||
}
|
||||
if !obj.IsGridDiagram() {
|
||||
queue = append(queue, obj.ChildrenArray...)
|
||||
continue
|
||||
}
|
||||
|
||||
if err := processGrid(obj); err != nil {
|
||||
return nil, nil, nil, err
|
||||
}
|
||||
// we need to center children if we have to expand to fit the container label
|
||||
if dx != 0 || dy != 0 {
|
||||
gd.shift(dx, dy)
|
||||
}
|
||||
}
|
||||
|
||||
layoutObjects := make([]*d2graph.Object, 0, len(toRemove))
|
||||
for _, obj := range g.Objects {
|
||||
if _, exists := toRemove[obj]; !exists {
|
||||
layoutObjects = append(layoutObjects, obj)
|
||||
}
|
||||
if obj.HasLabel() {
|
||||
obj.LabelPosition = go2.Pointer(string(label.InsideTopCenter))
|
||||
}
|
||||
g.Objects = layoutObjects
|
||||
layoutEdges := make([]*d2graph.Edge, 0, len(edgeToRemove))
|
||||
if obj.Icon != nil {
|
||||
obj.IconPosition = go2.Pointer(string(label.InsideTopLeft))
|
||||
}
|
||||
|
||||
// simple straight line edge routing between grid objects
|
||||
for _, e := range g.Edges {
|
||||
if _, exists := edgeToRemove[e]; !exists {
|
||||
layoutEdges = append(layoutEdges, e)
|
||||
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)
|
||||
|
||||
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))
|
||||
}
|
||||
}
|
||||
g.Edges = layoutEdges
|
||||
|
||||
return gridDiagrams, objectOrder, edgeOrder, nil
|
||||
if g.Root.IsGridDiagram() && len(g.Root.ChildrenArray) != 0 {
|
||||
g.Root.TopLeft = geo.NewPoint(0, 0)
|
||||
}
|
||||
|
||||
obj.LabelPosition = go2.Pointer(string(label.InsideTopCenter))
|
||||
|
||||
if g.RootLevel > 0 {
|
||||
horizontalPadding, verticalPadding := CONTAINER_PADDING, CONTAINER_PADDING
|
||||
if obj.GridGap != nil || obj.HorizontalGap != nil {
|
||||
horizontalPadding = gd.horizontalGap
|
||||
}
|
||||
if obj.GridGap != nil || obj.VerticalGap != nil {
|
||||
verticalPadding = gd.verticalGap
|
||||
}
|
||||
|
||||
// shift the grid from (0, 0)
|
||||
gd.shift(
|
||||
obj.TopLeft.X+float64(horizontalPadding),
|
||||
obj.TopLeft.Y+float64(verticalPadding),
|
||||
)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func layoutGrid(g *d2graph.Graph, obj *d2graph.Object) (*gridDiagram, error) {
|
||||
|
|
@ -969,57 +871,3 @@ func getDistToTarget(layout [][]*d2graph.Object, targetSize float64, horizontalG
|
|||
}
|
||||
return totalDelta
|
||||
}
|
||||
|
||||
// cleanup restores the graph after the core layout engine finishes
|
||||
// - 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, 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)
|
||||
restore = func(obj *d2graph.Object) {
|
||||
gd, exists := gridDiagrams[obj.AbsID()]
|
||||
if !exists {
|
||||
return
|
||||
}
|
||||
obj.LabelPosition = go2.Pointer(string(label.InsideTopCenter))
|
||||
|
||||
horizontalPadding, verticalPadding := CONTAINER_PADDING, CONTAINER_PADDING
|
||||
if obj.GridGap != nil || obj.HorizontalGap != nil {
|
||||
horizontalPadding = gd.horizontalGap
|
||||
}
|
||||
if obj.GridGap != nil || obj.VerticalGap != nil {
|
||||
verticalPadding = gd.verticalGap
|
||||
}
|
||||
|
||||
// shift the grid from (0, 0)
|
||||
gd.shift(
|
||||
obj.TopLeft.X+float64(horizontalPadding),
|
||||
obj.TopLeft.Y+float64(verticalPadding),
|
||||
)
|
||||
gd.cleanup(obj, graph)
|
||||
|
||||
for _, child := range obj.ChildrenArray {
|
||||
restore(child)
|
||||
}
|
||||
}
|
||||
|
||||
if graph.Root.IsGridDiagram() {
|
||||
gd, exists := gridDiagrams[graph.Root.AbsID()]
|
||||
if exists {
|
||||
gd.cleanup(graph.Root, graph)
|
||||
}
|
||||
}
|
||||
|
||||
for _, obj := range graph.Objects {
|
||||
restore(obj)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
362
d2layouts/d2layouts.go
Normal file
|
|
@ -0,0 +1,362 @@
|
|||
package d2layouts
|
||||
|
||||
import (
|
||||
"context"
|
||||
"math"
|
||||
"sort"
|
||||
"strings"
|
||||
|
||||
"cdr.dev/slog"
|
||||
|
||||
"oss.terrastruct.com/d2/d2graph"
|
||||
"oss.terrastruct.com/d2/d2layouts/d2grid"
|
||||
"oss.terrastruct.com/d2/d2layouts/d2near"
|
||||
"oss.terrastruct.com/d2/d2layouts/d2sequence"
|
||||
"oss.terrastruct.com/d2/lib/geo"
|
||||
"oss.terrastruct.com/d2/lib/log"
|
||||
)
|
||||
|
||||
type DiagramType string
|
||||
|
||||
// a grid diagram at a constant near is
|
||||
const (
|
||||
DefaultGraphType DiagramType = ""
|
||||
ConstantNearGraph DiagramType = "constant-near"
|
||||
GridDiagram DiagramType = "grid-diagram"
|
||||
SequenceDiagram DiagramType = "sequence-diagram"
|
||||
)
|
||||
|
||||
type GraphInfo struct {
|
||||
IsConstantNear bool
|
||||
DiagramType DiagramType
|
||||
}
|
||||
|
||||
func (gi GraphInfo) isDefault() bool {
|
||||
return !gi.IsConstantNear && gi.DiagramType == DefaultGraphType
|
||||
}
|
||||
|
||||
func SaveChildrenOrder(container *d2graph.Object) (restoreOrder func()) {
|
||||
objectOrder := make(map[string]int, len(container.ChildrenArray))
|
||||
for i, obj := range container.ChildrenArray {
|
||||
objectOrder[obj.AbsID()] = i
|
||||
}
|
||||
return func() {
|
||||
sort.SliceStable(container.ChildrenArray, func(i, j int) bool {
|
||||
return objectOrder[container.ChildrenArray[i].AbsID()] < objectOrder[container.ChildrenArray[j].AbsID()]
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func SaveOrder(g *d2graph.Graph) (restoreOrder func()) {
|
||||
objectOrder := make(map[string]int, len(g.Objects))
|
||||
for i, obj := range g.Objects {
|
||||
objectOrder[obj.AbsID()] = i
|
||||
}
|
||||
edgeOrder := make(map[string]int, len(g.Edges))
|
||||
for i, edge := range g.Edges {
|
||||
edgeOrder[edge.AbsID()] = i
|
||||
}
|
||||
restoreRootOrder := SaveChildrenOrder(g.Root)
|
||||
return func() {
|
||||
sort.SliceStable(g.Objects, func(i, j int) bool {
|
||||
return objectOrder[g.Objects[i].AbsID()] < objectOrder[g.Objects[j].AbsID()]
|
||||
})
|
||||
sort.SliceStable(g.Edges, func(i, j int) bool {
|
||||
iIndex, iHas := edgeOrder[g.Edges[i].AbsID()]
|
||||
jIndex, jHas := edgeOrder[g.Edges[j].AbsID()]
|
||||
if iHas && jHas {
|
||||
return iIndex < jIndex
|
||||
}
|
||||
return iHas
|
||||
})
|
||||
restoreRootOrder()
|
||||
}
|
||||
}
|
||||
|
||||
func LayoutNested(ctx context.Context, g *d2graph.Graph, graphInfo GraphInfo, coreLayout d2graph.LayoutGraph) error {
|
||||
g.Root.Box = &geo.Box{}
|
||||
|
||||
// Before we can layout these nodes, we need to handle all nested diagrams first.
|
||||
extracted := make(map[*d2graph.Object]*d2graph.Graph)
|
||||
var extractedOrder []*d2graph.Object
|
||||
|
||||
var constantNears []*d2graph.Graph
|
||||
restoreOrder := SaveOrder(g)
|
||||
defer restoreOrder()
|
||||
|
||||
// Iterate top-down from Root so all nested diagrams can process their own contents
|
||||
queue := make([]*d2graph.Object, 0, len(g.Root.ChildrenArray))
|
||||
queue = append(queue, g.Root.ChildrenArray...)
|
||||
|
||||
for len(queue) > 0 {
|
||||
curr := queue[0]
|
||||
queue = queue[1:]
|
||||
|
||||
isGridCellContainer := graphInfo.DiagramType == GridDiagram &&
|
||||
curr.IsContainer() && curr.Parent == g.Root
|
||||
gi := NestedGraphInfo(curr)
|
||||
|
||||
if isGridCellContainer && gi.isDefault() {
|
||||
// if we are in a grid diagram, and our children have descendants
|
||||
// we need to run layout on them first, even if they are not special diagram types
|
||||
nestedGraph := ExtractSubgraph(curr, true)
|
||||
err := LayoutNested(ctx, nestedGraph, GraphInfo{}, coreLayout)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
InjectNested(g.Root, nestedGraph, false)
|
||||
restoreOrder()
|
||||
dx := -curr.TopLeft.X
|
||||
dy := -curr.TopLeft.Y
|
||||
for _, o := range nestedGraph.Objects {
|
||||
o.TopLeft.X += dx
|
||||
o.TopLeft.Y += dy
|
||||
}
|
||||
for _, e := range nestedGraph.Edges {
|
||||
e.Move(dx, dy)
|
||||
}
|
||||
continue
|
||||
}
|
||||
|
||||
if !gi.isDefault() {
|
||||
// empty grid or sequence can have 0 objects..
|
||||
if !gi.IsConstantNear && len(curr.Children) == 0 {
|
||||
continue
|
||||
}
|
||||
|
||||
// There is a nested diagram here, so extract its contents and process in the same way
|
||||
nestedGraph := ExtractSubgraph(curr, gi.IsConstantNear)
|
||||
|
||||
log.Info(ctx, "layout nested", slog.F("level", curr.Level()), slog.F("child", curr.AbsID()), slog.F("gi", gi))
|
||||
nestedInfo := gi
|
||||
nearKey := curr.NearKey
|
||||
if gi.IsConstantNear {
|
||||
// layout nested as a non-near
|
||||
nestedInfo = GraphInfo{}
|
||||
curr.NearKey = nil
|
||||
}
|
||||
|
||||
err := LayoutNested(ctx, nestedGraph, nestedInfo, coreLayout)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if gi.IsConstantNear {
|
||||
curr.NearKey = nearKey
|
||||
} else {
|
||||
FitToGraph(curr, nestedGraph, geo.Spacing{})
|
||||
curr.TopLeft = geo.NewPoint(0, 0)
|
||||
}
|
||||
|
||||
if gi.IsConstantNear {
|
||||
// near layout will inject these nestedGraphs
|
||||
constantNears = append(constantNears, nestedGraph)
|
||||
} else {
|
||||
// We will restore the contents after running layout with child as the placeholder
|
||||
extracted[curr] = nestedGraph
|
||||
extractedOrder = append(extractedOrder, curr)
|
||||
}
|
||||
} else if len(curr.ChildrenArray) > 0 {
|
||||
queue = append(queue, curr.ChildrenArray...)
|
||||
}
|
||||
}
|
||||
|
||||
// We can now run layout with accurate sizes of nested layout containers
|
||||
// Layout according to the type of diagram
|
||||
var err error
|
||||
switch graphInfo.DiagramType {
|
||||
case GridDiagram:
|
||||
log.Debug(ctx, "layout grid", slog.F("rootlevel", g.RootLevel), slog.F("shapes", g.PrintString()))
|
||||
if err = d2grid.Layout(ctx, g); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
case SequenceDiagram:
|
||||
log.Debug(ctx, "layout sequence", slog.F("rootlevel", g.RootLevel), slog.F("shapes", g.PrintString()))
|
||||
err = d2sequence.Layout(ctx, g, coreLayout)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
default:
|
||||
log.Debug(ctx, "default layout", slog.F("rootlevel", g.RootLevel), slog.F("shapes", g.PrintString()))
|
||||
err := coreLayout(ctx, g)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
if len(constantNears) > 0 {
|
||||
err := d2near.Layout(ctx, g, constantNears)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
// With the layout set, inject all the extracted graphs
|
||||
for _, n := range extractedOrder {
|
||||
nestedGraph := extracted[n]
|
||||
InjectNested(n, nestedGraph, true)
|
||||
PositionNested(n, nestedGraph)
|
||||
}
|
||||
|
||||
log.Debug(ctx, "done", slog.F("rootlevel", g.RootLevel), slog.F("shapes", g.PrintString()))
|
||||
return err
|
||||
}
|
||||
|
||||
func NestedGraphInfo(obj *d2graph.Object) (gi GraphInfo) {
|
||||
if obj.Graph.RootLevel == 0 && obj.IsConstantNear() {
|
||||
gi.IsConstantNear = true
|
||||
}
|
||||
if obj.IsSequenceDiagram() {
|
||||
gi.DiagramType = SequenceDiagram
|
||||
} else if obj.IsGridDiagram() {
|
||||
gi.DiagramType = GridDiagram
|
||||
}
|
||||
return gi
|
||||
}
|
||||
|
||||
func ExtractSubgraph(container *d2graph.Object, includeSelf bool) *d2graph.Graph {
|
||||
// includeSelf: when we have a constant near or a grid cell that is a container,
|
||||
// we want to include itself in the nested graph, not just its descendants,
|
||||
nestedGraph := d2graph.NewGraph()
|
||||
nestedGraph.RootLevel = int(container.Level())
|
||||
if includeSelf {
|
||||
nestedGraph.RootLevel--
|
||||
}
|
||||
nestedGraph.Root.Attributes = container.Attributes
|
||||
nestedGraph.Root.Box = &geo.Box{}
|
||||
|
||||
isNestedObject := func(obj *d2graph.Object) bool {
|
||||
if includeSelf {
|
||||
return obj.IsDescendantOf(container)
|
||||
}
|
||||
return obj.Parent.IsDescendantOf(container)
|
||||
}
|
||||
|
||||
// separate out nested edges
|
||||
g := container.Graph
|
||||
remainingEdges := make([]*d2graph.Edge, 0, len(g.Edges))
|
||||
for _, edge := range g.Edges {
|
||||
if isNestedObject(edge.Src) && isNestedObject(edge.Dst) {
|
||||
nestedGraph.Edges = append(nestedGraph.Edges, edge)
|
||||
} else {
|
||||
remainingEdges = append(remainingEdges, edge)
|
||||
}
|
||||
}
|
||||
g.Edges = remainingEdges
|
||||
|
||||
// separate out nested objects
|
||||
remainingObjects := make([]*d2graph.Object, 0, len(g.Objects))
|
||||
for _, obj := range g.Objects {
|
||||
if isNestedObject(obj) {
|
||||
nestedGraph.Objects = append(nestedGraph.Objects, obj)
|
||||
} else {
|
||||
remainingObjects = append(remainingObjects, obj)
|
||||
}
|
||||
}
|
||||
g.Objects = remainingObjects
|
||||
|
||||
// update object and new root references
|
||||
for _, o := range nestedGraph.Objects {
|
||||
o.Graph = nestedGraph
|
||||
}
|
||||
|
||||
if includeSelf {
|
||||
// remove container parent's references
|
||||
if container.Parent != nil {
|
||||
container.Parent.RemoveChild(container)
|
||||
}
|
||||
|
||||
// set root references
|
||||
nestedGraph.Root.ChildrenArray = []*d2graph.Object{container}
|
||||
container.Parent = nestedGraph.Root
|
||||
nestedGraph.Root.Children[strings.ToLower(container.ID)] = container
|
||||
} else {
|
||||
// set root references
|
||||
nestedGraph.Root.ChildrenArray = append(nestedGraph.Root.ChildrenArray, container.ChildrenArray...)
|
||||
for _, child := range container.ChildrenArray {
|
||||
child.Parent = nestedGraph.Root
|
||||
nestedGraph.Root.Children[strings.ToLower(child.ID)] = child
|
||||
}
|
||||
|
||||
// remove container's references
|
||||
for k := range container.Children {
|
||||
delete(container.Children, k)
|
||||
}
|
||||
container.ChildrenArray = nil
|
||||
}
|
||||
|
||||
return nestedGraph
|
||||
}
|
||||
|
||||
func InjectNested(container *d2graph.Object, nestedGraph *d2graph.Graph, isRoot bool) {
|
||||
// TODO restore order of objects
|
||||
g := container.Graph
|
||||
for _, obj := range nestedGraph.Root.ChildrenArray {
|
||||
obj.Parent = container
|
||||
container.Children[strings.ToLower(obj.ID)] = obj
|
||||
container.ChildrenArray = append(container.ChildrenArray, obj)
|
||||
}
|
||||
for _, obj := range nestedGraph.Objects {
|
||||
obj.Graph = g
|
||||
}
|
||||
g.Objects = append(g.Objects, nestedGraph.Objects...)
|
||||
g.Edges = append(g.Edges, nestedGraph.Edges...)
|
||||
|
||||
if isRoot {
|
||||
if nestedGraph.Root.LabelPosition != nil {
|
||||
container.LabelPosition = nestedGraph.Root.LabelPosition
|
||||
}
|
||||
if nestedGraph.Root.IconPosition != nil {
|
||||
container.IconPosition = nestedGraph.Root.IconPosition
|
||||
}
|
||||
container.Attributes = nestedGraph.Root.Attributes
|
||||
}
|
||||
}
|
||||
|
||||
func PositionNested(container *d2graph.Object, nestedGraph *d2graph.Graph) {
|
||||
// tl, _ := boundingBox(nestedGraph)
|
||||
// Note: assumes nestedGraph's layout has contents positioned relative to 0,0
|
||||
dx := container.TopLeft.X //- tl.X
|
||||
dy := container.TopLeft.Y //- tl.Y
|
||||
for _, o := range nestedGraph.Objects {
|
||||
o.TopLeft.X += dx
|
||||
o.TopLeft.Y += dy
|
||||
}
|
||||
for _, e := range nestedGraph.Edges {
|
||||
e.Move(dx, dy)
|
||||
}
|
||||
}
|
||||
|
||||
func boundingBox(g *d2graph.Graph) (tl, br *geo.Point) {
|
||||
if len(g.Objects) == 0 {
|
||||
return geo.NewPoint(0, 0), geo.NewPoint(0, 0)
|
||||
}
|
||||
tl = geo.NewPoint(math.Inf(1), math.Inf(1))
|
||||
br = geo.NewPoint(math.Inf(-1), math.Inf(-1))
|
||||
|
||||
for _, obj := range g.Objects {
|
||||
if obj.TopLeft == nil {
|
||||
panic(obj.AbsID())
|
||||
}
|
||||
tl.X = math.Min(tl.X, obj.TopLeft.X)
|
||||
tl.Y = math.Min(tl.Y, obj.TopLeft.Y)
|
||||
br.X = math.Max(br.X, obj.TopLeft.X+obj.Width)
|
||||
br.Y = math.Max(br.Y, obj.TopLeft.Y+obj.Height)
|
||||
}
|
||||
|
||||
return tl, br
|
||||
}
|
||||
|
||||
func FitToGraph(container *d2graph.Object, nestedGraph *d2graph.Graph, padding geo.Spacing) {
|
||||
var width, height float64
|
||||
width = nestedGraph.Root.Width
|
||||
height = nestedGraph.Root.Height
|
||||
if width == 0 || height == 0 {
|
||||
tl, br := boundingBox(nestedGraph)
|
||||
width = br.X - tl.X
|
||||
height = br.Y - tl.Y
|
||||
}
|
||||
container.Width = padding.Left + width + padding.Right
|
||||
container.Height = padding.Top + height + padding.Bottom
|
||||
}
|
||||
|
|
@ -145,28 +145,6 @@ func place(obj *d2graph.Object) (float64, float64) {
|
|||
return x, y
|
||||
}
|
||||
|
||||
// WithoutConstantNears plucks out the graph objects which have "near" set to a constant value
|
||||
// This is to be called before layout engines so they don't take part in regular positioning
|
||||
func WithoutConstantNears(ctx context.Context, g *d2graph.Graph) (constantNearGraphs []*d2graph.Graph) {
|
||||
for i := 0; i < len(g.Objects); i++ {
|
||||
obj := g.Objects[i]
|
||||
if obj.NearKey == nil {
|
||||
continue
|
||||
}
|
||||
_, isKey := g.Root.HasChild(d2graph.Key(obj.NearKey))
|
||||
if isKey {
|
||||
continue
|
||||
}
|
||||
_, isConst := d2graph.NearConstants[d2graph.Key(obj.NearKey)[0]]
|
||||
if isConst {
|
||||
tempGraph := g.ExtractAsNestedGraph(obj)
|
||||
constantNearGraphs = append(constantNearGraphs, tempGraph)
|
||||
i--
|
||||
}
|
||||
}
|
||||
return constantNearGraphs
|
||||
}
|
||||
|
||||
// boundingBox gets the center of the graph as defined by shapes
|
||||
// The bounds taking into consideration only shapes gives more of a feeling of true center
|
||||
// It differs from d2target.BoundingBox which needs to include every visible thing
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@ package d2sequence
|
|||
|
||||
import (
|
||||
"context"
|
||||
"sort"
|
||||
"strings"
|
||||
|
||||
"oss.terrastruct.com/util-go/go2"
|
||||
|
|
@ -15,85 +14,50 @@ import (
|
|||
|
||||
// Layout runs the sequence diagram layout engine on objects of shape sequence_diagram
|
||||
//
|
||||
// 1. Traverse graph from root, skip objects with shape not `sequence_diagram`
|
||||
// 2. Construct a sequence diagram from all descendant objects and edges
|
||||
// 3. Remove those objects and edges from the main graph
|
||||
// 4. Run layout on sequence diagrams
|
||||
// 5. Set the resulting dimensions to the main graph shape
|
||||
// 6. Run core layouts (still without sequence diagram innards)
|
||||
// 7. Put back sequence diagram innards in correct location
|
||||
// 1. Run layout on sequence diagrams
|
||||
// 2. Set the resulting dimensions to the main graph shape
|
||||
func Layout(ctx context.Context, g *d2graph.Graph, layout d2graph.LayoutGraph) error {
|
||||
sequenceDiagrams, objectOrder, edgeOrder, err := WithoutSequenceDiagrams(ctx, g)
|
||||
// used in layout code
|
||||
g.Root.Shape.Value = d2target.ShapeSequenceDiagram
|
||||
|
||||
sd, err := layoutSequenceDiagram(g, g.Root)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
g.Root.Box = geo.NewBox(nil, sd.getWidth()+GROUP_CONTAINER_PADDING*2, sd.getHeight()+GROUP_CONTAINER_PADDING*2)
|
||||
|
||||
if g.Root.IsSequenceDiagram() {
|
||||
// the sequence diagram is the only layout engine if the whole diagram is
|
||||
// shape: sequence_diagram
|
||||
g.Root.TopLeft = geo.NewPoint(0, 0)
|
||||
} else if err := layout(ctx, g); err != nil {
|
||||
return err
|
||||
// the sequence diagram is the only layout engine if the whole diagram is
|
||||
// shape: sequence_diagram
|
||||
g.Root.TopLeft = geo.NewPoint(0, 0)
|
||||
|
||||
obj := g.Root
|
||||
|
||||
obj.LabelPosition = go2.Pointer(string(label.InsideTopCenter))
|
||||
|
||||
// shift the sequence diagrams as they are always placed at (0, 0) with some padding
|
||||
sd.shift(
|
||||
geo.NewPoint(
|
||||
obj.TopLeft.X+GROUP_CONTAINER_PADDING,
|
||||
obj.TopLeft.Y+GROUP_CONTAINER_PADDING,
|
||||
),
|
||||
)
|
||||
|
||||
obj.Children = make(map[string]*d2graph.Object)
|
||||
obj.ChildrenArray = make([]*d2graph.Object, 0)
|
||||
for _, child := range sd.actors {
|
||||
obj.Children[strings.ToLower(child.ID)] = child
|
||||
obj.ChildrenArray = append(obj.ChildrenArray, child)
|
||||
}
|
||||
|
||||
cleanup(g, sequenceDiagrams, objectOrder, edgeOrder)
|
||||
return nil
|
||||
}
|
||||
|
||||
func WithoutSequenceDiagrams(ctx context.Context, g *d2graph.Graph) (map[string]*sequenceDiagram, map[string]int, map[string]int, error) {
|
||||
objectsToRemove := make(map[*d2graph.Object]struct{})
|
||||
edgesToRemove := make(map[*d2graph.Edge]struct{})
|
||||
sequenceDiagrams := make(map[string]*sequenceDiagram)
|
||||
|
||||
if len(g.Objects) > 0 {
|
||||
queue := make([]*d2graph.Object, 1, len(g.Objects))
|
||||
queue[0] = g.Root
|
||||
for len(queue) > 0 {
|
||||
obj := queue[0]
|
||||
queue = queue[1:]
|
||||
if len(obj.ChildrenArray) == 0 {
|
||||
continue
|
||||
}
|
||||
if obj.Shape.Value != d2target.ShapeSequenceDiagram {
|
||||
queue = append(queue, obj.ChildrenArray...)
|
||||
continue
|
||||
}
|
||||
|
||||
sd, err := layoutSequenceDiagram(g, obj)
|
||||
if err != nil {
|
||||
return nil, nil, nil, err
|
||||
}
|
||||
obj.Children = make(map[string]*d2graph.Object)
|
||||
obj.ChildrenArray = nil
|
||||
obj.Box = geo.NewBox(nil, sd.getWidth()+GROUP_CONTAINER_PADDING*2, sd.getHeight()+GROUP_CONTAINER_PADDING*2)
|
||||
obj.LabelPosition = go2.Pointer(string(label.InsideTopCenter))
|
||||
sequenceDiagrams[obj.AbsID()] = sd
|
||||
|
||||
for _, edge := range sd.messages {
|
||||
edgesToRemove[edge] = struct{}{}
|
||||
}
|
||||
for _, obj := range sd.actors {
|
||||
objectsToRemove[obj] = struct{}{}
|
||||
}
|
||||
for _, obj := range sd.notes {
|
||||
objectsToRemove[obj] = struct{}{}
|
||||
}
|
||||
for _, obj := range sd.groups {
|
||||
objectsToRemove[obj] = struct{}{}
|
||||
}
|
||||
for _, obj := range sd.spans {
|
||||
objectsToRemove[obj] = struct{}{}
|
||||
}
|
||||
for _, child := range sd.groups {
|
||||
if child.Parent.AbsID() == obj.AbsID() {
|
||||
obj.Children[strings.ToLower(child.ID)] = child
|
||||
obj.ChildrenArray = append(obj.ChildrenArray, child)
|
||||
}
|
||||
}
|
||||
|
||||
layoutEdges, edgeOrder := getLayoutEdges(g, edgesToRemove)
|
||||
g.Edges = layoutEdges
|
||||
layoutObjects, objectOrder := getLayoutObjects(g, objectsToRemove)
|
||||
// TODO this isn't a proper deletion because the objects still appear as children of the object
|
||||
g.Objects = layoutObjects
|
||||
g.Edges = append(g.Edges, sd.lifelines...)
|
||||
|
||||
return sequenceDiagrams, objectOrder, edgeOrder, nil
|
||||
return nil
|
||||
}
|
||||
|
||||
// layoutSequenceDiagram finds the edges inside the sequence diagram and performs the layout on the object descendants
|
||||
|
|
@ -113,97 +77,3 @@ func layoutSequenceDiagram(g *d2graph.Graph, obj *d2graph.Object) (*sequenceDiag
|
|||
err = sd.layout()
|
||||
return sd, err
|
||||
}
|
||||
|
||||
func getLayoutEdges(g *d2graph.Graph, toRemove map[*d2graph.Edge]struct{}) ([]*d2graph.Edge, map[string]int) {
|
||||
edgeOrder := make(map[string]int)
|
||||
layoutEdges := make([]*d2graph.Edge, 0, len(g.Edges)-len(toRemove))
|
||||
|
||||
for i, edge := range g.Edges {
|
||||
edgeOrder[edge.AbsID()] = i
|
||||
if _, exists := toRemove[edge]; !exists {
|
||||
layoutEdges = append(layoutEdges, edge)
|
||||
}
|
||||
}
|
||||
return layoutEdges, edgeOrder
|
||||
}
|
||||
|
||||
func getLayoutObjects(g *d2graph.Graph, toRemove map[*d2graph.Object]struct{}) ([]*d2graph.Object, map[string]int) {
|
||||
objectOrder := make(map[string]int)
|
||||
layoutObjects := make([]*d2graph.Object, 0, len(toRemove))
|
||||
for i, obj := range g.Objects {
|
||||
objectOrder[obj.AbsID()] = i
|
||||
if _, exists := toRemove[obj]; !exists {
|
||||
layoutObjects = append(layoutObjects, obj)
|
||||
}
|
||||
}
|
||||
return layoutObjects, objectOrder
|
||||
}
|
||||
|
||||
// cleanup restores the graph after the core layout engine finishes
|
||||
// - translating the sequence diagram to its position placed by the core layout engine
|
||||
// - restore the children of the sequence diagram graph object
|
||||
// - adds the sequence diagram edges (messages) back to the graph
|
||||
// - adds the sequence diagram lifelines to the graph edges
|
||||
// - adds the sequence diagram descendants back to the graph objects
|
||||
// - sorts edges and objects to their original graph order
|
||||
func cleanup(g *d2graph.Graph, sequenceDiagrams map[string]*sequenceDiagram, objectsOrder, edgesOrder map[string]int) {
|
||||
var objects []*d2graph.Object
|
||||
if g.Root.IsSequenceDiagram() {
|
||||
objects = []*d2graph.Object{g.Root}
|
||||
} else {
|
||||
objects = g.Objects
|
||||
}
|
||||
for _, obj := range objects {
|
||||
sd, exists := sequenceDiagrams[obj.AbsID()]
|
||||
if !exists {
|
||||
continue
|
||||
}
|
||||
obj.LabelPosition = go2.Pointer(string(label.InsideTopCenter))
|
||||
|
||||
// shift the sequence diagrams as they are always placed at (0, 0) with some padding
|
||||
sd.shift(
|
||||
geo.NewPoint(
|
||||
obj.TopLeft.X+GROUP_CONTAINER_PADDING,
|
||||
obj.TopLeft.Y+GROUP_CONTAINER_PADDING,
|
||||
),
|
||||
)
|
||||
|
||||
obj.Children = make(map[string]*d2graph.Object)
|
||||
obj.ChildrenArray = make([]*d2graph.Object, 0)
|
||||
for _, child := range sd.actors {
|
||||
obj.Children[strings.ToLower(child.ID)] = child
|
||||
obj.ChildrenArray = append(obj.ChildrenArray, child)
|
||||
}
|
||||
for _, child := range sd.groups {
|
||||
if child.Parent.AbsID() == obj.AbsID() {
|
||||
obj.Children[strings.ToLower(child.ID)] = child
|
||||
obj.ChildrenArray = append(obj.ChildrenArray, child)
|
||||
}
|
||||
}
|
||||
|
||||
g.Edges = append(g.Edges, sd.messages...)
|
||||
g.Edges = append(g.Edges, sd.lifelines...)
|
||||
g.Objects = append(g.Objects, sd.actors...)
|
||||
g.Objects = append(g.Objects, sd.notes...)
|
||||
g.Objects = append(g.Objects, sd.groups...)
|
||||
g.Objects = append(g.Objects, sd.spans...)
|
||||
}
|
||||
|
||||
// no new objects, so just keep the same position
|
||||
sort.SliceStable(g.Objects, func(i, j int) bool {
|
||||
return objectsOrder[g.Objects[i].AbsID()] < objectsOrder[g.Objects[j].AbsID()]
|
||||
})
|
||||
|
||||
// sequence diagrams add lifelines, and they must be the last ones in this slice
|
||||
sort.SliceStable(g.Edges, func(i, j int) bool {
|
||||
iOrder, iExists := edgesOrder[g.Edges[i].AbsID()]
|
||||
jOrder, jExists := edgesOrder[g.Edges[j].AbsID()]
|
||||
if iExists && jExists {
|
||||
return iOrder < jOrder
|
||||
} else if iExists && !jExists {
|
||||
return true
|
||||
}
|
||||
// either both don't exist or i doesn't exist and j exists
|
||||
return false
|
||||
})
|
||||
}
|
||||
|
|
|
|||
23
d2lib/d2.go
|
|
@ -10,10 +10,8 @@ import (
|
|||
"oss.terrastruct.com/d2/d2compiler"
|
||||
"oss.terrastruct.com/d2/d2exporter"
|
||||
"oss.terrastruct.com/d2/d2graph"
|
||||
"oss.terrastruct.com/d2/d2layouts"
|
||||
"oss.terrastruct.com/d2/d2layouts/d2dagrelayout"
|
||||
"oss.terrastruct.com/d2/d2layouts/d2grid"
|
||||
"oss.terrastruct.com/d2/d2layouts/d2near"
|
||||
"oss.terrastruct.com/d2/d2layouts/d2sequence"
|
||||
"oss.terrastruct.com/d2/d2renderers/d2fonts"
|
||||
"oss.terrastruct.com/d2/d2renderers/d2svg"
|
||||
"oss.terrastruct.com/d2/d2target"
|
||||
|
|
@ -84,23 +82,8 @@ func compile(ctx context.Context, g *d2graph.Graph, compileOpts *CompileOptions,
|
|||
return nil, err
|
||||
}
|
||||
|
||||
constantNearGraphs := d2near.WithoutConstantNears(ctx, g)
|
||||
|
||||
layoutWithGrids := d2grid.Layout(ctx, g, coreLayout)
|
||||
|
||||
// run core layout for constantNears
|
||||
for _, tempGraph := range constantNearGraphs {
|
||||
if err = layoutWithGrids(ctx, tempGraph); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
err = d2sequence.Layout(ctx, g, layoutWithGrids)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
err = d2near.Layout(ctx, g, constantNearGraphs)
|
||||
graphInfo := d2layouts.NestedGraphInfo(g.Root)
|
||||
err = d2layouts.LayoutNested(ctx, g, graphInfo, coreLayout)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 124 KiB After Width: | Height: | Size: 124 KiB |
186
e2etests-cli/testdata/TestCLI_E2E/animation.exp.svg
vendored
|
|
@ -1,16 +1,16 @@
|
|||
<?xml version="1.0" encoding="utf-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" d2Version="v0.6.0-HEAD" preserveAspectRatio="xMinYMin meet" viewBox="0 0 514 665"><svg id="d2-svg" width="514" height="665" viewBox="-206 -166 514 665"><style type="text/css"><![CDATA[
|
||||
.d2-281690071 .text {
|
||||
font-family: "d2-281690071-font-regular";
|
||||
.d2-4132224283 .text {
|
||||
font-family: "d2-4132224283-font-regular";
|
||||
}
|
||||
@font-face {
|
||||
font-family: d2-281690071-font-regular;
|
||||
font-family: d2-4132224283-font-regular;
|
||||
src: url("data:application/font-woff;base64,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");
|
||||
}
|
||||
.d2-281690071 .text-bold {
|
||||
font-family: "d2-281690071-font-bold";
|
||||
.d2-4132224283 .text-bold {
|
||||
font-family: "d2-4132224283-font-bold";
|
||||
}
|
||||
@font-face {
|
||||
font-family: d2-281690071-font-bold;
|
||||
font-family: d2-4132224283-font-bold;
|
||||
src: url("data:application/font-woff;base64,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");
|
||||
}]]></style><style type="text/css"><![CDATA[.shape {
|
||||
shape-rendering: geometricPrecision;
|
||||
|
|
@ -25,92 +25,92 @@
|
|||
opacity: 0.5;
|
||||
}
|
||||
|
||||
.d2-281690071 .fill-N1{fill:#0A0F25;}
|
||||
.d2-281690071 .fill-N2{fill:#676C7E;}
|
||||
.d2-281690071 .fill-N3{fill:#9499AB;}
|
||||
.d2-281690071 .fill-N4{fill:#CFD2DD;}
|
||||
.d2-281690071 .fill-N5{fill:#DEE1EB;}
|
||||
.d2-281690071 .fill-N6{fill:#EEF1F8;}
|
||||
.d2-281690071 .fill-N7{fill:#FFFFFF;}
|
||||
.d2-281690071 .fill-B1{fill:#0D32B2;}
|
||||
.d2-281690071 .fill-B2{fill:#0D32B2;}
|
||||
.d2-281690071 .fill-B3{fill:#E3E9FD;}
|
||||
.d2-281690071 .fill-B4{fill:#E3E9FD;}
|
||||
.d2-281690071 .fill-B5{fill:#EDF0FD;}
|
||||
.d2-281690071 .fill-B6{fill:#F7F8FE;}
|
||||
.d2-281690071 .fill-AA2{fill:#4A6FF3;}
|
||||
.d2-281690071 .fill-AA4{fill:#EDF0FD;}
|
||||
.d2-281690071 .fill-AA5{fill:#F7F8FE;}
|
||||
.d2-281690071 .fill-AB4{fill:#EDF0FD;}
|
||||
.d2-281690071 .fill-AB5{fill:#F7F8FE;}
|
||||
.d2-281690071 .stroke-N1{stroke:#0A0F25;}
|
||||
.d2-281690071 .stroke-N2{stroke:#676C7E;}
|
||||
.d2-281690071 .stroke-N3{stroke:#9499AB;}
|
||||
.d2-281690071 .stroke-N4{stroke:#CFD2DD;}
|
||||
.d2-281690071 .stroke-N5{stroke:#DEE1EB;}
|
||||
.d2-281690071 .stroke-N6{stroke:#EEF1F8;}
|
||||
.d2-281690071 .stroke-N7{stroke:#FFFFFF;}
|
||||
.d2-281690071 .stroke-B1{stroke:#0D32B2;}
|
||||
.d2-281690071 .stroke-B2{stroke:#0D32B2;}
|
||||
.d2-281690071 .stroke-B3{stroke:#E3E9FD;}
|
||||
.d2-281690071 .stroke-B4{stroke:#E3E9FD;}
|
||||
.d2-281690071 .stroke-B5{stroke:#EDF0FD;}
|
||||
.d2-281690071 .stroke-B6{stroke:#F7F8FE;}
|
||||
.d2-281690071 .stroke-AA2{stroke:#4A6FF3;}
|
||||
.d2-281690071 .stroke-AA4{stroke:#EDF0FD;}
|
||||
.d2-281690071 .stroke-AA5{stroke:#F7F8FE;}
|
||||
.d2-281690071 .stroke-AB4{stroke:#EDF0FD;}
|
||||
.d2-281690071 .stroke-AB5{stroke:#F7F8FE;}
|
||||
.d2-281690071 .background-color-N1{background-color:#0A0F25;}
|
||||
.d2-281690071 .background-color-N2{background-color:#676C7E;}
|
||||
.d2-281690071 .background-color-N3{background-color:#9499AB;}
|
||||
.d2-281690071 .background-color-N4{background-color:#CFD2DD;}
|
||||
.d2-281690071 .background-color-N5{background-color:#DEE1EB;}
|
||||
.d2-281690071 .background-color-N6{background-color:#EEF1F8;}
|
||||
.d2-281690071 .background-color-N7{background-color:#FFFFFF;}
|
||||
.d2-281690071 .background-color-B1{background-color:#0D32B2;}
|
||||
.d2-281690071 .background-color-B2{background-color:#0D32B2;}
|
||||
.d2-281690071 .background-color-B3{background-color:#E3E9FD;}
|
||||
.d2-281690071 .background-color-B4{background-color:#E3E9FD;}
|
||||
.d2-281690071 .background-color-B5{background-color:#EDF0FD;}
|
||||
.d2-281690071 .background-color-B6{background-color:#F7F8FE;}
|
||||
.d2-281690071 .background-color-AA2{background-color:#4A6FF3;}
|
||||
.d2-281690071 .background-color-AA4{background-color:#EDF0FD;}
|
||||
.d2-281690071 .background-color-AA5{background-color:#F7F8FE;}
|
||||
.d2-281690071 .background-color-AB4{background-color:#EDF0FD;}
|
||||
.d2-281690071 .background-color-AB5{background-color:#F7F8FE;}
|
||||
.d2-281690071 .color-N1{color:#0A0F25;}
|
||||
.d2-281690071 .color-N2{color:#676C7E;}
|
||||
.d2-281690071 .color-N3{color:#9499AB;}
|
||||
.d2-281690071 .color-N4{color:#CFD2DD;}
|
||||
.d2-281690071 .color-N5{color:#DEE1EB;}
|
||||
.d2-281690071 .color-N6{color:#EEF1F8;}
|
||||
.d2-281690071 .color-N7{color:#FFFFFF;}
|
||||
.d2-281690071 .color-B1{color:#0D32B2;}
|
||||
.d2-281690071 .color-B2{color:#0D32B2;}
|
||||
.d2-281690071 .color-B3{color:#E3E9FD;}
|
||||
.d2-281690071 .color-B4{color:#E3E9FD;}
|
||||
.d2-281690071 .color-B5{color:#EDF0FD;}
|
||||
.d2-281690071 .color-B6{color:#F7F8FE;}
|
||||
.d2-281690071 .color-AA2{color:#4A6FF3;}
|
||||
.d2-281690071 .color-AA4{color:#EDF0FD;}
|
||||
.d2-281690071 .color-AA5{color:#F7F8FE;}
|
||||
.d2-281690071 .color-AB4{color:#EDF0FD;}
|
||||
.d2-281690071 .color-AB5{color:#F7F8FE;}.appendix text.text{fill:#0A0F25}.md{--color-fg-default:#0A0F25;--color-fg-muted:#676C7E;--color-fg-subtle:#9499AB;--color-canvas-default:#FFFFFF;--color-canvas-subtle:#EEF1F8;--color-border-default:#0D32B2;--color-border-muted:#0D32B2;--color-neutral-muted:#EEF1F8;--color-accent-fg:#0D32B2;--color-accent-emphasis:#0D32B2;--color-attention-subtle:#676C7E;--color-danger-fg:red;}.sketch-overlay-B1{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-B2{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-B3{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B6{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AA2{fill:url(#streaks-dark);mix-blend-mode:overlay}.sketch-overlay-AA4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AA5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AB4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AB5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N1{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-N2{fill:url(#streaks-dark);mix-blend-mode:overlay}.sketch-overlay-N3{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N4{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N6{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N7{fill:url(#streaks-bright);mix-blend-mode:darken}.light-code{display: block}.dark-code{display: none}]]></style><style type="text/css">.md em,
|
||||
.d2-4132224283 .fill-N1{fill:#0A0F25;}
|
||||
.d2-4132224283 .fill-N2{fill:#676C7E;}
|
||||
.d2-4132224283 .fill-N3{fill:#9499AB;}
|
||||
.d2-4132224283 .fill-N4{fill:#CFD2DD;}
|
||||
.d2-4132224283 .fill-N5{fill:#DEE1EB;}
|
||||
.d2-4132224283 .fill-N6{fill:#EEF1F8;}
|
||||
.d2-4132224283 .fill-N7{fill:#FFFFFF;}
|
||||
.d2-4132224283 .fill-B1{fill:#0D32B2;}
|
||||
.d2-4132224283 .fill-B2{fill:#0D32B2;}
|
||||
.d2-4132224283 .fill-B3{fill:#E3E9FD;}
|
||||
.d2-4132224283 .fill-B4{fill:#E3E9FD;}
|
||||
.d2-4132224283 .fill-B5{fill:#EDF0FD;}
|
||||
.d2-4132224283 .fill-B6{fill:#F7F8FE;}
|
||||
.d2-4132224283 .fill-AA2{fill:#4A6FF3;}
|
||||
.d2-4132224283 .fill-AA4{fill:#EDF0FD;}
|
||||
.d2-4132224283 .fill-AA5{fill:#F7F8FE;}
|
||||
.d2-4132224283 .fill-AB4{fill:#EDF0FD;}
|
||||
.d2-4132224283 .fill-AB5{fill:#F7F8FE;}
|
||||
.d2-4132224283 .stroke-N1{stroke:#0A0F25;}
|
||||
.d2-4132224283 .stroke-N2{stroke:#676C7E;}
|
||||
.d2-4132224283 .stroke-N3{stroke:#9499AB;}
|
||||
.d2-4132224283 .stroke-N4{stroke:#CFD2DD;}
|
||||
.d2-4132224283 .stroke-N5{stroke:#DEE1EB;}
|
||||
.d2-4132224283 .stroke-N6{stroke:#EEF1F8;}
|
||||
.d2-4132224283 .stroke-N7{stroke:#FFFFFF;}
|
||||
.d2-4132224283 .stroke-B1{stroke:#0D32B2;}
|
||||
.d2-4132224283 .stroke-B2{stroke:#0D32B2;}
|
||||
.d2-4132224283 .stroke-B3{stroke:#E3E9FD;}
|
||||
.d2-4132224283 .stroke-B4{stroke:#E3E9FD;}
|
||||
.d2-4132224283 .stroke-B5{stroke:#EDF0FD;}
|
||||
.d2-4132224283 .stroke-B6{stroke:#F7F8FE;}
|
||||
.d2-4132224283 .stroke-AA2{stroke:#4A6FF3;}
|
||||
.d2-4132224283 .stroke-AA4{stroke:#EDF0FD;}
|
||||
.d2-4132224283 .stroke-AA5{stroke:#F7F8FE;}
|
||||
.d2-4132224283 .stroke-AB4{stroke:#EDF0FD;}
|
||||
.d2-4132224283 .stroke-AB5{stroke:#F7F8FE;}
|
||||
.d2-4132224283 .background-color-N1{background-color:#0A0F25;}
|
||||
.d2-4132224283 .background-color-N2{background-color:#676C7E;}
|
||||
.d2-4132224283 .background-color-N3{background-color:#9499AB;}
|
||||
.d2-4132224283 .background-color-N4{background-color:#CFD2DD;}
|
||||
.d2-4132224283 .background-color-N5{background-color:#DEE1EB;}
|
||||
.d2-4132224283 .background-color-N6{background-color:#EEF1F8;}
|
||||
.d2-4132224283 .background-color-N7{background-color:#FFFFFF;}
|
||||
.d2-4132224283 .background-color-B1{background-color:#0D32B2;}
|
||||
.d2-4132224283 .background-color-B2{background-color:#0D32B2;}
|
||||
.d2-4132224283 .background-color-B3{background-color:#E3E9FD;}
|
||||
.d2-4132224283 .background-color-B4{background-color:#E3E9FD;}
|
||||
.d2-4132224283 .background-color-B5{background-color:#EDF0FD;}
|
||||
.d2-4132224283 .background-color-B6{background-color:#F7F8FE;}
|
||||
.d2-4132224283 .background-color-AA2{background-color:#4A6FF3;}
|
||||
.d2-4132224283 .background-color-AA4{background-color:#EDF0FD;}
|
||||
.d2-4132224283 .background-color-AA5{background-color:#F7F8FE;}
|
||||
.d2-4132224283 .background-color-AB4{background-color:#EDF0FD;}
|
||||
.d2-4132224283 .background-color-AB5{background-color:#F7F8FE;}
|
||||
.d2-4132224283 .color-N1{color:#0A0F25;}
|
||||
.d2-4132224283 .color-N2{color:#676C7E;}
|
||||
.d2-4132224283 .color-N3{color:#9499AB;}
|
||||
.d2-4132224283 .color-N4{color:#CFD2DD;}
|
||||
.d2-4132224283 .color-N5{color:#DEE1EB;}
|
||||
.d2-4132224283 .color-N6{color:#EEF1F8;}
|
||||
.d2-4132224283 .color-N7{color:#FFFFFF;}
|
||||
.d2-4132224283 .color-B1{color:#0D32B2;}
|
||||
.d2-4132224283 .color-B2{color:#0D32B2;}
|
||||
.d2-4132224283 .color-B3{color:#E3E9FD;}
|
||||
.d2-4132224283 .color-B4{color:#E3E9FD;}
|
||||
.d2-4132224283 .color-B5{color:#EDF0FD;}
|
||||
.d2-4132224283 .color-B6{color:#F7F8FE;}
|
||||
.d2-4132224283 .color-AA2{color:#4A6FF3;}
|
||||
.d2-4132224283 .color-AA4{color:#EDF0FD;}
|
||||
.d2-4132224283 .color-AA5{color:#F7F8FE;}
|
||||
.d2-4132224283 .color-AB4{color:#EDF0FD;}
|
||||
.d2-4132224283 .color-AB5{color:#F7F8FE;}.appendix text.text{fill:#0A0F25}.md{--color-fg-default:#0A0F25;--color-fg-muted:#676C7E;--color-fg-subtle:#9499AB;--color-canvas-default:#FFFFFF;--color-canvas-subtle:#EEF1F8;--color-border-default:#0D32B2;--color-border-muted:#0D32B2;--color-neutral-muted:#EEF1F8;--color-accent-fg:#0D32B2;--color-accent-emphasis:#0D32B2;--color-attention-subtle:#676C7E;--color-danger-fg:red;}.sketch-overlay-B1{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-B2{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-B3{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B6{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AA2{fill:url(#streaks-dark);mix-blend-mode:overlay}.sketch-overlay-AA4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AA5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AB4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AB5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N1{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-N2{fill:url(#streaks-dark);mix-blend-mode:overlay}.sketch-overlay-N3{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N4{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N6{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N7{fill:url(#streaks-bright);mix-blend-mode:darken}.light-code{display: block}.dark-code{display: none}]]></style><style type="text/css">.md em,
|
||||
.md dfn {
|
||||
font-family: "d2-281690071-font-italic";
|
||||
font-family: "d2-4132224283-font-italic";
|
||||
}
|
||||
|
||||
.md b,
|
||||
.md strong {
|
||||
font-family: "d2-281690071-font-bold";
|
||||
font-family: "d2-4132224283-font-bold";
|
||||
}
|
||||
|
||||
.md code,
|
||||
.md kbd,
|
||||
.md pre,
|
||||
.md samp {
|
||||
font-family: "d2-281690071-font-mono";
|
||||
font-family: "d2-4132224283-font-mono";
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
|
|
@ -126,7 +126,7 @@
|
|||
margin: 0;
|
||||
color: var(--color-fg-default);
|
||||
background-color: transparent; /* we don't want to define the background color */
|
||||
font-family: "d2-281690071-font-regular";
|
||||
font-family: "d2-4132224283-font-regular";
|
||||
font-size: 16px;
|
||||
line-height: 1.5;
|
||||
word-wrap: break-word;
|
||||
|
|
@ -832,7 +832,7 @@
|
|||
.md .contains-task-list:dir(rtl) .task-list-item-checkbox {
|
||||
margin: 0 -1.6em 0.25em 0.2em;
|
||||
}
|
||||
</style><style type="text/css"><![CDATA[@keyframes d2Transition-d2-281690071-0 {
|
||||
</style><style type="text/css"><![CDATA[@keyframes d2Transition-d2-4132224283-0 {
|
||||
0%, 0.000000% {
|
||||
opacity: 0;
|
||||
}
|
||||
|
|
@ -842,7 +842,7 @@
|
|||
25.000000%, 100% {
|
||||
opacity: 0;
|
||||
}
|
||||
}@keyframes d2Transition-d2-281690071-1 {
|
||||
}@keyframes d2Transition-d2-4132224283-1 {
|
||||
0%, 24.982143% {
|
||||
opacity: 0;
|
||||
}
|
||||
|
|
@ -852,7 +852,7 @@
|
|||
50.000000%, 100% {
|
||||
opacity: 0;
|
||||
}
|
||||
}@keyframes d2Transition-d2-281690071-2 {
|
||||
}@keyframes d2Transition-d2-4132224283-2 {
|
||||
0%, 49.982143% {
|
||||
opacity: 0;
|
||||
}
|
||||
|
|
@ -862,29 +862,29 @@
|
|||
75.000000%, 100% {
|
||||
opacity: 0;
|
||||
}
|
||||
}@keyframes d2Transition-d2-281690071-3 {
|
||||
}@keyframes d2Transition-d2-4132224283-3 {
|
||||
0%, 74.982143% {
|
||||
opacity: 0;
|
||||
}
|
||||
75.000000%, 100.000000% {
|
||||
opacity: 1;
|
||||
}
|
||||
}]]></style><g style="animation: d2Transition-d2-281690071-0 5600ms infinite" class="d2-281690071" width="412" height="247" viewBox="-206 -166 412 247"><rect x="-206.000000" y="-166.000000" width="412.000000" height="247.000000" rx="0.000000" class=" fill-N7" stroke-width="0" /><g id=""Chicken's plan""><g class="shape" ></g><text x="0.000000" y="-30.000000" class="text fill-N1" style="text-anchor:middle;font-size:35px">Chicken's plan</text></g><mask id="d2-281690071" maskUnits="userSpaceOnUse" x="-206" y="-166" width="412" height="247">
|
||||
}]]></style><g style="animation: d2Transition-d2-4132224283-0 5600ms infinite" class="d2-4132224283" width="412" height="247" viewBox="-206 -166 412 247"><rect x="-206.000000" y="-166.000000" width="412.000000" height="247.000000" rx="0.000000" class=" fill-N7" stroke-width="0" /><g id=""Chicken's plan""><g class="shape" ></g><text x="0.000000" y="-30.000000" class="text fill-N1" style="text-anchor:middle;font-size:35px">Chicken's plan</text></g><mask id="d2-4132224283" maskUnits="userSpaceOnUse" x="-206" y="-166" width="412" height="247">
|
||||
<rect x="-206" y="-166" width="412" height="247" fill="white"></rect>
|
||||
<rect x="-105.000000" y="-65.000000" width="210" height="45" fill="rgba(0,0,0,0.75)"></rect>
|
||||
</mask></g><g style="animation: d2Transition-d2-281690071-1 5600ms infinite" class="d2-281690071" width="412" height="333" viewBox="-131 -166 412 333"><rect x="-131.000000" y="-166.000000" width="412.000000" height="333.000000" rx="0.000000" class=" fill-N7" stroke-width="0" /><g id="Approach road"><g class="shape" ><rect x="0.000000" y="0.000000" width="150.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="75.000000" y="38.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">Approach road</text></g><g id=""Chicken's plan""><g class="shape" ></g><text x="75.000000" y="-30.000000" class="text fill-N1" style="text-anchor:middle;font-size:35px">Chicken's plan</text></g><mask id="d2-2457953887" maskUnits="userSpaceOnUse" x="-131" y="-166" width="412" height="333">
|
||||
</mask></g><g style="animation: d2Transition-d2-4132224283-1 5600ms infinite" class="d2-4132224283" width="412" height="333" viewBox="-131 -166 412 333"><rect x="-131.000000" y="-166.000000" width="412.000000" height="333.000000" rx="0.000000" class=" fill-N7" stroke-width="0" /><g id=""Chicken's plan""><g class="shape" ></g><text x="75.000000" y="-30.000000" class="text fill-N1" style="text-anchor:middle;font-size:35px">Chicken's plan</text></g><g id="Approach road"><g class="shape" ><rect x="0.000000" y="0.000000" width="150.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="75.000000" y="38.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">Approach road</text></g><mask id="d2-3831827619" maskUnits="userSpaceOnUse" x="-131" y="-166" width="412" height="333">
|
||||
<rect x="-131" y="-166" width="412" height="333" fill="white"></rect>
|
||||
<rect x="22.500000" y="22.500000" width="105" height="21" fill="rgba(0,0,0,0.75)"></rect>
|
||||
<rect x="-30.000000" y="-65.000000" width="210" height="45" fill="rgba(0,0,0,0.75)"></rect>
|
||||
</mask></g><g style="animation: d2Transition-d2-281690071-2 5600ms infinite" class="d2-281690071" width="412" height="499" viewBox="-131 -166 412 499"><rect x="-131.000000" y="-166.000000" width="412.000000" height="499.000000" rx="0.000000" class=" fill-N7" stroke-width="0" /><g id="Approach road"><g class="shape" ><rect x="0.000000" y="0.000000" width="150.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="75.000000" y="38.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">Approach road</text></g><g id="Cross road"><g class="shape" ><rect x="15.000000" y="166.000000" width="120.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="75.000000" y="204.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">Cross road</text></g><g id=""Chicken's plan""><g class="shape" ></g><text x="75.000000" y="-30.000000" class="text fill-N1" style="text-anchor:middle;font-size:35px">Chicken's plan</text></g><g id="(Approach road -> Cross road)[0]"><marker id="mk-3488378134" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" class="connection fill-B1" stroke-width="2" /> </marker><path d="M 75.000000 68.000000 C 75.000000 106.000000 75.000000 126.000000 75.000000 162.000000" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-1673714443)" /></g><mask id="d2-1673714443" maskUnits="userSpaceOnUse" x="-131" y="-166" width="412" height="499">
|
||||
<rect x="22.500000" y="22.500000" width="105" height="21" fill="rgba(0,0,0,0.75)"></rect>
|
||||
</mask></g><g style="animation: d2Transition-d2-4132224283-2 5600ms infinite" class="d2-4132224283" width="412" height="499" viewBox="-131 -166 412 499"><rect x="-131.000000" y="-166.000000" width="412.000000" height="499.000000" rx="0.000000" class=" fill-N7" stroke-width="0" /><g id=""Chicken's plan""><g class="shape" ></g><text x="75.000000" y="-30.000000" class="text fill-N1" style="text-anchor:middle;font-size:35px">Chicken's plan</text></g><g id="Approach road"><g class="shape" ><rect x="0.000000" y="0.000000" width="150.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="75.000000" y="38.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">Approach road</text></g><g id="Cross road"><g class="shape" ><rect x="15.000000" y="166.000000" width="120.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="75.000000" y="204.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">Cross road</text></g><g id="(Approach road -> Cross road)[0]"><marker id="mk-3488378134" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" class="connection fill-B1" stroke-width="2" /> </marker><path d="M 75.000000 68.000000 C 75.000000 106.000000 75.000000 126.000000 75.000000 162.000000" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-434121175)" /></g><mask id="d2-434121175" maskUnits="userSpaceOnUse" x="-131" y="-166" width="412" height="499">
|
||||
<rect x="-131" y="-166" width="412" height="499" fill="white"></rect>
|
||||
<rect x="-30.000000" y="-65.000000" width="210" height="45" fill="rgba(0,0,0,0.75)"></rect>
|
||||
<rect x="22.500000" y="22.500000" width="105" height="21" fill="rgba(0,0,0,0.75)"></rect>
|
||||
<rect x="37.500000" y="188.500000" width="75" height="21" fill="rgba(0,0,0,0.75)"></rect>
|
||||
<rect x="-30.000000" y="-65.000000" width="210" height="45" fill="rgba(0,0,0,0.75)"></rect>
|
||||
</mask></g><g style="animation: d2Transition-d2-281690071-3 5600ms infinite" class="d2-281690071" width="412" height="665" viewBox="-104 -166 412 665"><rect x="-104.000000" y="-166.000000" width="412.000000" height="665.000000" rx="0.000000" class=" fill-N7" stroke-width="0" /><g id="Approach road"><g class="shape" ><rect x="27.000000" y="0.000000" width="150.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="102.000000" y="38.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">Approach road</text></g><g id="Cross road"><g class="shape" ><rect x="42.000000" y="166.000000" width="120.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="102.000000" y="204.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">Cross road</text></g><g id="Make you wonder why"><g class="shape" ><rect x="0.000000" y="332.000000" width="203.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="101.500000" y="370.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">Make you wonder why</text></g><g id=""Chicken's plan""><g class="shape" ></g><text x="102.000000" y="-30.000000" class="text fill-N1" style="text-anchor:middle;font-size:35px">Chicken's plan</text></g><g id="(Approach road -> Cross road)[0]"><marker id="mk-3488378134" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" class="connection fill-B1" stroke-width="2" /> </marker><path d="M 101.500000 68.000000 C 101.500000 106.000000 101.500000 126.000000 101.500000 162.000000" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-1425945673)" /></g><g id="(Cross road -> Make you wonder why)[0]"><path d="M 101.500000 234.000000 C 101.500000 272.000000 101.500000 292.000000 101.500000 328.000000" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-1425945673)" /></g><mask id="d2-1425945673" maskUnits="userSpaceOnUse" x="-104" y="-166" width="412" height="665">
|
||||
</mask></g><g style="animation: d2Transition-d2-4132224283-3 5600ms infinite" class="d2-4132224283" width="412" height="665" viewBox="-104 -166 412 665"><rect x="-104.000000" y="-166.000000" width="412.000000" height="665.000000" rx="0.000000" class=" fill-N7" stroke-width="0" /><g id=""Chicken's plan""><g class="shape" ></g><text x="102.000000" y="-30.000000" class="text fill-N1" style="text-anchor:middle;font-size:35px">Chicken's plan</text></g><g id="Approach road"><g class="shape" ><rect x="27.000000" y="0.000000" width="150.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="102.000000" y="38.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">Approach road</text></g><g id="Cross road"><g class="shape" ><rect x="42.000000" y="166.000000" width="120.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="102.000000" y="204.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">Cross road</text></g><g id="Make you wonder why"><g class="shape" ><rect x="0.000000" y="332.000000" width="203.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="101.500000" y="370.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">Make you wonder why</text></g><g id="(Approach road -> Cross road)[0]"><marker id="mk-3488378134" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" class="connection fill-B1" stroke-width="2" /> </marker><path d="M 101.500000 68.000000 C 101.500000 106.000000 101.500000 126.000000 101.500000 162.000000" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-2249258493)" /></g><g id="(Cross road -> Make you wonder why)[0]"><path d="M 101.500000 234.000000 C 101.500000 272.000000 101.500000 292.000000 101.500000 328.000000" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-2249258493)" /></g><mask id="d2-2249258493" maskUnits="userSpaceOnUse" x="-104" y="-166" width="412" height="665">
|
||||
<rect x="-104" y="-166" width="412" height="665" fill="white"></rect>
|
||||
<rect x="-3.000000" y="-65.000000" width="210" height="45" fill="rgba(0,0,0,0.75)"></rect>
|
||||
<rect x="49.500000" y="22.500000" width="105" height="21" fill="rgba(0,0,0,0.75)"></rect>
|
||||
<rect x="64.500000" y="188.500000" width="75" height="21" fill="rgba(0,0,0,0.75)"></rect>
|
||||
<rect x="22.500000" y="354.500000" width="158" height="21" fill="rgba(0,0,0,0.75)"></rect>
|
||||
<rect x="-3.000000" y="-65.000000" width="210" height="45" fill="rgba(0,0,0,0.75)"></rect>
|
||||
</mask></g></svg></svg>
|
||||
|
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 32 KiB |
|
|
@ -1,16 +1,16 @@
|
|||
<?xml version="1.0" encoding="utf-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" d2Version="v0.6.0-HEAD" preserveAspectRatio="xMinYMin meet" viewBox="0 0 606 665"><svg id="d2-svg" width="606" height="665" viewBox="-246 -166 606 665"><style type="text/css"><![CDATA[
|
||||
.d2-2490554576 .text-mono {
|
||||
font-family: "d2-2490554576-font-mono";
|
||||
.d2-3613474092 .text-mono {
|
||||
font-family: "d2-3613474092-font-mono";
|
||||
}
|
||||
@font-face {
|
||||
font-family: d2-2490554576-font-mono;
|
||||
font-family: d2-3613474092-font-mono;
|
||||
src: url("data:application/font-woff;base64,d09GRgABAAAAAA4IAAoAAAAAGOAAAgm6AAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAAA9AAAAGAAAABgld/X+GNtYXAAAAFUAAAAdgAAAJwCIwKbZ2x5ZgAAAcwAAARrAAAFUKhQnJNoZWFkAAAGOAAAADYAAAA2GanOOmhoZWEAAAZwAAAAJAAAACQGMwCbaG10eAAABpQAAABPAAAAUC7gBklsb2NhAAAG5AAAACoAAAAqDX4MOG1heHAAAAcQAAAAIAAAACAASAJhbmFtZQAABzAAAAa4AAAQztydAx9wb3N0AAAN6AAAACAAAAAg/7gAMwADAlgBkAAFAAACigJYAAAASwKKAlgAAAFeADIBIwAAAgsFCQMEAwICBCAAAvcCADgDAAAAAAAAAABBREJPAEAAIP//Au7/BgAAA9gBEWAAAZ8AAAAAAeYClAAAACAAA3icbMxNCgEBGIDhZ8wYf4NBWds5h6TIRiS5lev4jaPYu8OnxM67fBYvEqkEhcwBQ6VUbmRsYmZhZWNrZx/B16fmltY/j2e84hH3uMU1LnGOUxw/138lBipSmapcTV1DU0uhraOr1NPnDQAA//8BAAD//3M4HKwAAHicVJRdaBTnF8bPe2Z3xuS/f824md3GxP3IuzuTyK5J9p3dMbHuR4zJxkTdXTfG5mOjZhtjNB+mWGkJNoVqhVoYQepHYy8aaJFCe2l700JbitAibe8KemEvJCiVXmyhQndSZnYDloGZA/Oeh2ee8zsDdogD4Da8BhzUgAO2ggTARL8Y9CsKFQRNcTNNo14U4+SBoRPSr9pi55aXP7N1dD/tPv4WXiuf6Xrn5MnM47WvCufPv/+Y3AcEHwDuQh1qQARwCkyRZYXyPOdkTqpQYc37vVf0b7HV+X57WHh4NP4sQeaLRW22s3PWGEG9vHDvHgAAgdR6CXfgCmwHsDfLclSNxVjE5RZkmTbzvFTvcrFITHPzPJnIvj04eHFo91hTW0N3a2JcVccT4bS3TZl0ZG+cnrmRa/dFG/2p13O5N7plysIRAEAYBsBW1GGT6ZOJLOKS6nmqsEgsqsqUDn98beXDq4f7z87Pn+1H/c7K7c973ltaumh5WwTArajD/6y8pI1rkXxgfE3qjD/JIOq99/ue9QGBQwBYs3HWTJeJVPSLh/Jkaz5vPEPd+IM4ywskavxoaU8AkOfV81Em0qhfoiKTJlZXya3V1T7kenvL5b5KRicAsAd1cFS0GWGCk3KCdCLPkfqJn9cK35xF3bhL+p8bp8jRd38xey4B4HbUwV71I13KkX2ol+9WNdMAWIc6NFrvnW6mOU3HaiymUYGjnEI9KInpqTGfzTs+lbELyAULL4/JyPF21I21mRnyUnmBpH3DQ03LhkFwuWlo2Gd8aWrnAJBHHZwb2rIcNfPgFOpySWJu7NcEYk2m8kDdKF7uOK2SfHmBrFyOTDPjDiC0r5ewBVdgi+nwBTLM8fFKZXrNJh8ktH8xmVzcX7kPjI4ODIyOOnI3z8xcz2Suz5y5mevXLyxdubJ0QTd5mAJAr5WlVOXBUqRUFDeYmPqhf3bPnrn0a6eOHM4PnUI9MJTeNxIy/iHpVG+fBhZXxSpXm8H9go45lxeUij/tPbk7s/fTiY/OzR7IZg/Mok6zPYPjovE7kYyn5JVEMqVW5rF3vYQNuAJh62sVzeI+qsqyouzE/26FuRRutwdN36Qj/WYoEpzc1TPgjTYX/KmQdjwRnw6EfAdZZy+NNY21ppRd045oqCsY7tpJdzRtbv3/ju72yKFwOBDb7ldD3pZtjpa6cKpDHYqYHK+XLI6lauoiEys7GLNKnifh5Kud+UBCaYkHs52TDnWxQG4YUz3ZQCDbQ24Z04VFFQjUAuBBvApBAMYxpwfdLI6axtzVysk4ylX+GQI3Vyy0c3Yb4fjaWj6ZiQu1NbwNORu3c+TYdFJw2Dl77aYkXjWKjeE2v78t1FgqNYYqFbldniebPF0eT5fH+NvKUgbACOqwBcAf5Zjb5XKzWEzTGCcRfHB00hmot9XLzokjD56QT74LDra0DMrfGiNPzN6/yDEyiV+Ye0MUhQkCqWvAOWwgxx7NzT0CgH8BAAD//wEAAP//ZaMsVgAAAQAAAAIJurNBj59fDzz1AAMD6AAAAADcHQ33AAAAANwcc0v/P/46AxkEJAAAAAMAAgAAAAAAAAABAAAD2P7vAAACWP8//z8DGQABAAAAAAAAAAAAAAAAAAAAFHicLMohCoMAAEDRz487xdLyTjAYK2uCxd8EEQ/gIbyx3WJ/xsfAeBpfYzJ2YzBmYzEO42+MxtvYjNX43e5hvIzzAgAA//8BAAD///sEDVIAAAAAKgAqAE4AfgCcALIAygDgAPoBCgE4AVoBhgGqAdICFgI6AngClgKoAAAAAQAAABQB+AAqAGUABgABAAAAAAAAAAAAAAAAAAMAA3icnJZLbJPZFcd/zrkBv3gZVA0IVVcjhKYIjJ1JwE0g4JABwiBCSWbaClHVJMaxSOzIdmDoYhZdVl11XXUzXbQStAolaiaBQiCkagWq1EU1q666qLroqppFV9V3vuPEcRI6g5DI7z7O/57Xvf6Ai3ILIeKiEUiCcYQkSeMODvGOsZDklLEjyUXjTpKMGm8jyQ+Nt5Ni0jjKYT41jnGYXxrHOcKfjROc4D/GSQYjR4x30hupGO/iYORXxrvpiiwb72nxM8XByJfGe1d1YsBKR8o4wjc7vjDuYGfHl8bCZXHGrmVPJ+Ny1XgbR+SR8Xaeyd+No3S7XxjH6HZ/NU7Q1bnNeIf4zpzxTrqj3ws5ArujPzWOsDv6c+MODkTvGwvJ6IqxIxU1/Ugnqeg/jLeRilosQf5jUeMoh2IHjGP4WL9xnKOxHxgnyMR+YpwkHVsw3kFX7J/GO8nFmzq7OBy/ZrybU/FPjPe0+Jzi3bjlKrK3RXPfqub+CKTifzOOkIo35zt4N/5fY2Ff4qCx40AiY9zJgcQl420cSIwbb2df4lPjKJnEz4xjvJd4bhznaOJfxgm6k98wTpJLNjV3cir5Y+NdZJJ/MN7NxeS/jfe0+Jmia8cJ472BjszKM1mUV3gKLVyijOcwnkm8PJY5vMzKgizJnDyWV/JE5uS5fCb35bH8Hh+5JEvyQP4kT/DysIXnW3hFPpMHsiQP5XNZkKd4l5UFeSlL8rksyqLOvjL7WfmjvMZzveMLbgRnyCN5oCqhLwtyX+ZlTpYDHa6T4YYsy0t5Jk/ld2q/onq/wcszmZXXsiizuvPYFjufynON8YUsy5wsyW/lRXOW6xzhhryQ1/JYHspTWQxODc6Wl3h5pDOzahPObO7joS1Ovo+XOXkis5qFIMvLzXn196ie3pJfjqqna3VryXfbWknHG/PeUhXbsVpJfo2niwxZMniO2ahLR3nGqXKTIp4R7lGnQZEp6niGqDBGlRrT+n9B18bxvMcEDRpM08txjnNX/6UprKql1XKK43wr8Ie7lGkwgecaReoUqXHH1M5TpUIDzxUKTAW++HcYocoMNcYo+v2kW8d4zlFlXOkqNaqqWmKGSQrU6CJNhvfJ0UeeQQYYpm+dQtM+tD7WZh9aDTPAB3ysvtYpq5d+nfYEVRoaaYU7eLK6liZLlhP0MUWB2xR11y2KfKIeBwo9pDlBDye0Ll/ds/VZKGudCngaWp9xrV2w7zaeKrfeusJljTWoWGD3ERWtX7g2QsN2hqdXGOe42nuNdEIz5lV5Ritbo6y702/lzVUKGr9nkDSei6Ya9NWoZjf4O6P9FvhdpPI1+rPBPaYpMsqE5XOtH0c0hw3uak7XMj5JWStQ0U4OcjKjWQjjbmZthCEu4xlW/co65cvrFIJI2vssq32U1tgmNj13rf53KFDWDrnJpK6s3beCnpvnO8oNevFt2akzphWapqE1qqtWWmtQ4jjDnOdymyf/P0fj+jes/U1mVrsnjC7omuCW5xnRyo/4/XgGdDzEiGbkuwwxykWG+YhRHee5xjXyXGGUIT5Q22Gu6XswzBUG1WJIOVw7rzfgCt/H8yFDuifQLlp+wooFN3Nava+r72Evl5liWnMeeJ7WWIsa4devsOeWqTZt62ozRplbutNr/Sp61wuUrCum1cMpzWWzN9ZuXdgRUxpLUNu19RJVfV9renMDVc89ezuCbg19Cl+Ixleoavqteqa+msOi+rx+XLLfgbK+jeGr0/xGGdFfgrL+fo2p14FtEFHwe9k+M79hZkVrVeMm5bDXZIVz3NPTJu0eeW5qbGoRfplQ1yrUtUaBRz9SlWrzm8ReiyolfZ+mNXNjeqPu6SjsAv0q2XJvwV69mmb9dvN7ZMPZwVs1ae++19hKpn6IGxSYNJWKvZSeCjP6+1nT1fCuaWxk3+hPu1K99UtlQxWP6tveXpP22m62S79m2ivjsuuqvZndijvjzrp+l3cDrt99G+8y7TOU3Md4l8O7v+BdHu9OuozLux53wfW6jDvlci7vMkp51+tygVXkknK/ap3RHafdh8GKPNxyZX7LlRU976zLrp3gskpnXc71uT6Xcxdcj65m3DDe9bqzLuMGgnGzB9XvC6rT6067c24gVHenXb/rc5ebvegGXM6dcf3ufdUYbDmz2/W4wcCzZi9uujf04KTrcj3upOt2/WGmmv24pR8n3WmXcb16Tr9GlQlUm525hV89VpFTGn+wZ8D1BBlp7bWNdQ764Y012pBvtdjQHW/Umd+sM95osfI/AAAA//8BAAD//5uVuAcAAwAAAAAAAP+1ADIAAAABAAAAAAAAAAAAAAAAAAAAAA==");
|
||||
}
|
||||
.d2-2490554576 .text-mono-bold {
|
||||
font-family: "d2-2490554576-font-mono-bold";
|
||||
.d2-3613474092 .text-mono-bold {
|
||||
font-family: "d2-3613474092-font-mono-bold";
|
||||
}
|
||||
@font-face {
|
||||
font-family: d2-2490554576-font-mono-bold;
|
||||
font-family: d2-3613474092-font-mono-bold;
|
||||
src: url("data:application/font-woff;base64,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");
|
||||
}]]></style><style type="text/css"><![CDATA[.shape {
|
||||
shape-rendering: geometricPrecision;
|
||||
|
|
@ -25,92 +25,92 @@
|
|||
opacity: 0.5;
|
||||
}
|
||||
|
||||
.d2-2490554576 .fill-N1{fill:#000410;}
|
||||
.d2-2490554576 .fill-N2{fill:#0000B8;}
|
||||
.d2-2490554576 .fill-N3{fill:#9499AB;}
|
||||
.d2-2490554576 .fill-N4{fill:#CFD2DD;}
|
||||
.d2-2490554576 .fill-N5{fill:#C3DEF3;}
|
||||
.d2-2490554576 .fill-N6{fill:#EEF1F8;}
|
||||
.d2-2490554576 .fill-N7{fill:#FFFFFF;}
|
||||
.d2-2490554576 .fill-B1{fill:#000410;}
|
||||
.d2-2490554576 .fill-B2{fill:#0000E4;}
|
||||
.d2-2490554576 .fill-B3{fill:#5AA4DC;}
|
||||
.d2-2490554576 .fill-B4{fill:#E7E9EE;}
|
||||
.d2-2490554576 .fill-B5{fill:#F5F6F9;}
|
||||
.d2-2490554576 .fill-B6{fill:#FFFFFF;}
|
||||
.d2-2490554576 .fill-AA2{fill:#008566;}
|
||||
.d2-2490554576 .fill-AA4{fill:#45BBA5;}
|
||||
.d2-2490554576 .fill-AA5{fill:#7ACCBD;}
|
||||
.d2-2490554576 .fill-AB4{fill:#F1C759;}
|
||||
.d2-2490554576 .fill-AB5{fill:#F9E088;}
|
||||
.d2-2490554576 .stroke-N1{stroke:#000410;}
|
||||
.d2-2490554576 .stroke-N2{stroke:#0000B8;}
|
||||
.d2-2490554576 .stroke-N3{stroke:#9499AB;}
|
||||
.d2-2490554576 .stroke-N4{stroke:#CFD2DD;}
|
||||
.d2-2490554576 .stroke-N5{stroke:#C3DEF3;}
|
||||
.d2-2490554576 .stroke-N6{stroke:#EEF1F8;}
|
||||
.d2-2490554576 .stroke-N7{stroke:#FFFFFF;}
|
||||
.d2-2490554576 .stroke-B1{stroke:#000410;}
|
||||
.d2-2490554576 .stroke-B2{stroke:#0000E4;}
|
||||
.d2-2490554576 .stroke-B3{stroke:#5AA4DC;}
|
||||
.d2-2490554576 .stroke-B4{stroke:#E7E9EE;}
|
||||
.d2-2490554576 .stroke-B5{stroke:#F5F6F9;}
|
||||
.d2-2490554576 .stroke-B6{stroke:#FFFFFF;}
|
||||
.d2-2490554576 .stroke-AA2{stroke:#008566;}
|
||||
.d2-2490554576 .stroke-AA4{stroke:#45BBA5;}
|
||||
.d2-2490554576 .stroke-AA5{stroke:#7ACCBD;}
|
||||
.d2-2490554576 .stroke-AB4{stroke:#F1C759;}
|
||||
.d2-2490554576 .stroke-AB5{stroke:#F9E088;}
|
||||
.d2-2490554576 .background-color-N1{background-color:#000410;}
|
||||
.d2-2490554576 .background-color-N2{background-color:#0000B8;}
|
||||
.d2-2490554576 .background-color-N3{background-color:#9499AB;}
|
||||
.d2-2490554576 .background-color-N4{background-color:#CFD2DD;}
|
||||
.d2-2490554576 .background-color-N5{background-color:#C3DEF3;}
|
||||
.d2-2490554576 .background-color-N6{background-color:#EEF1F8;}
|
||||
.d2-2490554576 .background-color-N7{background-color:#FFFFFF;}
|
||||
.d2-2490554576 .background-color-B1{background-color:#000410;}
|
||||
.d2-2490554576 .background-color-B2{background-color:#0000E4;}
|
||||
.d2-2490554576 .background-color-B3{background-color:#5AA4DC;}
|
||||
.d2-2490554576 .background-color-B4{background-color:#E7E9EE;}
|
||||
.d2-2490554576 .background-color-B5{background-color:#F5F6F9;}
|
||||
.d2-2490554576 .background-color-B6{background-color:#FFFFFF;}
|
||||
.d2-2490554576 .background-color-AA2{background-color:#008566;}
|
||||
.d2-2490554576 .background-color-AA4{background-color:#45BBA5;}
|
||||
.d2-2490554576 .background-color-AA5{background-color:#7ACCBD;}
|
||||
.d2-2490554576 .background-color-AB4{background-color:#F1C759;}
|
||||
.d2-2490554576 .background-color-AB5{background-color:#F9E088;}
|
||||
.d2-2490554576 .color-N1{color:#000410;}
|
||||
.d2-2490554576 .color-N2{color:#0000B8;}
|
||||
.d2-2490554576 .color-N3{color:#9499AB;}
|
||||
.d2-2490554576 .color-N4{color:#CFD2DD;}
|
||||
.d2-2490554576 .color-N5{color:#C3DEF3;}
|
||||
.d2-2490554576 .color-N6{color:#EEF1F8;}
|
||||
.d2-2490554576 .color-N7{color:#FFFFFF;}
|
||||
.d2-2490554576 .color-B1{color:#000410;}
|
||||
.d2-2490554576 .color-B2{color:#0000E4;}
|
||||
.d2-2490554576 .color-B3{color:#5AA4DC;}
|
||||
.d2-2490554576 .color-B4{color:#E7E9EE;}
|
||||
.d2-2490554576 .color-B5{color:#F5F6F9;}
|
||||
.d2-2490554576 .color-B6{color:#FFFFFF;}
|
||||
.d2-2490554576 .color-AA2{color:#008566;}
|
||||
.d2-2490554576 .color-AA4{color:#45BBA5;}
|
||||
.d2-2490554576 .color-AA5{color:#7ACCBD;}
|
||||
.d2-2490554576 .color-AB4{color:#F1C759;}
|
||||
.d2-2490554576 .color-AB5{color:#F9E088;}.appendix text.text{fill:#000410}.md{--color-fg-default:#000410;--color-fg-muted:#0000B8;--color-fg-subtle:#9499AB;--color-canvas-default:#FFFFFF;--color-canvas-subtle:#EEF1F8;--color-border-default:#000410;--color-border-muted:#0000E4;--color-neutral-muted:#EEF1F8;--color-accent-fg:#0000E4;--color-accent-emphasis:#0000E4;--color-attention-subtle:#0000B8;--color-danger-fg:red;}.sketch-overlay-B1{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-B2{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-B3{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-B4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B6{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AA2{fill:url(#streaks-dark);mix-blend-mode:overlay}.sketch-overlay-AA4{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-AA5{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-AB4{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-AB5{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N1{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-N2{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-N3{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N4{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N5{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N6{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N7{fill:url(#streaks-bright);mix-blend-mode:darken}.light-code{display: block}.dark-code{display: none}]]></style><style type="text/css">.md em,
|
||||
.d2-3613474092 .fill-N1{fill:#000410;}
|
||||
.d2-3613474092 .fill-N2{fill:#0000B8;}
|
||||
.d2-3613474092 .fill-N3{fill:#9499AB;}
|
||||
.d2-3613474092 .fill-N4{fill:#CFD2DD;}
|
||||
.d2-3613474092 .fill-N5{fill:#C3DEF3;}
|
||||
.d2-3613474092 .fill-N6{fill:#EEF1F8;}
|
||||
.d2-3613474092 .fill-N7{fill:#FFFFFF;}
|
||||
.d2-3613474092 .fill-B1{fill:#000410;}
|
||||
.d2-3613474092 .fill-B2{fill:#0000E4;}
|
||||
.d2-3613474092 .fill-B3{fill:#5AA4DC;}
|
||||
.d2-3613474092 .fill-B4{fill:#E7E9EE;}
|
||||
.d2-3613474092 .fill-B5{fill:#F5F6F9;}
|
||||
.d2-3613474092 .fill-B6{fill:#FFFFFF;}
|
||||
.d2-3613474092 .fill-AA2{fill:#008566;}
|
||||
.d2-3613474092 .fill-AA4{fill:#45BBA5;}
|
||||
.d2-3613474092 .fill-AA5{fill:#7ACCBD;}
|
||||
.d2-3613474092 .fill-AB4{fill:#F1C759;}
|
||||
.d2-3613474092 .fill-AB5{fill:#F9E088;}
|
||||
.d2-3613474092 .stroke-N1{stroke:#000410;}
|
||||
.d2-3613474092 .stroke-N2{stroke:#0000B8;}
|
||||
.d2-3613474092 .stroke-N3{stroke:#9499AB;}
|
||||
.d2-3613474092 .stroke-N4{stroke:#CFD2DD;}
|
||||
.d2-3613474092 .stroke-N5{stroke:#C3DEF3;}
|
||||
.d2-3613474092 .stroke-N6{stroke:#EEF1F8;}
|
||||
.d2-3613474092 .stroke-N7{stroke:#FFFFFF;}
|
||||
.d2-3613474092 .stroke-B1{stroke:#000410;}
|
||||
.d2-3613474092 .stroke-B2{stroke:#0000E4;}
|
||||
.d2-3613474092 .stroke-B3{stroke:#5AA4DC;}
|
||||
.d2-3613474092 .stroke-B4{stroke:#E7E9EE;}
|
||||
.d2-3613474092 .stroke-B5{stroke:#F5F6F9;}
|
||||
.d2-3613474092 .stroke-B6{stroke:#FFFFFF;}
|
||||
.d2-3613474092 .stroke-AA2{stroke:#008566;}
|
||||
.d2-3613474092 .stroke-AA4{stroke:#45BBA5;}
|
||||
.d2-3613474092 .stroke-AA5{stroke:#7ACCBD;}
|
||||
.d2-3613474092 .stroke-AB4{stroke:#F1C759;}
|
||||
.d2-3613474092 .stroke-AB5{stroke:#F9E088;}
|
||||
.d2-3613474092 .background-color-N1{background-color:#000410;}
|
||||
.d2-3613474092 .background-color-N2{background-color:#0000B8;}
|
||||
.d2-3613474092 .background-color-N3{background-color:#9499AB;}
|
||||
.d2-3613474092 .background-color-N4{background-color:#CFD2DD;}
|
||||
.d2-3613474092 .background-color-N5{background-color:#C3DEF3;}
|
||||
.d2-3613474092 .background-color-N6{background-color:#EEF1F8;}
|
||||
.d2-3613474092 .background-color-N7{background-color:#FFFFFF;}
|
||||
.d2-3613474092 .background-color-B1{background-color:#000410;}
|
||||
.d2-3613474092 .background-color-B2{background-color:#0000E4;}
|
||||
.d2-3613474092 .background-color-B3{background-color:#5AA4DC;}
|
||||
.d2-3613474092 .background-color-B4{background-color:#E7E9EE;}
|
||||
.d2-3613474092 .background-color-B5{background-color:#F5F6F9;}
|
||||
.d2-3613474092 .background-color-B6{background-color:#FFFFFF;}
|
||||
.d2-3613474092 .background-color-AA2{background-color:#008566;}
|
||||
.d2-3613474092 .background-color-AA4{background-color:#45BBA5;}
|
||||
.d2-3613474092 .background-color-AA5{background-color:#7ACCBD;}
|
||||
.d2-3613474092 .background-color-AB4{background-color:#F1C759;}
|
||||
.d2-3613474092 .background-color-AB5{background-color:#F9E088;}
|
||||
.d2-3613474092 .color-N1{color:#000410;}
|
||||
.d2-3613474092 .color-N2{color:#0000B8;}
|
||||
.d2-3613474092 .color-N3{color:#9499AB;}
|
||||
.d2-3613474092 .color-N4{color:#CFD2DD;}
|
||||
.d2-3613474092 .color-N5{color:#C3DEF3;}
|
||||
.d2-3613474092 .color-N6{color:#EEF1F8;}
|
||||
.d2-3613474092 .color-N7{color:#FFFFFF;}
|
||||
.d2-3613474092 .color-B1{color:#000410;}
|
||||
.d2-3613474092 .color-B2{color:#0000E4;}
|
||||
.d2-3613474092 .color-B3{color:#5AA4DC;}
|
||||
.d2-3613474092 .color-B4{color:#E7E9EE;}
|
||||
.d2-3613474092 .color-B5{color:#F5F6F9;}
|
||||
.d2-3613474092 .color-B6{color:#FFFFFF;}
|
||||
.d2-3613474092 .color-AA2{color:#008566;}
|
||||
.d2-3613474092 .color-AA4{color:#45BBA5;}
|
||||
.d2-3613474092 .color-AA5{color:#7ACCBD;}
|
||||
.d2-3613474092 .color-AB4{color:#F1C759;}
|
||||
.d2-3613474092 .color-AB5{color:#F9E088;}.appendix text.text{fill:#000410}.md{--color-fg-default:#000410;--color-fg-muted:#0000B8;--color-fg-subtle:#9499AB;--color-canvas-default:#FFFFFF;--color-canvas-subtle:#EEF1F8;--color-border-default:#000410;--color-border-muted:#0000E4;--color-neutral-muted:#EEF1F8;--color-accent-fg:#0000E4;--color-accent-emphasis:#0000E4;--color-attention-subtle:#0000B8;--color-danger-fg:red;}.sketch-overlay-B1{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-B2{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-B3{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-B4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B6{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AA2{fill:url(#streaks-dark);mix-blend-mode:overlay}.sketch-overlay-AA4{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-AA5{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-AB4{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-AB5{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N1{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-N2{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-N3{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N4{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N5{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N6{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N7{fill:url(#streaks-bright);mix-blend-mode:darken}.light-code{display: block}.dark-code{display: none}]]></style><style type="text/css">.md em,
|
||||
.md dfn {
|
||||
font-family: "d2-2490554576-font-italic";
|
||||
font-family: "d2-3613474092-font-italic";
|
||||
}
|
||||
|
||||
.md b,
|
||||
.md strong {
|
||||
font-family: "d2-2490554576-font-bold";
|
||||
font-family: "d2-3613474092-font-bold";
|
||||
}
|
||||
|
||||
.md code,
|
||||
.md kbd,
|
||||
.md pre,
|
||||
.md samp {
|
||||
font-family: "d2-2490554576-font-mono";
|
||||
font-family: "d2-3613474092-font-mono";
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
|
|
@ -126,7 +126,7 @@
|
|||
margin: 0;
|
||||
color: var(--color-fg-default);
|
||||
background-color: transparent; /* we don't want to define the background color */
|
||||
font-family: "d2-2490554576-font-regular";
|
||||
font-family: "d2-3613474092-font-regular";
|
||||
font-size: 16px;
|
||||
line-height: 1.5;
|
||||
word-wrap: break-word;
|
||||
|
|
@ -832,7 +832,7 @@
|
|||
.md .contains-task-list:dir(rtl) .task-list-item-checkbox {
|
||||
margin: 0 -1.6em 0.25em 0.2em;
|
||||
}
|
||||
</style><style type="text/css"><![CDATA[@keyframes d2Transition-d2-2490554576-0 {
|
||||
</style><style type="text/css"><![CDATA[@keyframes d2Transition-d2-3613474092-0 {
|
||||
0%, 0.000000% {
|
||||
opacity: 0;
|
||||
}
|
||||
|
|
@ -842,7 +842,7 @@
|
|||
25.000000%, 100% {
|
||||
opacity: 0;
|
||||
}
|
||||
}@keyframes d2Transition-d2-2490554576-1 {
|
||||
}@keyframes d2Transition-d2-3613474092-1 {
|
||||
0%, 24.982143% {
|
||||
opacity: 0;
|
||||
}
|
||||
|
|
@ -852,7 +852,7 @@
|
|||
50.000000%, 100% {
|
||||
opacity: 0;
|
||||
}
|
||||
}@keyframes d2Transition-d2-2490554576-2 {
|
||||
}@keyframes d2Transition-d2-3613474092-2 {
|
||||
0%, 49.982143% {
|
||||
opacity: 0;
|
||||
}
|
||||
|
|
@ -862,29 +862,29 @@
|
|||
75.000000%, 100% {
|
||||
opacity: 0;
|
||||
}
|
||||
}@keyframes d2Transition-d2-2490554576-3 {
|
||||
}@keyframes d2Transition-d2-3613474092-3 {
|
||||
0%, 74.982143% {
|
||||
opacity: 0;
|
||||
}
|
||||
75.000000%, 100.000000% {
|
||||
opacity: 1;
|
||||
}
|
||||
}]]></style><g style="animation: d2Transition-d2-2490554576-0 5600ms infinite" class="d2-2490554576" width="492" height="247" viewBox="-246 -166 492 247"><rect x="-246.000000" y="-166.000000" width="492.000000" height="247.000000" rx="0.000000" class=" fill-N7" stroke-width="0" /><g id=""Chicken's plan""><g class="shape" ></g><text x="0.000000" y="-30.000000" class="text-mono fill-N1" style="text-anchor:middle;font-size:35px">CHICKEN'S PLAN</text></g><mask id="d2-2490554576" maskUnits="userSpaceOnUse" x="-246" y="-166" width="492" height="247">
|
||||
}]]></style><g style="animation: d2Transition-d2-3613474092-0 5600ms infinite" class="d2-3613474092" width="492" height="247" viewBox="-246 -166 492 247"><rect x="-246.000000" y="-166.000000" width="492.000000" height="247.000000" rx="0.000000" class=" fill-N7" stroke-width="0" /><g id=""Chicken's plan""><g class="shape" ></g><text x="0.000000" y="-30.000000" class="text-mono fill-N1" style="text-anchor:middle;font-size:35px">CHICKEN'S PLAN</text></g><mask id="d2-3613474092" maskUnits="userSpaceOnUse" x="-246" y="-166" width="492" height="247">
|
||||
<rect x="-246" y="-166" width="492" height="247" fill="white"></rect>
|
||||
<rect x="-145.000000" y="-65.000000" width="290" height="45" fill="rgba(0,0,0,0.75)"></rect>
|
||||
</mask></g><g style="animation: d2Transition-d2-2490554576-1 5600ms infinite" class="d2-2490554576" width="492" height="333" viewBox="-160 -166 492 333"><rect x="-160.000000" y="-166.000000" width="492.000000" height="333.000000" rx="0.000000" class=" fill-N7" stroke-width="0" /><g id="Approach road"><g class="shape" ><rect x="0.000000" y="0.000000" width="171.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="85.500000" y="38.500000" class="text-mono-bold fill-N1" style="text-anchor:middle;font-size:16px">APPROACH ROAD</text></g><g id=""Chicken's plan""><g class="shape" ></g><text x="86.000000" y="-30.000000" class="text-mono fill-N1" style="text-anchor:middle;font-size:35px">CHICKEN'S PLAN</text></g><mask id="d2-2806936782" maskUnits="userSpaceOnUse" x="-160" y="-166" width="492" height="333">
|
||||
</mask></g><g style="animation: d2Transition-d2-3613474092-1 5600ms infinite" class="d2-3613474092" width="492" height="333" viewBox="-160 -166 492 333"><rect x="-160.000000" y="-166.000000" width="492.000000" height="333.000000" rx="0.000000" class=" fill-N7" stroke-width="0" /><g id=""Chicken's plan""><g class="shape" ></g><text x="86.000000" y="-30.000000" class="text-mono fill-N1" style="text-anchor:middle;font-size:35px">CHICKEN'S PLAN</text></g><g id="Approach road"><g class="shape" ><rect x="0.000000" y="0.000000" width="171.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="85.500000" y="38.500000" class="text-mono-bold fill-N1" style="text-anchor:middle;font-size:16px">APPROACH ROAD</text></g><mask id="d2-121776770" maskUnits="userSpaceOnUse" x="-160" y="-166" width="492" height="333">
|
||||
<rect x="-160" y="-166" width="492" height="333" fill="white"></rect>
|
||||
<rect x="22.500000" y="22.500000" width="126" height="21" fill="rgba(0,0,0,0.75)"></rect>
|
||||
<rect x="-59.000000" y="-65.000000" width="290" height="45" fill="rgba(0,0,0,0.75)"></rect>
|
||||
</mask></g><g style="animation: d2Transition-d2-2490554576-2 5600ms infinite" class="d2-2490554576" width="492" height="499" viewBox="-160 -166 492 499"><rect x="-160.000000" y="-166.000000" width="492.000000" height="499.000000" rx="0.000000" class=" fill-N7" stroke-width="0" /><g id="Approach road"><g class="shape" ><rect x="0.000000" y="0.000000" width="171.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="85.500000" y="38.500000" class="text-mono-bold fill-N1" style="text-anchor:middle;font-size:16px">APPROACH ROAD</text></g><g id="Cross road"><g class="shape" ><rect x="15.000000" y="166.000000" width="142.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="86.000000" y="204.500000" class="text-mono-bold fill-N1" style="text-anchor:middle;font-size:16px">CROSS ROAD</text></g><g id=""Chicken's plan""><g class="shape" ></g><text x="86.000000" y="-30.000000" class="text-mono fill-N1" style="text-anchor:middle;font-size:35px">CHICKEN'S PLAN</text></g><g id="(Approach road -> Cross road)[0]"><marker id="mk-3488378134" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" class="connection fill-B1" stroke-width="2" /> </marker><path d="M 85.500000 68.000000 C 85.500000 106.000000 85.500000 126.000000 85.500000 162.000000" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-1595106799)" /></g><mask id="d2-1595106799" maskUnits="userSpaceOnUse" x="-160" y="-166" width="492" height="499">
|
||||
<rect x="22.500000" y="22.500000" width="126" height="21" fill="rgba(0,0,0,0.75)"></rect>
|
||||
</mask></g><g style="animation: d2Transition-d2-3613474092-2 5600ms infinite" class="d2-3613474092" width="492" height="499" viewBox="-160 -166 492 499"><rect x="-160.000000" y="-166.000000" width="492.000000" height="499.000000" rx="0.000000" class=" fill-N7" stroke-width="0" /><g id=""Chicken's plan""><g class="shape" ></g><text x="86.000000" y="-30.000000" class="text-mono fill-N1" style="text-anchor:middle;font-size:35px">CHICKEN'S PLAN</text></g><g id="Approach road"><g class="shape" ><rect x="0.000000" y="0.000000" width="171.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="85.500000" y="38.500000" class="text-mono-bold fill-N1" style="text-anchor:middle;font-size:16px">APPROACH ROAD</text></g><g id="Cross road"><g class="shape" ><rect x="15.000000" y="166.000000" width="142.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="86.000000" y="204.500000" class="text-mono-bold fill-N1" style="text-anchor:middle;font-size:16px">CROSS ROAD</text></g><g id="(Approach road -> Cross road)[0]"><marker id="mk-3488378134" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" class="connection fill-B1" stroke-width="2" /> </marker><path d="M 85.500000 68.000000 C 85.500000 106.000000 85.500000 126.000000 85.500000 162.000000" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-3408808003)" /></g><mask id="d2-3408808003" maskUnits="userSpaceOnUse" x="-160" y="-166" width="492" height="499">
|
||||
<rect x="-160" y="-166" width="492" height="499" fill="white"></rect>
|
||||
<rect x="-59.000000" y="-65.000000" width="290" height="45" fill="rgba(0,0,0,0.75)"></rect>
|
||||
<rect x="22.500000" y="22.500000" width="126" height="21" fill="rgba(0,0,0,0.75)"></rect>
|
||||
<rect x="37.500000" y="188.500000" width="97" height="21" fill="rgba(0,0,0,0.75)"></rect>
|
||||
<rect x="-59.000000" y="-65.000000" width="290" height="45" fill="rgba(0,0,0,0.75)"></rect>
|
||||
</mask></g><g style="animation: d2Transition-d2-2490554576-3 5600ms infinite" class="d2-2490554576" width="492" height="665" viewBox="-132 -166 492 665"><rect x="-132.000000" y="-166.000000" width="492.000000" height="665.000000" rx="0.000000" class=" fill-N7" stroke-width="0" /><g id="Approach road"><g class="shape" ><rect x="29.000000" y="0.000000" width="171.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="114.500000" y="38.500000" class="text-mono-bold fill-N1" style="text-anchor:middle;font-size:16px">APPROACH ROAD</text></g><g id="Cross road"><g class="shape" ><rect x="43.000000" y="166.000000" width="142.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="114.000000" y="204.500000" class="text-mono-bold fill-N1" style="text-anchor:middle;font-size:16px">CROSS ROAD</text></g><g id="Make you wonder why"><g class="shape" ><rect x="0.000000" y="332.000000" width="228.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="114.000000" y="370.500000" class="text-mono-bold fill-N1" style="text-anchor:middle;font-size:16px">MAKE YOU WONDER WHY</text></g><g id=""Chicken's plan""><g class="shape" ></g><text x="114.000000" y="-30.000000" class="text-mono fill-N1" style="text-anchor:middle;font-size:35px">CHICKEN'S PLAN</text></g><g id="(Approach road -> Cross road)[0]"><marker id="mk-3488378134" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" class="connection fill-B1" stroke-width="2" /> </marker><path d="M 114.000000 68.000000 C 114.000000 106.000000 114.000000 126.000000 114.000000 162.000000" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-3206865640)" /></g><g id="(Cross road -> Make you wonder why)[0]"><path d="M 114.000000 234.000000 C 114.000000 272.000000 114.000000 292.000000 114.000000 328.000000" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-3206865640)" /></g><mask id="d2-3206865640" maskUnits="userSpaceOnUse" x="-132" y="-166" width="492" height="665">
|
||||
</mask></g><g style="animation: d2Transition-d2-3613474092-3 5600ms infinite" class="d2-3613474092" width="492" height="665" viewBox="-132 -166 492 665"><rect x="-132.000000" y="-166.000000" width="492.000000" height="665.000000" rx="0.000000" class=" fill-N7" stroke-width="0" /><g id=""Chicken's plan""><g class="shape" ></g><text x="114.000000" y="-30.000000" class="text-mono fill-N1" style="text-anchor:middle;font-size:35px">CHICKEN'S PLAN</text></g><g id="Approach road"><g class="shape" ><rect x="29.000000" y="0.000000" width="171.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="114.500000" y="38.500000" class="text-mono-bold fill-N1" style="text-anchor:middle;font-size:16px">APPROACH ROAD</text></g><g id="Cross road"><g class="shape" ><rect x="43.000000" y="166.000000" width="142.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="114.000000" y="204.500000" class="text-mono-bold fill-N1" style="text-anchor:middle;font-size:16px">CROSS ROAD</text></g><g id="Make you wonder why"><g class="shape" ><rect x="0.000000" y="332.000000" width="228.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="114.000000" y="370.500000" class="text-mono-bold fill-N1" style="text-anchor:middle;font-size:16px">MAKE YOU WONDER WHY</text></g><g id="(Approach road -> Cross road)[0]"><marker id="mk-3488378134" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" class="connection fill-B1" stroke-width="2" /> </marker><path d="M 114.000000 68.000000 C 114.000000 106.000000 114.000000 126.000000 114.000000 162.000000" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-2337216452)" /></g><g id="(Cross road -> Make you wonder why)[0]"><path d="M 114.000000 234.000000 C 114.000000 272.000000 114.000000 292.000000 114.000000 328.000000" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-2337216452)" /></g><mask id="d2-2337216452" maskUnits="userSpaceOnUse" x="-132" y="-166" width="492" height="665">
|
||||
<rect x="-132" y="-166" width="492" height="665" fill="white"></rect>
|
||||
<rect x="-31.000000" y="-65.000000" width="290" height="45" fill="rgba(0,0,0,0.75)"></rect>
|
||||
<rect x="51.500000" y="22.500000" width="126" height="21" fill="rgba(0,0,0,0.75)"></rect>
|
||||
<rect x="65.500000" y="188.500000" width="97" height="21" fill="rgba(0,0,0,0.75)"></rect>
|
||||
<rect x="22.500000" y="354.500000" width="183" height="21" fill="rgba(0,0,0,0.75)"></rect>
|
||||
<rect x="-31.000000" y="-65.000000" width="290" height="45" fill="rgba(0,0,0,0.75)"></rect>
|
||||
</mask></g></svg></svg>
|
||||
|
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 33 KiB |
|
|
@ -21,8 +21,6 @@ import (
|
|||
"oss.terrastruct.com/d2/d2graph"
|
||||
"oss.terrastruct.com/d2/d2layouts/d2dagrelayout"
|
||||
"oss.terrastruct.com/d2/d2layouts/d2elklayout"
|
||||
"oss.terrastruct.com/d2/d2layouts/d2near"
|
||||
"oss.terrastruct.com/d2/d2layouts/d2sequence"
|
||||
"oss.terrastruct.com/d2/d2lib"
|
||||
"oss.terrastruct.com/d2/d2plugin"
|
||||
"oss.terrastruct.com/d2/d2renderers/d2animate"
|
||||
|
|
@ -108,8 +106,6 @@ func runa(t *testing.T, tcs []testCase) {
|
|||
// serde exercises serializing and deserializing the graph
|
||||
// We want to run all the steps leading up to serialization in the course of regular layout
|
||||
func serde(t *testing.T, tc testCase, ruler *textmeasure.Ruler) {
|
||||
ctx := context.Background()
|
||||
ctx = log.WithTB(ctx, t, nil)
|
||||
g, _, err := d2compiler.Compile("", strings.NewReader(tc.script), &d2compiler.CompileOptions{
|
||||
UTF16Pos: false,
|
||||
})
|
||||
|
|
@ -117,8 +113,6 @@ func serde(t *testing.T, tc testCase, ruler *textmeasure.Ruler) {
|
|||
if len(g.Objects) > 0 {
|
||||
err = g.SetDimensions(nil, ruler, nil)
|
||||
trequire.Nil(t, err)
|
||||
d2near.WithoutConstantNears(ctx, g)
|
||||
d2sequence.WithoutSequenceDiagrams(ctx, g)
|
||||
}
|
||||
b, err := d2graph.SerializeGraph(g)
|
||||
trequire.Nil(t, err)
|
||||
|
|
|
|||
|
|
@ -2835,6 +2835,7 @@ y: profits {
|
|||
loadFromFile(t, "dagre_spacing_right"),
|
||||
loadFromFile(t, "simple_grid_edges"),
|
||||
loadFromFile(t, "grid_nested_simple_edges"),
|
||||
loadFromFile(t, "nested_diagram_types"),
|
||||
}
|
||||
|
||||
runa(t, tcs)
|
||||
|
|
|
|||
48
e2etests/testdata/files/nested_diagram_types.d2
vendored
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
a
|
||||
b
|
||||
c
|
||||
|
||||
a: {
|
||||
grid-columns: 3
|
||||
|
||||
1
|
||||
2
|
||||
3
|
||||
3: {
|
||||
shape: sequence_diagram
|
||||
x
|
||||
y
|
||||
# TODO x -> y
|
||||
}
|
||||
|
||||
1 -> 2 -> 3
|
||||
|
||||
near: center-right
|
||||
}
|
||||
|
||||
b: {
|
||||
shape: sequence_diagram
|
||||
1 -> 2
|
||||
|
||||
near: bottom-right
|
||||
|
||||
2: {
|
||||
# TODO compile error grid on sequence actor?
|
||||
grid-columns: 3
|
||||
x
|
||||
y
|
||||
z
|
||||
}
|
||||
|
||||
1: {
|
||||
x: {
|
||||
# TODO compile error grid in sequence (group)
|
||||
# grid-columns: 3
|
||||
u
|
||||
v
|
||||
w
|
||||
}
|
||||
y
|
||||
z
|
||||
}
|
||||
}
|
||||
164
e2etests/testdata/regression/multiple_constant_nears/dagre/board.exp.json
generated
vendored
|
|
@ -3,47 +3,6 @@
|
|||
"isFolderOnly": false,
|
||||
"fontFamily": "SourceSansPro",
|
||||
"shapes": [
|
||||
{
|
||||
"id": "c",
|
||||
"type": "rectangle",
|
||||
"pos": {
|
||||
"x": 0,
|
||||
"y": 0
|
||||
},
|
||||
"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": 1
|
||||
},
|
||||
{
|
||||
"id": "a",
|
||||
"type": "rectangle",
|
||||
|
|
@ -85,6 +44,88 @@
|
|||
"zIndex": 0,
|
||||
"level": 1
|
||||
},
|
||||
{
|
||||
"id": "b",
|
||||
"type": "rectangle",
|
||||
"pos": {
|
||||
"x": 73,
|
||||
"y": 318
|
||||
},
|
||||
"width": 139,
|
||||
"height": 292,
|
||||
"opacity": 0.5,
|
||||
"strokeDash": 0,
|
||||
"strokeWidth": 2,
|
||||
"borderRadius": 0,
|
||||
"fill": "green",
|
||||
"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": 28,
|
||||
"fontFamily": "DEFAULT",
|
||||
"language": "",
|
||||
"color": "N1",
|
||||
"italic": false,
|
||||
"bold": false,
|
||||
"underline": false,
|
||||
"labelWidth": 13,
|
||||
"labelHeight": 36,
|
||||
"labelPosition": "OUTSIDE_TOP_CENTER",
|
||||
"zIndex": 0,
|
||||
"level": 1
|
||||
},
|
||||
{
|
||||
"id": "c",
|
||||
"type": "rectangle",
|
||||
"pos": {
|
||||
"x": 0,
|
||||
"y": 0
|
||||
},
|
||||
"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": 1
|
||||
},
|
||||
{
|
||||
"id": "a.1",
|
||||
"type": "rectangle",
|
||||
|
|
@ -208,47 +249,6 @@
|
|||
"zIndex": 0,
|
||||
"level": 2
|
||||
},
|
||||
{
|
||||
"id": "b",
|
||||
"type": "rectangle",
|
||||
"pos": {
|
||||
"x": 73,
|
||||
"y": 318
|
||||
},
|
||||
"width": 139,
|
||||
"height": 292,
|
||||
"opacity": 0.5,
|
||||
"strokeDash": 0,
|
||||
"strokeWidth": 2,
|
||||
"borderRadius": 0,
|
||||
"fill": "green",
|
||||
"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": 28,
|
||||
"fontFamily": "DEFAULT",
|
||||
"language": "",
|
||||
"color": "N1",
|
||||
"italic": false,
|
||||
"bold": false,
|
||||
"underline": false,
|
||||
"labelWidth": 13,
|
||||
"labelHeight": 36,
|
||||
"labelPosition": "OUTSIDE_TOP_CENTER",
|
||||
"zIndex": 0,
|
||||
"level": 1
|
||||
},
|
||||
{
|
||||
"id": "b.1111",
|
||||
"type": "rectangle",
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 15 KiB |
164
e2etests/testdata/regression/multiple_constant_nears/elk/board.exp.json
generated
vendored
|
|
@ -3,47 +3,6 @@
|
|||
"isFolderOnly": false,
|
||||
"fontFamily": "SourceSansPro",
|
||||
"shapes": [
|
||||
{
|
||||
"id": "c",
|
||||
"type": "rectangle",
|
||||
"pos": {
|
||||
"x": 12,
|
||||
"y": 12
|
||||
},
|
||||
"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": 1
|
||||
},
|
||||
{
|
||||
"id": "a",
|
||||
"type": "rectangle",
|
||||
|
|
@ -85,6 +44,88 @@
|
|||
"zIndex": 0,
|
||||
"level": 1
|
||||
},
|
||||
{
|
||||
"id": "b",
|
||||
"type": "rectangle",
|
||||
"pos": {
|
||||
"x": 85,
|
||||
"y": 284
|
||||
},
|
||||
"width": 179,
|
||||
"height": 302,
|
||||
"opacity": 0.5,
|
||||
"strokeDash": 0,
|
||||
"strokeWidth": 2,
|
||||
"borderRadius": 0,
|
||||
"fill": "green",
|
||||
"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": 28,
|
||||
"fontFamily": "DEFAULT",
|
||||
"language": "",
|
||||
"color": "N1",
|
||||
"italic": false,
|
||||
"bold": false,
|
||||
"underline": false,
|
||||
"labelWidth": 13,
|
||||
"labelHeight": 36,
|
||||
"labelPosition": "INSIDE_TOP_CENTER",
|
||||
"zIndex": 0,
|
||||
"level": 1
|
||||
},
|
||||
{
|
||||
"id": "c",
|
||||
"type": "rectangle",
|
||||
"pos": {
|
||||
"x": 12,
|
||||
"y": 12
|
||||
},
|
||||
"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": 1
|
||||
},
|
||||
{
|
||||
"id": "a.1",
|
||||
"type": "rectangle",
|
||||
|
|
@ -208,47 +249,6 @@
|
|||
"zIndex": 0,
|
||||
"level": 2
|
||||
},
|
||||
{
|
||||
"id": "b",
|
||||
"type": "rectangle",
|
||||
"pos": {
|
||||
"x": 85,
|
||||
"y": 284
|
||||
},
|
||||
"width": 179,
|
||||
"height": 302,
|
||||
"opacity": 0.5,
|
||||
"strokeDash": 0,
|
||||
"strokeWidth": 2,
|
||||
"borderRadius": 0,
|
||||
"fill": "green",
|
||||
"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": 28,
|
||||
"fontFamily": "DEFAULT",
|
||||
"language": "",
|
||||
"color": "N1",
|
||||
"italic": false,
|
||||
"bold": false,
|
||||
"underline": false,
|
||||
"labelWidth": 13,
|
||||
"labelHeight": 36,
|
||||
"labelPosition": "INSIDE_TOP_CENTER",
|
||||
"zIndex": 0,
|
||||
"level": 1
|
||||
},
|
||||
{
|
||||
"id": "b.1111",
|
||||
"type": "rectangle",
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
80
e2etests/testdata/regression/unconnected/dagre/board.exp.json
generated
vendored
|
|
@ -3,6 +3,46 @@
|
|||
"isFolderOnly": false,
|
||||
"fontFamily": "SourceSansPro",
|
||||
"shapes": [
|
||||
{
|
||||
"id": "title",
|
||||
"type": "text",
|
||||
"pos": {
|
||||
"x": 438,
|
||||
"y": -56
|
||||
},
|
||||
"width": 639,
|
||||
"height": 51,
|
||||
"opacity": 1,
|
||||
"strokeDash": 0,
|
||||
"strokeWidth": 2,
|
||||
"borderRadius": 0,
|
||||
"fill": "transparent",
|
||||
"stroke": "N1",
|
||||
"shadow": false,
|
||||
"3d": false,
|
||||
"multiple": false,
|
||||
"double-border": false,
|
||||
"tooltip": "",
|
||||
"link": "",
|
||||
"icon": null,
|
||||
"iconPosition": "",
|
||||
"blend": false,
|
||||
"fields": null,
|
||||
"methods": null,
|
||||
"columns": null,
|
||||
"label": "Workflow-I (Warehousing, Installation)",
|
||||
"fontSize": 40,
|
||||
"fontFamily": "DEFAULT",
|
||||
"language": "",
|
||||
"color": "N1",
|
||||
"italic": false,
|
||||
"bold": false,
|
||||
"underline": false,
|
||||
"labelWidth": 639,
|
||||
"labelHeight": 51,
|
||||
"zIndex": 0,
|
||||
"level": 1
|
||||
},
|
||||
{
|
||||
"id": "OEM Factory",
|
||||
"type": "rectangle",
|
||||
|
|
@ -493,46 +533,6 @@
|
|||
"labelPosition": "INSIDE_MIDDLE_CENTER",
|
||||
"zIndex": 0,
|
||||
"level": 2
|
||||
},
|
||||
{
|
||||
"id": "title",
|
||||
"type": "text",
|
||||
"pos": {
|
||||
"x": 438,
|
||||
"y": -56
|
||||
},
|
||||
"width": 639,
|
||||
"height": 51,
|
||||
"opacity": 1,
|
||||
"strokeDash": 0,
|
||||
"strokeWidth": 2,
|
||||
"borderRadius": 0,
|
||||
"fill": "transparent",
|
||||
"stroke": "N1",
|
||||
"shadow": false,
|
||||
"3d": false,
|
||||
"multiple": false,
|
||||
"double-border": false,
|
||||
"tooltip": "",
|
||||
"link": "",
|
||||
"icon": null,
|
||||
"iconPosition": "",
|
||||
"blend": false,
|
||||
"fields": null,
|
||||
"methods": null,
|
||||
"columns": null,
|
||||
"label": "Workflow-I (Warehousing, Installation)",
|
||||
"fontSize": 40,
|
||||
"fontFamily": "DEFAULT",
|
||||
"language": "",
|
||||
"color": "N1",
|
||||
"italic": false,
|
||||
"bold": false,
|
||||
"underline": false,
|
||||
"labelWidth": 639,
|
||||
"labelHeight": 51,
|
||||
"zIndex": 0,
|
||||
"level": 1
|
||||
}
|
||||
],
|
||||
"connections": [
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 45 KiB After Width: | Height: | Size: 45 KiB |
80
e2etests/testdata/regression/unconnected/elk/board.exp.json
generated
vendored
|
|
@ -3,6 +3,46 @@
|
|||
"isFolderOnly": false,
|
||||
"fontFamily": "SourceSansPro",
|
||||
"shapes": [
|
||||
{
|
||||
"id": "title",
|
||||
"type": "text",
|
||||
"pos": {
|
||||
"x": 482,
|
||||
"y": -59
|
||||
},
|
||||
"width": 639,
|
||||
"height": 51,
|
||||
"opacity": 1,
|
||||
"strokeDash": 0,
|
||||
"strokeWidth": 2,
|
||||
"borderRadius": 0,
|
||||
"fill": "transparent",
|
||||
"stroke": "N1",
|
||||
"shadow": false,
|
||||
"3d": false,
|
||||
"multiple": false,
|
||||
"double-border": false,
|
||||
"tooltip": "",
|
||||
"link": "",
|
||||
"icon": null,
|
||||
"iconPosition": "",
|
||||
"blend": false,
|
||||
"fields": null,
|
||||
"methods": null,
|
||||
"columns": null,
|
||||
"label": "Workflow-I (Warehousing, Installation)",
|
||||
"fontSize": 40,
|
||||
"fontFamily": "DEFAULT",
|
||||
"language": "",
|
||||
"color": "N1",
|
||||
"italic": false,
|
||||
"bold": false,
|
||||
"underline": false,
|
||||
"labelWidth": 639,
|
||||
"labelHeight": 51,
|
||||
"zIndex": 0,
|
||||
"level": 1
|
||||
},
|
||||
{
|
||||
"id": "OEM Factory",
|
||||
"type": "rectangle",
|
||||
|
|
@ -493,46 +533,6 @@
|
|||
"labelPosition": "INSIDE_MIDDLE_CENTER",
|
||||
"zIndex": 0,
|
||||
"level": 2
|
||||
},
|
||||
{
|
||||
"id": "title",
|
||||
"type": "text",
|
||||
"pos": {
|
||||
"x": 482,
|
||||
"y": -59
|
||||
},
|
||||
"width": 639,
|
||||
"height": 51,
|
||||
"opacity": 1,
|
||||
"strokeDash": 0,
|
||||
"strokeWidth": 2,
|
||||
"borderRadius": 0,
|
||||
"fill": "transparent",
|
||||
"stroke": "N1",
|
||||
"shadow": false,
|
||||
"3d": false,
|
||||
"multiple": false,
|
||||
"double-border": false,
|
||||
"tooltip": "",
|
||||
"link": "",
|
||||
"icon": null,
|
||||
"iconPosition": "",
|
||||
"blend": false,
|
||||
"fields": null,
|
||||
"methods": null,
|
||||
"columns": null,
|
||||
"label": "Workflow-I (Warehousing, Installation)",
|
||||
"fontSize": 40,
|
||||
"fontFamily": "DEFAULT",
|
||||
"language": "",
|
||||
"color": "N1",
|
||||
"italic": false,
|
||||
"bold": false,
|
||||
"underline": false,
|
||||
"labelWidth": 639,
|
||||
"labelHeight": 51,
|
||||
"zIndex": 0,
|
||||
"level": 1
|
||||
}
|
||||
],
|
||||
"connections": [
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 45 KiB After Width: | Height: | Size: 45 KiB |
80
e2etests/testdata/stable/constant_near_stress/dagre/board.exp.json
generated
vendored
|
|
@ -125,46 +125,6 @@
|
|||
"zIndex": 0,
|
||||
"level": 1
|
||||
},
|
||||
{
|
||||
"id": "bottom",
|
||||
"type": "text",
|
||||
"pos": {
|
||||
"x": -431,
|
||||
"y": 252
|
||||
},
|
||||
"width": 917,
|
||||
"height": 131,
|
||||
"opacity": 1,
|
||||
"strokeDash": 0,
|
||||
"strokeWidth": 2,
|
||||
"borderRadius": 0,
|
||||
"fill": "transparent",
|
||||
"stroke": "N1",
|
||||
"shadow": false,
|
||||
"3d": false,
|
||||
"multiple": false,
|
||||
"double-border": false,
|
||||
"tooltip": "",
|
||||
"link": "",
|
||||
"icon": null,
|
||||
"iconPosition": "",
|
||||
"blend": false,
|
||||
"fields": null,
|
||||
"methods": null,
|
||||
"columns": null,
|
||||
"label": "# Cats, no less liquid than their shadows, offer no angles to the wind.\n\nIf we can't fix it, it ain't broke.\n\nDieters live life in the fasting lane.",
|
||||
"fontSize": 16,
|
||||
"fontFamily": "DEFAULT",
|
||||
"language": "markdown",
|
||||
"color": "N1",
|
||||
"italic": false,
|
||||
"bold": false,
|
||||
"underline": false,
|
||||
"labelWidth": 917,
|
||||
"labelHeight": 131,
|
||||
"zIndex": 0,
|
||||
"level": 1
|
||||
},
|
||||
{
|
||||
"id": "Joe",
|
||||
"type": "person",
|
||||
|
|
@ -247,6 +207,46 @@
|
|||
"zIndex": 0,
|
||||
"level": 1
|
||||
},
|
||||
{
|
||||
"id": "bottom",
|
||||
"type": "text",
|
||||
"pos": {
|
||||
"x": -431,
|
||||
"y": 252
|
||||
},
|
||||
"width": 917,
|
||||
"height": 131,
|
||||
"opacity": 1,
|
||||
"strokeDash": 0,
|
||||
"strokeWidth": 2,
|
||||
"borderRadius": 0,
|
||||
"fill": "transparent",
|
||||
"stroke": "N1",
|
||||
"shadow": false,
|
||||
"3d": false,
|
||||
"multiple": false,
|
||||
"double-border": false,
|
||||
"tooltip": "",
|
||||
"link": "",
|
||||
"icon": null,
|
||||
"iconPosition": "",
|
||||
"blend": false,
|
||||
"fields": null,
|
||||
"methods": null,
|
||||
"columns": null,
|
||||
"label": "# Cats, no less liquid than their shadows, offer no angles to the wind.\n\nIf we can't fix it, it ain't broke.\n\nDieters live life in the fasting lane.",
|
||||
"fontSize": 16,
|
||||
"fontFamily": "DEFAULT",
|
||||
"language": "markdown",
|
||||
"color": "N1",
|
||||
"italic": false,
|
||||
"bold": false,
|
||||
"underline": false,
|
||||
"labelWidth": 917,
|
||||
"labelHeight": 131,
|
||||
"zIndex": 0,
|
||||
"level": 1
|
||||
},
|
||||
{
|
||||
"id": "i am top left",
|
||||
"type": "text",
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 38 KiB |
80
e2etests/testdata/stable/constant_near_stress/elk/board.exp.json
generated
vendored
|
|
@ -125,46 +125,6 @@
|
|||
"zIndex": 0,
|
||||
"level": 1
|
||||
},
|
||||
{
|
||||
"id": "bottom",
|
||||
"type": "text",
|
||||
"pos": {
|
||||
"x": -419,
|
||||
"y": 234
|
||||
},
|
||||
"width": 917,
|
||||
"height": 131,
|
||||
"opacity": 1,
|
||||
"strokeDash": 0,
|
||||
"strokeWidth": 2,
|
||||
"borderRadius": 0,
|
||||
"fill": "transparent",
|
||||
"stroke": "N1",
|
||||
"shadow": false,
|
||||
"3d": false,
|
||||
"multiple": false,
|
||||
"double-border": false,
|
||||
"tooltip": "",
|
||||
"link": "",
|
||||
"icon": null,
|
||||
"iconPosition": "",
|
||||
"blend": false,
|
||||
"fields": null,
|
||||
"methods": null,
|
||||
"columns": null,
|
||||
"label": "# Cats, no less liquid than their shadows, offer no angles to the wind.\n\nIf we can't fix it, it ain't broke.\n\nDieters live life in the fasting lane.",
|
||||
"fontSize": 16,
|
||||
"fontFamily": "DEFAULT",
|
||||
"language": "markdown",
|
||||
"color": "N1",
|
||||
"italic": false,
|
||||
"bold": false,
|
||||
"underline": false,
|
||||
"labelWidth": 917,
|
||||
"labelHeight": 131,
|
||||
"zIndex": 0,
|
||||
"level": 1
|
||||
},
|
||||
{
|
||||
"id": "Joe",
|
||||
"type": "person",
|
||||
|
|
@ -247,6 +207,46 @@
|
|||
"zIndex": 0,
|
||||
"level": 1
|
||||
},
|
||||
{
|
||||
"id": "bottom",
|
||||
"type": "text",
|
||||
"pos": {
|
||||
"x": -419,
|
||||
"y": 234
|
||||
},
|
||||
"width": 917,
|
||||
"height": 131,
|
||||
"opacity": 1,
|
||||
"strokeDash": 0,
|
||||
"strokeWidth": 2,
|
||||
"borderRadius": 0,
|
||||
"fill": "transparent",
|
||||
"stroke": "N1",
|
||||
"shadow": false,
|
||||
"3d": false,
|
||||
"multiple": false,
|
||||
"double-border": false,
|
||||
"tooltip": "",
|
||||
"link": "",
|
||||
"icon": null,
|
||||
"iconPosition": "",
|
||||
"blend": false,
|
||||
"fields": null,
|
||||
"methods": null,
|
||||
"columns": null,
|
||||
"label": "# Cats, no less liquid than their shadows, offer no angles to the wind.\n\nIf we can't fix it, it ain't broke.\n\nDieters live life in the fasting lane.",
|
||||
"fontSize": 16,
|
||||
"fontFamily": "DEFAULT",
|
||||
"language": "markdown",
|
||||
"color": "N1",
|
||||
"italic": false,
|
||||
"bold": false,
|
||||
"underline": false,
|
||||
"labelWidth": 917,
|
||||
"labelHeight": 131,
|
||||
"zIndex": 0,
|
||||
"level": 1
|
||||
},
|
||||
{
|
||||
"id": "i am top left",
|
||||
"type": "text",
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 38 KiB |
80
e2etests/testdata/stable/constant_near_title/dagre/board.exp.json
generated
vendored
|
|
@ -3,6 +3,46 @@
|
|||
"isFolderOnly": false,
|
||||
"fontFamily": "SourceSansPro",
|
||||
"shapes": [
|
||||
{
|
||||
"id": "title",
|
||||
"type": "text",
|
||||
"pos": {
|
||||
"x": 37,
|
||||
"y": -71
|
||||
},
|
||||
"width": 257,
|
||||
"height": 51,
|
||||
"opacity": 1,
|
||||
"strokeDash": 0,
|
||||
"strokeWidth": 2,
|
||||
"borderRadius": 0,
|
||||
"fill": "transparent",
|
||||
"stroke": "N1",
|
||||
"shadow": false,
|
||||
"3d": false,
|
||||
"multiple": false,
|
||||
"double-border": false,
|
||||
"tooltip": "",
|
||||
"link": "",
|
||||
"icon": null,
|
||||
"iconPosition": "",
|
||||
"blend": false,
|
||||
"fields": null,
|
||||
"methods": null,
|
||||
"columns": null,
|
||||
"label": "# A winning strategy",
|
||||
"fontSize": 16,
|
||||
"fontFamily": "DEFAULT",
|
||||
"language": "markdown",
|
||||
"color": "N1",
|
||||
"italic": false,
|
||||
"bold": false,
|
||||
"underline": false,
|
||||
"labelWidth": 257,
|
||||
"labelHeight": 51,
|
||||
"zIndex": 0,
|
||||
"level": 1
|
||||
},
|
||||
{
|
||||
"id": "poll the people",
|
||||
"type": "rectangle",
|
||||
|
|
@ -207,46 +247,6 @@
|
|||
"labelPosition": "INSIDE_MIDDLE_CENTER",
|
||||
"zIndex": 0,
|
||||
"level": 1
|
||||
},
|
||||
{
|
||||
"id": "title",
|
||||
"type": "text",
|
||||
"pos": {
|
||||
"x": 37,
|
||||
"y": -71
|
||||
},
|
||||
"width": 257,
|
||||
"height": 51,
|
||||
"opacity": 1,
|
||||
"strokeDash": 0,
|
||||
"strokeWidth": 2,
|
||||
"borderRadius": 0,
|
||||
"fill": "transparent",
|
||||
"stroke": "N1",
|
||||
"shadow": false,
|
||||
"3d": false,
|
||||
"multiple": false,
|
||||
"double-border": false,
|
||||
"tooltip": "",
|
||||
"link": "",
|
||||
"icon": null,
|
||||
"iconPosition": "",
|
||||
"blend": false,
|
||||
"fields": null,
|
||||
"methods": null,
|
||||
"columns": null,
|
||||
"label": "# A winning strategy",
|
||||
"fontSize": 16,
|
||||
"fontFamily": "DEFAULT",
|
||||
"language": "markdown",
|
||||
"color": "N1",
|
||||
"italic": false,
|
||||
"bold": false,
|
||||
"underline": false,
|
||||
"labelWidth": 257,
|
||||
"labelHeight": 51,
|
||||
"zIndex": 0,
|
||||
"level": 1
|
||||
}
|
||||
],
|
||||
"connections": [
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 36 KiB |
80
e2etests/testdata/stable/constant_near_title/elk/board.exp.json
generated
vendored
|
|
@ -3,6 +3,46 @@
|
|||
"isFolderOnly": false,
|
||||
"fontFamily": "SourceSansPro",
|
||||
"shapes": [
|
||||
{
|
||||
"id": "title",
|
||||
"type": "text",
|
||||
"pos": {
|
||||
"x": 29,
|
||||
"y": -59
|
||||
},
|
||||
"width": 257,
|
||||
"height": 51,
|
||||
"opacity": 1,
|
||||
"strokeDash": 0,
|
||||
"strokeWidth": 2,
|
||||
"borderRadius": 0,
|
||||
"fill": "transparent",
|
||||
"stroke": "N1",
|
||||
"shadow": false,
|
||||
"3d": false,
|
||||
"multiple": false,
|
||||
"double-border": false,
|
||||
"tooltip": "",
|
||||
"link": "",
|
||||
"icon": null,
|
||||
"iconPosition": "",
|
||||
"blend": false,
|
||||
"fields": null,
|
||||
"methods": null,
|
||||
"columns": null,
|
||||
"label": "# A winning strategy",
|
||||
"fontSize": 16,
|
||||
"fontFamily": "DEFAULT",
|
||||
"language": "markdown",
|
||||
"color": "N1",
|
||||
"italic": false,
|
||||
"bold": false,
|
||||
"underline": false,
|
||||
"labelWidth": 257,
|
||||
"labelHeight": 51,
|
||||
"zIndex": 0,
|
||||
"level": 1
|
||||
},
|
||||
{
|
||||
"id": "poll the people",
|
||||
"type": "rectangle",
|
||||
|
|
@ -207,46 +247,6 @@
|
|||
"labelPosition": "INSIDE_MIDDLE_CENTER",
|
||||
"zIndex": 0,
|
||||
"level": 1
|
||||
},
|
||||
{
|
||||
"id": "title",
|
||||
"type": "text",
|
||||
"pos": {
|
||||
"x": 29,
|
||||
"y": -59
|
||||
},
|
||||
"width": 257,
|
||||
"height": 51,
|
||||
"opacity": 1,
|
||||
"strokeDash": 0,
|
||||
"strokeWidth": 2,
|
||||
"borderRadius": 0,
|
||||
"fill": "transparent",
|
||||
"stroke": "N1",
|
||||
"shadow": false,
|
||||
"3d": false,
|
||||
"multiple": false,
|
||||
"double-border": false,
|
||||
"tooltip": "",
|
||||
"link": "",
|
||||
"icon": null,
|
||||
"iconPosition": "",
|
||||
"blend": false,
|
||||
"fields": null,
|
||||
"methods": null,
|
||||
"columns": null,
|
||||
"label": "# A winning strategy",
|
||||
"fontSize": 16,
|
||||
"fontFamily": "DEFAULT",
|
||||
"language": "markdown",
|
||||
"color": "N1",
|
||||
"italic": false,
|
||||
"bold": false,
|
||||
"underline": false,
|
||||
"labelWidth": 257,
|
||||
"labelHeight": 51,
|
||||
"zIndex": 0,
|
||||
"level": 1
|
||||
}
|
||||
],
|
||||
"connections": [
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 36 KiB |
844
e2etests/testdata/stable/near_keys_for_container#01/dagre/board.exp.json
generated
vendored
|
|
@ -3,334 +3,6 @@
|
|||
"isFolderOnly": false,
|
||||
"fontFamily": "SourceSansPro",
|
||||
"shapes": [
|
||||
{
|
||||
"id": "z",
|
||||
"type": "rectangle",
|
||||
"pos": {
|
||||
"x": -113,
|
||||
"y": 56
|
||||
},
|
||||
"width": 227,
|
||||
"height": 292,
|
||||
"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": "z",
|
||||
"fontSize": 28,
|
||||
"fontFamily": "DEFAULT",
|
||||
"language": "",
|
||||
"color": "N1",
|
||||
"italic": false,
|
||||
"bold": false,
|
||||
"underline": false,
|
||||
"labelWidth": 12,
|
||||
"labelHeight": 36,
|
||||
"labelPosition": "OUTSIDE_TOP_CENTER",
|
||||
"zIndex": 0,
|
||||
"level": 1
|
||||
},
|
||||
{
|
||||
"id": "z.a",
|
||||
"type": "rectangle",
|
||||
"pos": {
|
||||
"x": -83,
|
||||
"y": 86
|
||||
},
|
||||
"width": 53,
|
||||
"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": "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": 2
|
||||
},
|
||||
{
|
||||
"id": "z.b",
|
||||
"type": "rectangle",
|
||||
"pos": {
|
||||
"x": -83,
|
||||
"y": 252
|
||||
},
|
||||
"width": 53,
|
||||
"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": "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": 2
|
||||
},
|
||||
{
|
||||
"id": "z.c",
|
||||
"type": "rectangle",
|
||||
"pos": {
|
||||
"x": 30,
|
||||
"y": 86
|
||||
},
|
||||
"width": 53,
|
||||
"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": "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": 2
|
||||
},
|
||||
{
|
||||
"id": "z.d",
|
||||
"type": "rectangle",
|
||||
"pos": {
|
||||
"x": 29,
|
||||
"y": 252
|
||||
},
|
||||
"width": 54,
|
||||
"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": "d",
|
||||
"fontSize": 16,
|
||||
"fontFamily": "DEFAULT",
|
||||
"language": "",
|
||||
"color": "N1",
|
||||
"italic": false,
|
||||
"bold": true,
|
||||
"underline": false,
|
||||
"labelWidth": 9,
|
||||
"labelHeight": 21,
|
||||
"labelPosition": "INSIDE_MIDDLE_CENTER",
|
||||
"zIndex": 0,
|
||||
"level": 2
|
||||
},
|
||||
{
|
||||
"id": "a",
|
||||
"type": "rectangle",
|
||||
"pos": {
|
||||
"x": -86,
|
||||
"y": -217
|
||||
},
|
||||
"width": 173,
|
||||
"height": 197,
|
||||
"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": "a",
|
||||
"fontSize": 28,
|
||||
"fontFamily": "DEFAULT",
|
||||
"language": "",
|
||||
"color": "N1",
|
||||
"italic": false,
|
||||
"bold": false,
|
||||
"underline": false,
|
||||
"labelWidth": 12,
|
||||
"labelHeight": 36,
|
||||
"labelPosition": "OUTSIDE_TOP_CENTER",
|
||||
"zIndex": 0,
|
||||
"level": 1
|
||||
},
|
||||
{
|
||||
"id": "a.b",
|
||||
"type": "rectangle",
|
||||
"pos": {
|
||||
"x": -56,
|
||||
"y": -176
|
||||
},
|
||||
"width": 113,
|
||||
"height": 126,
|
||||
"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": "b",
|
||||
"fontSize": 24,
|
||||
"fontFamily": "DEFAULT",
|
||||
"language": "",
|
||||
"color": "N1",
|
||||
"italic": false,
|
||||
"bold": false,
|
||||
"underline": false,
|
||||
"labelWidth": 12,
|
||||
"labelHeight": 31,
|
||||
"labelPosition": "OUTSIDE_TOP_CENTER",
|
||||
"zIndex": 0,
|
||||
"level": 2
|
||||
},
|
||||
{
|
||||
"id": "a.b.c",
|
||||
"type": "rectangle",
|
||||
"pos": {
|
||||
"x": -26,
|
||||
"y": -146
|
||||
},
|
||||
"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": "x",
|
||||
"type": "rectangle",
|
||||
|
|
@ -741,6 +413,334 @@
|
|||
"zIndex": 0,
|
||||
"level": 2
|
||||
},
|
||||
{
|
||||
"id": "z",
|
||||
"type": "rectangle",
|
||||
"pos": {
|
||||
"x": -113,
|
||||
"y": 56
|
||||
},
|
||||
"width": 227,
|
||||
"height": 292,
|
||||
"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": "z",
|
||||
"fontSize": 28,
|
||||
"fontFamily": "DEFAULT",
|
||||
"language": "",
|
||||
"color": "N1",
|
||||
"italic": false,
|
||||
"bold": false,
|
||||
"underline": false,
|
||||
"labelWidth": 12,
|
||||
"labelHeight": 36,
|
||||
"labelPosition": "OUTSIDE_TOP_CENTER",
|
||||
"zIndex": 0,
|
||||
"level": 1
|
||||
},
|
||||
{
|
||||
"id": "z.a",
|
||||
"type": "rectangle",
|
||||
"pos": {
|
||||
"x": -83,
|
||||
"y": 86
|
||||
},
|
||||
"width": 53,
|
||||
"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": "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": 2
|
||||
},
|
||||
{
|
||||
"id": "z.b",
|
||||
"type": "rectangle",
|
||||
"pos": {
|
||||
"x": -83,
|
||||
"y": 252
|
||||
},
|
||||
"width": 53,
|
||||
"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": "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": 2
|
||||
},
|
||||
{
|
||||
"id": "z.c",
|
||||
"type": "rectangle",
|
||||
"pos": {
|
||||
"x": 30,
|
||||
"y": 86
|
||||
},
|
||||
"width": 53,
|
||||
"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": "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": 2
|
||||
},
|
||||
{
|
||||
"id": "z.d",
|
||||
"type": "rectangle",
|
||||
"pos": {
|
||||
"x": 29,
|
||||
"y": 252
|
||||
},
|
||||
"width": 54,
|
||||
"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": "d",
|
||||
"fontSize": 16,
|
||||
"fontFamily": "DEFAULT",
|
||||
"language": "",
|
||||
"color": "N1",
|
||||
"italic": false,
|
||||
"bold": true,
|
||||
"underline": false,
|
||||
"labelWidth": 9,
|
||||
"labelHeight": 21,
|
||||
"labelPosition": "INSIDE_MIDDLE_CENTER",
|
||||
"zIndex": 0,
|
||||
"level": 2
|
||||
},
|
||||
{
|
||||
"id": "a",
|
||||
"type": "rectangle",
|
||||
"pos": {
|
||||
"x": -86,
|
||||
"y": -217
|
||||
},
|
||||
"width": 173,
|
||||
"height": 197,
|
||||
"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": "a",
|
||||
"fontSize": 28,
|
||||
"fontFamily": "DEFAULT",
|
||||
"language": "",
|
||||
"color": "N1",
|
||||
"italic": false,
|
||||
"bold": false,
|
||||
"underline": false,
|
||||
"labelWidth": 12,
|
||||
"labelHeight": 36,
|
||||
"labelPosition": "OUTSIDE_TOP_CENTER",
|
||||
"zIndex": 0,
|
||||
"level": 1
|
||||
},
|
||||
{
|
||||
"id": "a.b",
|
||||
"type": "rectangle",
|
||||
"pos": {
|
||||
"x": -56,
|
||||
"y": -176
|
||||
},
|
||||
"width": 113,
|
||||
"height": 126,
|
||||
"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": "b",
|
||||
"fontSize": 24,
|
||||
"fontFamily": "DEFAULT",
|
||||
"language": "",
|
||||
"color": "N1",
|
||||
"italic": false,
|
||||
"bold": false,
|
||||
"underline": false,
|
||||
"labelWidth": 12,
|
||||
"labelHeight": 31,
|
||||
"labelPosition": "OUTSIDE_TOP_CENTER",
|
||||
"zIndex": 0,
|
||||
"level": 2
|
||||
},
|
||||
{
|
||||
"id": "a.b.c",
|
||||
"type": "rectangle",
|
||||
"pos": {
|
||||
"x": -26,
|
||||
"y": -146
|
||||
},
|
||||
"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": "b",
|
||||
"type": "rectangle",
|
||||
|
|
@ -907,100 +907,6 @@
|
|||
}
|
||||
],
|
||||
"connections": [
|
||||
{
|
||||
"id": "z.(a -> b)[0]",
|
||||
"src": "z.a",
|
||||
"srcArrow": "none",
|
||||
"dst": "z.b",
|
||||
"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": -57,
|
||||
"y": 152
|
||||
},
|
||||
{
|
||||
"x": -57,
|
||||
"y": 192
|
||||
},
|
||||
{
|
||||
"x": -57,
|
||||
"y": 212
|
||||
},
|
||||
{
|
||||
"x": -57,
|
||||
"y": 252
|
||||
}
|
||||
],
|
||||
"isCurve": true,
|
||||
"animated": false,
|
||||
"tooltip": "",
|
||||
"icon": null,
|
||||
"zIndex": 0
|
||||
},
|
||||
{
|
||||
"id": "z.(c -> d)[0]",
|
||||
"src": "z.c",
|
||||
"srcArrow": "none",
|
||||
"dst": "z.d",
|
||||
"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": 56.5,
|
||||
"y": 152
|
||||
},
|
||||
{
|
||||
"x": 56.5,
|
||||
"y": 192
|
||||
},
|
||||
{
|
||||
"x": 56.5,
|
||||
"y": 212
|
||||
},
|
||||
{
|
||||
"x": 56.5,
|
||||
"y": 252
|
||||
}
|
||||
],
|
||||
"isCurve": true,
|
||||
"animated": false,
|
||||
"tooltip": "",
|
||||
"icon": null,
|
||||
"zIndex": 0
|
||||
},
|
||||
{
|
||||
"id": "x.(a -> b)[0]",
|
||||
"src": "x.a",
|
||||
|
|
@ -1188,6 +1094,100 @@
|
|||
"tooltip": "",
|
||||
"icon": null,
|
||||
"zIndex": 0
|
||||
},
|
||||
{
|
||||
"id": "z.(a -> b)[0]",
|
||||
"src": "z.a",
|
||||
"srcArrow": "none",
|
||||
"dst": "z.b",
|
||||
"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": -57,
|
||||
"y": 152
|
||||
},
|
||||
{
|
||||
"x": -57,
|
||||
"y": 192
|
||||
},
|
||||
{
|
||||
"x": -57,
|
||||
"y": 212
|
||||
},
|
||||
{
|
||||
"x": -57,
|
||||
"y": 252
|
||||
}
|
||||
],
|
||||
"isCurve": true,
|
||||
"animated": false,
|
||||
"tooltip": "",
|
||||
"icon": null,
|
||||
"zIndex": 0
|
||||
},
|
||||
{
|
||||
"id": "z.(c -> d)[0]",
|
||||
"src": "z.c",
|
||||
"srcArrow": "none",
|
||||
"dst": "z.d",
|
||||
"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": 56.5,
|
||||
"y": 152
|
||||
},
|
||||
{
|
||||
"x": 56.5,
|
||||
"y": 192
|
||||
},
|
||||
{
|
||||
"x": 56.5,
|
||||
"y": 212
|
||||
},
|
||||
{
|
||||
"x": 56.5,
|
||||
"y": 252
|
||||
}
|
||||
],
|
||||
"isCurve": true,
|
||||
"animated": false,
|
||||
"tooltip": "",
|
||||
"icon": null,
|
||||
"zIndex": 0
|
||||
}
|
||||
],
|
||||
"root": {
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
808
e2etests/testdata/stable/near_keys_for_container#01/elk/board.exp.json
generated
vendored
|
|
@ -3,334 +3,6 @@
|
|||
"isFolderOnly": false,
|
||||
"fontFamily": "SourceSansPro",
|
||||
"shapes": [
|
||||
{
|
||||
"id": "z",
|
||||
"type": "rectangle",
|
||||
"pos": {
|
||||
"x": -113,
|
||||
"y": 20
|
||||
},
|
||||
"width": 227,
|
||||
"height": 302,
|
||||
"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": "z",
|
||||
"fontSize": 28,
|
||||
"fontFamily": "DEFAULT",
|
||||
"language": "",
|
||||
"color": "N1",
|
||||
"italic": false,
|
||||
"bold": false,
|
||||
"underline": false,
|
||||
"labelWidth": 12,
|
||||
"labelHeight": 36,
|
||||
"labelPosition": "INSIDE_TOP_CENTER",
|
||||
"zIndex": 0,
|
||||
"level": 1
|
||||
},
|
||||
{
|
||||
"id": "z.a",
|
||||
"type": "rectangle",
|
||||
"pos": {
|
||||
"x": -63,
|
||||
"y": 70
|
||||
},
|
||||
"width": 53,
|
||||
"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": "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": 2
|
||||
},
|
||||
{
|
||||
"id": "z.b",
|
||||
"type": "rectangle",
|
||||
"pos": {
|
||||
"x": -63,
|
||||
"y": 206
|
||||
},
|
||||
"width": 53,
|
||||
"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": "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": 2
|
||||
},
|
||||
{
|
||||
"id": "z.c",
|
||||
"type": "rectangle",
|
||||
"pos": {
|
||||
"x": 10,
|
||||
"y": 70
|
||||
},
|
||||
"width": 53,
|
||||
"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": "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": 2
|
||||
},
|
||||
{
|
||||
"id": "z.d",
|
||||
"type": "rectangle",
|
||||
"pos": {
|
||||
"x": 9,
|
||||
"y": 206
|
||||
},
|
||||
"width": 54,
|
||||
"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": "d",
|
||||
"fontSize": 16,
|
||||
"fontFamily": "DEFAULT",
|
||||
"language": "",
|
||||
"color": "N1",
|
||||
"italic": false,
|
||||
"bold": true,
|
||||
"underline": false,
|
||||
"labelWidth": 9,
|
||||
"labelHeight": 21,
|
||||
"labelPosition": "INSIDE_MIDDLE_CENTER",
|
||||
"zIndex": 0,
|
||||
"level": 2
|
||||
},
|
||||
{
|
||||
"id": "a",
|
||||
"type": "rectangle",
|
||||
"pos": {
|
||||
"x": -126,
|
||||
"y": -286
|
||||
},
|
||||
"width": 253,
|
||||
"height": 266,
|
||||
"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": "a",
|
||||
"fontSize": 28,
|
||||
"fontFamily": "DEFAULT",
|
||||
"language": "",
|
||||
"color": "N1",
|
||||
"italic": false,
|
||||
"bold": false,
|
||||
"underline": false,
|
||||
"labelWidth": 12,
|
||||
"labelHeight": 36,
|
||||
"labelPosition": "INSIDE_TOP_CENTER",
|
||||
"zIndex": 0,
|
||||
"level": 1
|
||||
},
|
||||
{
|
||||
"id": "a.b",
|
||||
"type": "rectangle",
|
||||
"pos": {
|
||||
"x": -76,
|
||||
"y": -236
|
||||
},
|
||||
"width": 153,
|
||||
"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": "b",
|
||||
"fontSize": 24,
|
||||
"fontFamily": "DEFAULT",
|
||||
"language": "",
|
||||
"color": "N1",
|
||||
"italic": false,
|
||||
"bold": false,
|
||||
"underline": false,
|
||||
"labelWidth": 12,
|
||||
"labelHeight": 31,
|
||||
"labelPosition": "INSIDE_TOP_CENTER",
|
||||
"zIndex": 0,
|
||||
"level": 2
|
||||
},
|
||||
{
|
||||
"id": "a.b.c",
|
||||
"type": "rectangle",
|
||||
"pos": {
|
||||
"x": -26,
|
||||
"y": -186
|
||||
},
|
||||
"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": "x",
|
||||
"type": "rectangle",
|
||||
|
|
@ -741,6 +413,334 @@
|
|||
"zIndex": 0,
|
||||
"level": 2
|
||||
},
|
||||
{
|
||||
"id": "z",
|
||||
"type": "rectangle",
|
||||
"pos": {
|
||||
"x": -113,
|
||||
"y": 20
|
||||
},
|
||||
"width": 227,
|
||||
"height": 302,
|
||||
"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": "z",
|
||||
"fontSize": 28,
|
||||
"fontFamily": "DEFAULT",
|
||||
"language": "",
|
||||
"color": "N1",
|
||||
"italic": false,
|
||||
"bold": false,
|
||||
"underline": false,
|
||||
"labelWidth": 12,
|
||||
"labelHeight": 36,
|
||||
"labelPosition": "INSIDE_TOP_CENTER",
|
||||
"zIndex": 0,
|
||||
"level": 1
|
||||
},
|
||||
{
|
||||
"id": "z.a",
|
||||
"type": "rectangle",
|
||||
"pos": {
|
||||
"x": -63,
|
||||
"y": 70
|
||||
},
|
||||
"width": 53,
|
||||
"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": "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": 2
|
||||
},
|
||||
{
|
||||
"id": "z.b",
|
||||
"type": "rectangle",
|
||||
"pos": {
|
||||
"x": -63,
|
||||
"y": 206
|
||||
},
|
||||
"width": 53,
|
||||
"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": "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": 2
|
||||
},
|
||||
{
|
||||
"id": "z.c",
|
||||
"type": "rectangle",
|
||||
"pos": {
|
||||
"x": 10,
|
||||
"y": 70
|
||||
},
|
||||
"width": 53,
|
||||
"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": "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": 2
|
||||
},
|
||||
{
|
||||
"id": "z.d",
|
||||
"type": "rectangle",
|
||||
"pos": {
|
||||
"x": 9,
|
||||
"y": 206
|
||||
},
|
||||
"width": 54,
|
||||
"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": "d",
|
||||
"fontSize": 16,
|
||||
"fontFamily": "DEFAULT",
|
||||
"language": "",
|
||||
"color": "N1",
|
||||
"italic": false,
|
||||
"bold": true,
|
||||
"underline": false,
|
||||
"labelWidth": 9,
|
||||
"labelHeight": 21,
|
||||
"labelPosition": "INSIDE_MIDDLE_CENTER",
|
||||
"zIndex": 0,
|
||||
"level": 2
|
||||
},
|
||||
{
|
||||
"id": "a",
|
||||
"type": "rectangle",
|
||||
"pos": {
|
||||
"x": -126,
|
||||
"y": -286
|
||||
},
|
||||
"width": 253,
|
||||
"height": 266,
|
||||
"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": "a",
|
||||
"fontSize": 28,
|
||||
"fontFamily": "DEFAULT",
|
||||
"language": "",
|
||||
"color": "N1",
|
||||
"italic": false,
|
||||
"bold": false,
|
||||
"underline": false,
|
||||
"labelWidth": 12,
|
||||
"labelHeight": 36,
|
||||
"labelPosition": "INSIDE_TOP_CENTER",
|
||||
"zIndex": 0,
|
||||
"level": 1
|
||||
},
|
||||
{
|
||||
"id": "a.b",
|
||||
"type": "rectangle",
|
||||
"pos": {
|
||||
"x": -76,
|
||||
"y": -236
|
||||
},
|
||||
"width": 153,
|
||||
"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": "b",
|
||||
"fontSize": 24,
|
||||
"fontFamily": "DEFAULT",
|
||||
"language": "",
|
||||
"color": "N1",
|
||||
"italic": false,
|
||||
"bold": false,
|
||||
"underline": false,
|
||||
"labelWidth": 12,
|
||||
"labelHeight": 31,
|
||||
"labelPosition": "INSIDE_TOP_CENTER",
|
||||
"zIndex": 0,
|
||||
"level": 2
|
||||
},
|
||||
{
|
||||
"id": "a.b.c",
|
||||
"type": "rectangle",
|
||||
"pos": {
|
||||
"x": -26,
|
||||
"y": -186
|
||||
},
|
||||
"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": "b",
|
||||
"type": "rectangle",
|
||||
|
|
@ -907,82 +907,6 @@
|
|||
}
|
||||
],
|
||||
"connections": [
|
||||
{
|
||||
"id": "z.(a -> b)[0]",
|
||||
"src": "z.a",
|
||||
"srcArrow": "none",
|
||||
"dst": "z.b",
|
||||
"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": -37,
|
||||
"y": 136
|
||||
},
|
||||
{
|
||||
"x": -37,
|
||||
"y": 206
|
||||
}
|
||||
],
|
||||
"animated": false,
|
||||
"tooltip": "",
|
||||
"icon": null,
|
||||
"zIndex": 0
|
||||
},
|
||||
{
|
||||
"id": "z.(c -> d)[0]",
|
||||
"src": "z.c",
|
||||
"srcArrow": "none",
|
||||
"dst": "z.d",
|
||||
"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": 36.5,
|
||||
"y": 136
|
||||
},
|
||||
{
|
||||
"x": 36.5,
|
||||
"y": 206
|
||||
}
|
||||
],
|
||||
"animated": false,
|
||||
"tooltip": "",
|
||||
"icon": null,
|
||||
"zIndex": 0
|
||||
},
|
||||
{
|
||||
"id": "x.(a -> b)[0]",
|
||||
"src": "x.a",
|
||||
|
|
@ -1134,6 +1058,82 @@
|
|||
"tooltip": "",
|
||||
"icon": null,
|
||||
"zIndex": 0
|
||||
},
|
||||
{
|
||||
"id": "z.(a -> b)[0]",
|
||||
"src": "z.a",
|
||||
"srcArrow": "none",
|
||||
"dst": "z.b",
|
||||
"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": -37,
|
||||
"y": 136
|
||||
},
|
||||
{
|
||||
"x": -37,
|
||||
"y": 206
|
||||
}
|
||||
],
|
||||
"animated": false,
|
||||
"tooltip": "",
|
||||
"icon": null,
|
||||
"zIndex": 0
|
||||
},
|
||||
{
|
||||
"id": "z.(c -> d)[0]",
|
||||
"src": "z.c",
|
||||
"srcArrow": "none",
|
||||
"dst": "z.d",
|
||||
"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": 36.5,
|
||||
"y": 136
|
||||
},
|
||||
{
|
||||
"x": 36.5,
|
||||
"y": 206
|
||||
}
|
||||
],
|
||||
"animated": false,
|
||||
"tooltip": "",
|
||||
"icon": null,
|
||||
"zIndex": 0
|
||||
}
|
||||
],
|
||||
"root": {
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
1093
e2etests/testdata/stable/nested_diagram_types/dagre/board.exp.json
generated
vendored
Normal file
119
e2etests/testdata/stable/nested_diagram_types/dagre/sketch.exp.svg
vendored
Normal file
|
After Width: | Height: | Size: 23 KiB |
1093
e2etests/testdata/stable/nested_diagram_types/elk/board.exp.json
generated
vendored
Normal file
119
e2etests/testdata/stable/nested_diagram_types/elk/sketch.exp.svg
vendored
Normal file
|
After Width: | Height: | Size: 23 KiB |
5
lib/geo/spacing.go
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
package geo
|
||||
|
||||
type Spacing struct {
|
||||
Top, Bottom, Left, Right float64
|
||||
}
|
||||