Merge branch 'master' into near-keys-for-container

Conflicts:
	d2layouts/d2near/layout.go
This commit is contained in:
donglixiaoche 2023-04-07 10:40:40 +08:00
commit b2f905efb8
No known key found for this signature in database
GPG key ID: 3190E65EBAD6D6E2
67 changed files with 19180 additions and 1651 deletions

View file

@ -226,6 +226,7 @@ let us know and we'll be happy to include it here!
- **CIL (C#, Visual Basic, F#, C++ CLR) to D2**: [https://github.com/HugoVG/AppDiagram](https://github.com/HugoVG/AppDiagram)
- **D2 Snippets (for text editors)**: [https://github.com/Paracelsus-Rose/D2-Language-Code-Snippets](https://github.com/Paracelsus-Rose/D2-Language-Code-Snippets)
- **Mongo to D2**: [https://github.com/novuhq/mongo-to-D2](https://github.com/novuhq/mongo-to-D2)
- **Pandoc filter**: [https://github.com/ram02z/d2-filter](https://github.com/ram02z/d2-filter)
### Misc

View file

@ -2,9 +2,12 @@
- Container with constant key near attribute now can have descendant objects and connections [#1071](https://github.com/terrastruct/d2/pull/1071)
- Multi-board SVG outputs with internal links go to their output paths [#1116](https://github.com/terrastruct/d2/pull/1116)
- New grid layout to place nodes in rows and columns [#1122](https://github.com/terrastruct/d2/pull/1122)
#### Improvements 🧹
- Labels on parallel `dagre` connections include a gap between them [#1134](https://github.com/terrastruct/d2/pull/1134)
#### Bugfixes ⛑️
- Fix a bug in 32bit builds [#1115](https://github.com/terrastruct/d2/issues/1115)

View file

@ -73,6 +73,7 @@ func (c *compiler) compileBoard(g *d2graph.Graph, ir *d2ir.Map) *d2graph.Graph {
c.validateKeys(g.Root, ir)
}
c.validateNear(g)
c.validateEdges(g)
c.compileBoardsField(g, ir, "layers")
c.compileBoardsField(g, ir, "scenarios")
@ -362,6 +363,32 @@ func (c *compiler) compileReserved(attrs *d2graph.Attributes, f *d2ir.Field) {
}
attrs.Constraint.Value = scalar.ScalarString()
attrs.Constraint.MapKey = f.LastPrimaryKey()
case "grid-rows":
v, err := strconv.Atoi(scalar.ScalarString())
if err != nil {
c.errorf(scalar, "non-integer grid-rows %#v: %s", scalar.ScalarString(), err)
return
}
if v <= 0 {
c.errorf(scalar, "grid-rows must be a positive integer: %#v", scalar.ScalarString())
return
}
attrs.GridRows = &d2graph.Scalar{}
attrs.GridRows.Value = scalar.ScalarString()
attrs.GridRows.MapKey = f.LastPrimaryKey()
case "grid-columns":
v, err := strconv.Atoi(scalar.ScalarString())
if err != nil {
c.errorf(scalar, "non-integer grid-columns %#v: %s", scalar.ScalarString(), err)
return
}
if v <= 0 {
c.errorf(scalar, "grid-columns must be a positive integer: %#v", scalar.ScalarString())
return
}
attrs.GridColumns = &d2graph.Scalar{}
attrs.GridColumns.Value = scalar.ScalarString()
attrs.GridColumns.MapKey = f.LastPrimaryKey()
}
if attrs.Link != nil && attrs.Tooltip != nil {
@ -678,6 +705,13 @@ func (c *compiler) validateKey(obj *d2graph.Object, f *d2ir.Field) {
if !in && arrowheadIn {
c.errorf(f.LastPrimaryKey(), fmt.Sprintf(`invalid shape, can only set "%s" for arrowheads`, obj.Attributes.Shape.Value))
}
case "grid-rows", "grid-columns":
for _, child := range obj.ChildrenArray {
if child.IsContainer() {
c.errorf(f.LastPrimaryKey(),
fmt.Sprintf(`%#v can only be used on containers with one level of nesting right now. (%#v has nested %#v)`, keyword, child.AbsID(), child.ChildrenArray[0].ID))
}
}
}
return
}
@ -765,6 +799,19 @@ func (c *compiler) validateNear(g *d2graph.Graph) {
}
func (c *compiler) validateEdges(g *d2graph.Graph) {
for _, edge := range g.Edges {
if gd := edge.Src.Parent.ClosestGridDiagram(); gd != nil {
c.errorf(edge.GetAstEdge(), "edges in grid diagrams are not supported yet")
continue
}
if gd := edge.Dst.Parent.ClosestGridDiagram(); gd != nil {
c.errorf(edge.GetAstEdge(), "edges in grid diagrams are not supported yet")
continue
}
}
}
func (c *compiler) validateBoardLinks(g *d2graph.Graph) {
for _, obj := range g.Objects {
if obj.Attributes.Link == nil {

View file

@ -2270,6 +2270,56 @@ obj {
`,
expErr: `d2/testdata/d2compiler/TestCompile/near_near_const.d2:7:8: near keys cannot be set to an object with a constant near key`,
},
{
name: "grid",
text: `hey: {
grid-rows: 200
grid-columns: 230
}
`,
assertions: func(t *testing.T, g *d2graph.Graph) {
tassert.Equal(t, "200", g.Objects[0].Attributes.GridRows.Value)
},
},
{
name: "grid_negative",
text: `hey: {
grid-rows: 200
grid-columns: -200
}
`,
expErr: `d2/testdata/d2compiler/TestCompile/grid_negative.d2:3:16: grid-columns must be a positive integer: "-200"`,
},
{
name: "grid_edge",
text: `hey: {
grid-rows: 1
a -> b
}
c -> hey.b
hey.a -> c
hey -> c: ok
`,
expErr: `d2/testdata/d2compiler/TestCompile/grid_edge.d2:3:2: edges in grid diagrams are not supported yet
d2/testdata/d2compiler/TestCompile/grid_edge.d2:5:2: edges in grid diagrams are not supported yet
d2/testdata/d2compiler/TestCompile/grid_edge.d2:6:2: edges in grid diagrams are not supported yet`,
},
{
name: "grid_nested",
text: `hey: {
grid-rows: 200
grid-columns: 200
a
b
c
d.invalid descendant
}
`,
expErr: `d2/testdata/d2compiler/TestCompile/grid_nested.d2:2:2: "grid-rows" can only be used on containers with one level of nesting right now. ("hey.d" has nested "invalid descendant")
d2/testdata/d2compiler/TestCompile/grid_nested.d2:3:2: "grid-columns" can only be used on containers with one level of nesting right now. ("hey.d" has nested "invalid descendant")`,
},
}
for _, tc := range testCases {

View file

@ -16,6 +16,7 @@ import (
"oss.terrastruct.com/d2/d2compiler"
"oss.terrastruct.com/d2/d2exporter"
"oss.terrastruct.com/d2/d2layouts/d2dagrelayout"
"oss.terrastruct.com/d2/d2layouts/d2grid"
"oss.terrastruct.com/d2/d2layouts/d2sequence"
"oss.terrastruct.com/d2/d2target"
"oss.terrastruct.com/d2/lib/geo"
@ -231,7 +232,7 @@ func run(t *testing.T, tc testCase) {
err = g.SetDimensions(nil, ruler, nil)
assert.JSON(t, nil, err)
err = d2sequence.Layout(ctx, g, d2dagrelayout.DefaultLayout)
err = d2sequence.Layout(ctx, g, d2grid.Layout(ctx, g, d2dagrelayout.DefaultLayout))
if err != nil {
t.Fatal(err)
}

View file

@ -1,6 +1,7 @@
package d2graph
import (
"context"
"errors"
"fmt"
"math"
@ -67,6 +68,8 @@ func (g *Graph) RootBoard() *Graph {
return g
}
type LayoutGraph func(context.Context, *Graph) error
// TODO consider having different Scalar types
// Right now we'll hold any types in Value and just convert, e.g. floats
type Scalar struct {
@ -129,6 +132,9 @@ type Attributes struct {
Direction Scalar `json:"direction"`
Constraint Scalar `json:"constraint"`
GridRows *Scalar `json:"gridRows,omitempty"`
GridColumns *Scalar `json:"gridColumns,omitempty"`
}
// TODO references at the root scope should have their Scope set to root graph AST
@ -1017,6 +1023,10 @@ type EdgeReference struct {
ScopeObj *Object `json:"-"`
}
func (e *Edge) GetAstEdge() *d2ast.Edge {
return e.References[0].Edge
}
func (e *Edge) GetStroke(dashGapSize interface{}) string {
if dashGapSize != 0.0 {
return color.B2
@ -1531,19 +1541,21 @@ var ReservedKeywords2 map[string]struct{}
// Non Style/Holder keywords.
var SimpleReservedKeywords = map[string]struct{}{
"label": {},
"desc": {},
"shape": {},
"icon": {},
"constraint": {},
"tooltip": {},
"link": {},
"near": {},
"width": {},
"height": {},
"direction": {},
"top": {},
"left": {},
"label": {},
"desc": {},
"shape": {},
"icon": {},
"constraint": {},
"tooltip": {},
"link": {},
"near": {},
"width": {},
"height": {},
"direction": {},
"top": {},
"left": {},
"grid-rows": {},
"grid-columns": {},
}
// ReservedKeywordHolders are reserved keywords that are meaningless on its own and exist solely to hold a set of reserved keywords

16
d2graph/grid_diagram.go Normal file
View file

@ -0,0 +1,16 @@
package d2graph
func (obj *Object) IsGridDiagram() bool {
return obj != nil && obj.Attributes != nil &&
(obj.Attributes.GridRows != nil || obj.Attributes.GridColumns != nil)
}
func (obj *Object) ClosestGridDiagram() *Object {
if obj == nil {
return nil
}
if obj.IsGridDiagram() {
return obj
}
return obj.Parent.ClosestGridDiagram()
}

View file

@ -33,6 +33,7 @@ var dagreJS string
const (
MIN_SEGMENT_LEN = 10
MIN_RANK_SEP = 60
EDGE_LABEL_GAP = 20
)
type ConfigurableOpts struct {
@ -173,37 +174,30 @@ func Layout(ctx context.Context, g *d2graph.Graph, opts *ConfigurableOpts) (err
}
}
for _, edge := range g.Edges {
// dagre doesn't work with edges to containers so we connect container edges to their first child instead (going all the way down)
// we will chop the edge where it intersects the container border so it only shows the edge from the container
src := edge.Src
for len(src.Children) > 0 && src.Class == nil && src.SQLTable == nil {
// We want to get the bottom node of sources, setting its rank higher than all children
src = getLongestEdgeChainTail(g, src)
}
dst := edge.Dst
for len(dst.Children) > 0 && dst.Class == nil && dst.SQLTable == nil {
dst = dst.ChildrenArray[0]
src, dst := getEdgeEndpoints(g, edge)
// We want to get the top node of destinations
for _, child := range dst.ChildrenArray {
isHead := true
for _, e := range g.Edges {
if inContainer(e.Src, child) != nil && inContainer(e.Dst, dst) != nil {
isHead = false
break
}
}
if isHead {
dst = child
break
}
width := edge.LabelDimensions.Width
height := edge.LabelDimensions.Height
numEdges := 0
for _, e := range g.Edges {
otherSrc, otherDst := getEdgeEndpoints(g, e)
if (otherSrc == src && otherDst == dst) || (otherSrc == dst && otherDst == src) {
numEdges++
}
}
if edge.SrcArrow && !edge.DstArrow {
// for `b <- a`, edge.Edge is `a -> b` and we expect this routing result
src, dst = dst, src
// We want to leave some gap between multiple edges
if numEdges > 1 {
switch g.Root.Attributes.Direction.Value {
case "down", "up", "":
width += EDGE_LABEL_GAP
case "left", "right":
height += EDGE_LABEL_GAP
}
}
loadScript += generateAddEdgeLine(src.AbsID(), dst.AbsID(), edge.AbsID(), edge.LabelDimensions.Width, edge.LabelDimensions.Height)
loadScript += generateAddEdgeLine(src.AbsID(), dst.AbsID(), edge.AbsID(), width, height)
}
if debugJS {
@ -528,6 +522,40 @@ func Layout(ctx context.Context, g *d2graph.Graph, opts *ConfigurableOpts) (err
return nil
}
func getEdgeEndpoints(g *d2graph.Graph, edge *d2graph.Edge) (*d2graph.Object, *d2graph.Object) {
// dagre doesn't work with edges to containers so we connect container edges to their first child instead (going all the way down)
// we will chop the edge where it intersects the container border so it only shows the edge from the container
src := edge.Src
for len(src.Children) > 0 && src.Class == nil && src.SQLTable == nil {
// We want to get the bottom node of sources, setting its rank higher than all children
src = getLongestEdgeChainTail(g, src)
}
dst := edge.Dst
for len(dst.Children) > 0 && dst.Class == nil && dst.SQLTable == nil {
dst = dst.ChildrenArray[0]
// We want to get the top node of destinations
for _, child := range dst.ChildrenArray {
isHead := true
for _, e := range g.Edges {
if inContainer(e.Src, child) != nil && inContainer(e.Dst, dst) != nil {
isHead = false
break
}
}
if isHead {
dst = child
break
}
}
}
if edge.SrcArrow && !edge.DstArrow {
// for `b <- a`, edge.Edge is `a -> b` and we expect this routing result
src, dst = dst, src
}
return src, dst
}
func setGraphAttrs(attrs dagreOpts) string {
return fmt.Sprintf(`g.setGraph({
ranksep: %d,

View file

@ -0,0 +1,87 @@
package d2grid
import (
"strconv"
"strings"
"oss.terrastruct.com/d2/d2graph"
)
type gridDiagram struct {
root *d2graph.Object
objects []*d2graph.Object
rows int
columns int
// if true, place objects left to right along rows
// if false, place objects top to bottom along columns
rowDirected bool
width float64
height float64
}
func newGridDiagram(root *d2graph.Object) *gridDiagram {
gd := gridDiagram{root: root, objects: root.ChildrenArray}
if root.Attributes.GridRows != nil {
gd.rows, _ = strconv.Atoi(root.Attributes.GridRows.Value)
}
if root.Attributes.GridColumns != nil {
gd.columns, _ = strconv.Atoi(root.Attributes.GridColumns.Value)
}
if gd.rows != 0 && gd.columns != 0 {
// . row-directed column-directed
// . ┌───────┐ ┌───────┐
// . │ a b c │ │ a d g │
// . │ d e f │ │ b e h │
// . │ g h i │ │ c f i │
// . └───────┘ └───────┘
// if keyword rows is first, make it row-directed, if columns is first it is column-directed
if root.Attributes.GridRows.MapKey.Range.Before(root.Attributes.GridColumns.MapKey.Range) {
gd.rowDirected = true
}
// rows and columns specified, but we want to continue naturally if user enters more objects
// e.g. 2 rows, 3 columns specified + g added: │ with 3 columns, 2 rows:
// . original add row add column │ original add row add column
// . ┌───────┐ ┌───────┐ ┌─────────┐ │ ┌───────┐ ┌───────┐ ┌─────────┐
// . │ a b c │ │ a b c │ │ a b c d │ │ │ a c e │ │ a d g │ │ a c e g │
// . │ d e f │ │ d e f │ │ e f g │ │ │ b d f │ │ b e │ │ b d f │
// . └───────┘ │ g │ └─────────┘ │ └───────┘ │ c f │ └─────────┘
// . └───────┘ ▲ │ └───────┘ ▲
// . ▲ └─existing objects modified│ ▲ └─existing columns preserved
// . └─existing rows preserved │ └─existing objects modified
capacity := gd.rows * gd.columns
for capacity < len(gd.objects) {
if gd.rowDirected {
gd.rows++
capacity += gd.columns
} else {
gd.columns++
capacity += gd.rows
}
}
} else if gd.columns == 0 {
gd.rowDirected = true
}
return &gd
}
func (gd *gridDiagram) shift(dx, dy float64) {
for _, obj := range gd.objects {
obj.TopLeft.X += dx
obj.TopLeft.Y += dy
}
}
func (gd *gridDiagram) cleanup(obj *d2graph.Object, graph *d2graph.Graph) {
obj.Children = make(map[string]*d2graph.Object)
obj.ChildrenArray = make([]*d2graph.Object, 0)
for _, child := range gd.objects {
obj.Children[strings.ToLower(child.ID)] = child
obj.ChildrenArray = append(obj.ChildrenArray, child)
}
graph.Objects = append(graph.Objects, gd.objects...)
}

578
d2layouts/d2grid/layout.go Normal file
View file

@ -0,0 +1,578 @@
package d2grid
import (
"context"
"math"
"sort"
"oss.terrastruct.com/d2/d2graph"
"oss.terrastruct.com/d2/lib/geo"
"oss.terrastruct.com/d2/lib/label"
"oss.terrastruct.com/util-go/go2"
)
const (
CONTAINER_PADDING = 60
HORIZONTAL_PAD = 40.
VERTICAL_PAD = 40.
)
// 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, err := withoutGridDiagrams(ctx, g)
if err != nil {
return err
}
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)
return nil
}
}
func withoutGridDiagrams(ctx context.Context, g *d2graph.Graph) (gridDiagrams map[string]*gridDiagram, objectOrder map[string]int, err error) {
toRemove := make(map[*d2graph.Object]struct{})
gridDiagrams = make(map[string]*gridDiagram)
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
}
gd, err := layoutGrid(g, obj)
if err != nil {
return nil, nil, err
}
obj.Children = make(map[string]*d2graph.Object)
obj.ChildrenArray = nil
var dx, dy float64
width := gd.width + 2*CONTAINER_PADDING
labelWidth := float64(obj.LabelDimensions.Width) + 2*label.PADDING
if labelWidth > width {
dx = (labelWidth - width) / 2
width = labelWidth
}
height := gd.height + 2*CONTAINER_PADDING
labelHeight := float64(obj.LabelDimensions.Height) + 2*label.PADDING
if labelHeight > CONTAINER_PADDING {
// if the label doesn't fit within the padding, we need to add more
grow := labelHeight - CONTAINER_PADDING
dy = grow / 2
height += grow
}
// we need to center children if we have to expand to fit the container label
if dx != 0 || dy != 0 {
gd.shift(dx, dy)
}
obj.Box = geo.NewBox(nil, width, height)
obj.LabelPosition = go2.Pointer(string(label.InsideTopCenter))
gridDiagrams[obj.AbsID()] = gd
for _, o := range gd.objects {
toRemove[o] = struct{}{}
}
}
}
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)
}
}
g.Objects = layoutObjects
return gridDiagrams, objectOrder, nil
}
func layoutGrid(g *d2graph.Graph, obj *d2graph.Object) (*gridDiagram, error) {
gd := newGridDiagram(obj)
if gd.rows != 0 && gd.columns != 0 {
gd.layoutEvenly(g, obj)
} else {
gd.layoutDynamic(g, obj)
}
// position labels and icons
for _, o := range gd.objects {
if o.Attributes.Icon != nil {
o.LabelPosition = go2.Pointer(string(label.InsideTopCenter))
o.IconPosition = go2.Pointer(string(label.InsideMiddleCenter))
} else {
o.LabelPosition = go2.Pointer(string(label.InsideMiddleCenter))
}
}
return gd, nil
}
func (gd *gridDiagram) layoutEvenly(g *d2graph.Graph, obj *d2graph.Object) {
// layout objects in a grid with these 2 properties:
// all objects in the same row should have the same height
// all objects in the same column should have the same width
getObject := func(rowIndex, columnIndex int) *d2graph.Object {
var index int
if gd.rowDirected {
index = rowIndex*gd.columns + columnIndex
} else {
index = columnIndex*gd.rows + rowIndex
}
if index < len(gd.objects) {
return gd.objects[index]
}
return nil
}
rowHeights := make([]float64, 0, gd.rows)
colWidths := make([]float64, 0, gd.columns)
for i := 0; i < gd.rows; i++ {
rowHeight := 0.
for j := 0; j < gd.columns; j++ {
o := getObject(i, j)
if o == nil {
break
}
rowHeight = math.Max(rowHeight, o.Height)
}
rowHeights = append(rowHeights, rowHeight)
}
for j := 0; j < gd.columns; j++ {
columnWidth := 0.
for i := 0; i < gd.rows; i++ {
o := getObject(i, j)
if o == nil {
break
}
columnWidth = math.Max(columnWidth, o.Width)
}
colWidths = append(colWidths, columnWidth)
}
cursor := geo.NewPoint(0, 0)
if gd.rowDirected {
for i := 0; i < gd.rows; i++ {
for j := 0; j < gd.columns; j++ {
o := getObject(i, j)
if o == nil {
break
}
o.Width = colWidths[j]
o.Height = rowHeights[i]
o.TopLeft = cursor.Copy()
cursor.X += o.Width + HORIZONTAL_PAD
}
cursor.X = 0
cursor.Y += rowHeights[i] + VERTICAL_PAD
}
} else {
for j := 0; j < gd.columns; j++ {
for i := 0; i < gd.rows; i++ {
o := getObject(i, j)
if o == nil {
break
}
o.Width = colWidths[j]
o.Height = rowHeights[i]
o.TopLeft = cursor.Copy()
cursor.Y += o.Height + VERTICAL_PAD
}
cursor.X += colWidths[j] + HORIZONTAL_PAD
cursor.Y = 0
}
}
var totalWidth, totalHeight float64
for _, w := range colWidths {
totalWidth += w + HORIZONTAL_PAD
}
for _, h := range rowHeights {
totalHeight += h + VERTICAL_PAD
}
totalWidth -= HORIZONTAL_PAD
totalHeight -= VERTICAL_PAD
gd.width = totalWidth
gd.height = totalHeight
}
func (gd *gridDiagram) layoutDynamic(g *d2graph.Graph, obj *d2graph.Object) {
// assume we have the following objects to layout:
// . ┌A──────────────┐ ┌B──┐ ┌C─────────┐ ┌D────────┐ ┌E────────────────┐
// . └───────────────┘ │ │ │ │ │ │ │ │
// . │ │ └──────────┘ │ │ │ │
// . │ │ │ │ └─────────────────┘
// . └───┘ │ │
// . └─────────┘
// Note: if the grid is row dominant, all objects should be the same height (same width if column dominant)
// . ┌A─────────────┐ ┌B──┐ ┌C─────────┐ ┌D────────┐ ┌E────────────────┐
// . ├ ─ ─ ─ ─ ─ ─ ─┤ │ │ │ │ │ │ │ │
// . │ │ │ │ ├ ─ ─ ─ ─ ─┤ │ │ │ │
// . │ │ │ │ │ │ │ │ ├ ─ ─ ─ ─ ─ ─ ─ ─ ┤
// . │ │ ├ ─ ┤ │ │ │ │ │ │
// . └──────────────┘ └───┘ └──────────┘ └─────────┘ └─────────────────┘
// we want to split up the total width across the N rows or columns as evenly as possible
var totalWidth, totalHeight float64
for _, o := range gd.objects {
totalWidth += o.Width
totalHeight += o.Height
}
totalWidth += HORIZONTAL_PAD * float64(len(gd.objects)-gd.rows)
totalHeight += VERTICAL_PAD * float64(len(gd.objects)-gd.columns)
var layout [][]*d2graph.Object
if gd.rowDirected {
targetWidth := totalWidth / float64(gd.rows)
layout = gd.getBestLayout(targetWidth, false)
} else {
targetHeight := totalHeight / float64(gd.columns)
layout = gd.getBestLayout(targetHeight, true)
}
cursor := geo.NewPoint(0, 0)
var maxY, maxX float64
if gd.rowDirected {
// if we have 2 rows, then each row's objects should have the same height
// . ┌A─────────────┐ ┌B──┐ ┌C─────────┐ ┬ maxHeight(A,B,C)
// . ├ ─ ─ ─ ─ ─ ─ ─┤ │ │ │ │ │
// . │ │ │ │ ├ ─ ─ ─ ─ ─┤ │
// . │ │ │ │ │ │ │
// . └──────────────┘ └───┘ └──────────┘ ┴
// . ┌D────────┐ ┌E────────────────┐ ┬ maxHeight(D,E)
// . │ │ │ │ │
// . │ │ │ │ │
// . │ │ ├ ─ ─ ─ ─ ─ ─ ─ ─ ┤ │
// . │ │ │ │ │
// . └─────────┘ └─────────────────┘ ┴
rowWidths := []float64{}
for _, row := range layout {
rowHeight := 0.
for _, o := range row {
o.TopLeft = cursor.Copy()
cursor.X += o.Width + HORIZONTAL_PAD
rowHeight = math.Max(rowHeight, o.Height)
}
rowWidth := cursor.X - HORIZONTAL_PAD
rowWidths = append(rowWidths, rowWidth)
maxX = math.Max(maxX, rowWidth)
// set all objects in row to the same height
for _, o := range row {
o.Height = rowHeight
}
// new row
cursor.X = 0
cursor.Y += rowHeight + VERTICAL_PAD
}
maxY = cursor.Y - VERTICAL_PAD
// then expand thinnest objects to make each row the same width
// . ┌A─────────────┐ ┌B──┐ ┌C─────────┐ ┬ maxHeight(A,B,C)
// . │ │ │ │ │ │ │
// . │ │ │ │ │ │ │
// . │ │ │ │ │ │ │
// . └──────────────┘ └───┘ └──────────┘ ┴
// . ┌D────────┬────┐ ┌E────────────────┐ ┬ maxHeight(D,E)
// . │ │ │ │ │
// . │ │ │ │ │ │
// . │ │ │ │ │
// . │ │ │ │ │ │
// . └─────────┴────┘ └─────────────────┘ ┴
for i, row := range layout {
rowWidth := rowWidths[i]
if rowWidth == maxX {
continue
}
delta := maxX - rowWidth
objects := []*d2graph.Object{}
var widest float64
for _, o := range row {
widest = math.Max(widest, o.Width)
objects = append(objects, o)
}
sort.Slice(objects, func(i, j int) bool {
return objects[i].Width < objects[j].Width
})
// expand smaller objects to fill remaining space
for _, o := range objects {
if o.Width < widest {
var index int
for i, rowObj := range row {
if o == rowObj {
index = i
break
}
}
grow := math.Min(widest-o.Width, delta)
o.Width += grow
// shift following objects
for i := index + 1; i < len(row); i++ {
row[i].TopLeft.X += grow
}
delta -= grow
if delta <= 0 {
break
}
}
}
if delta > 0 {
grow := delta / float64(len(row))
for i := len(row) - 1; i >= 0; i-- {
o := row[i]
o.TopLeft.X += grow * float64(i)
o.Width += grow
delta -= grow
}
}
}
} else {
// if we have 3 columns, then each column's objects should have the same width
// . ├maxWidth(A,B)─┤ ├maxW(C,D)─┤ ├maxWidth(E)──────┤
// . ┌A─────────────┐ ┌C─────────┐ ┌E────────────────┐
// . └──────────────┘ │ │ │ │
// . ┌B──┬──────────┐ └──────────┘ │ │
// . │ │ ┌D────────┬┐ └─────────────────┘
// . │ │ │ │ │
// . │ │ │ ││
// . └───┴──────────┘ │ │
// . │ ││
// . └─────────┴┘
colHeights := []float64{}
for _, column := range layout {
colWidth := 0.
for _, o := range column {
o.TopLeft = cursor.Copy()
cursor.Y += o.Height + VERTICAL_PAD
colWidth = math.Max(colWidth, o.Width)
}
colHeight := cursor.Y - VERTICAL_PAD
colHeights = append(colHeights, colHeight)
maxY = math.Max(maxY, colHeight)
// set all objects in column to the same width
for _, o := range column {
o.Width = colWidth
}
// new column
cursor.Y = 0
cursor.X += colWidth + HORIZONTAL_PAD
}
maxX = cursor.X - HORIZONTAL_PAD
// then expand shortest objects to make each column the same height
// . ├maxWidth(A,B)─┤ ├maxW(C,D)─┤ ├maxWidth(E)──────┤
// . ┌A─────────────┐ ┌C─────────┐ ┌E────────────────┐
// . ├ ─ ─ ─ ─ ─ ─ ┤ │ │ │ │
// . │ │ └──────────┘ │ │
// . └──────────────┘ ┌D─────────┐ ├ ─ ─ ─ ─ ─ ─ ─ ─ ┤
// . ┌B─────────────┐ │ │ │ │
// . │ │ │ │ │ │
// . │ │ │ │ │ │
// . │ │ │ │ │ │
// . └──────────────┘ └──────────┘ └─────────────────┘
for i, column := range layout {
colHeight := colHeights[i]
if colHeight == maxY {
continue
}
delta := maxY - colHeight
objects := []*d2graph.Object{}
var tallest float64
for _, o := range column {
tallest = math.Max(tallest, o.Height)
objects = append(objects, o)
}
sort.Slice(objects, func(i, j int) bool {
return objects[i].Height < objects[j].Height
})
// expand smaller objects to fill remaining space
for _, o := range objects {
if o.Height < tallest {
var index int
for i, colObj := range column {
if o == colObj {
index = i
break
}
}
grow := math.Min(tallest-o.Height, delta)
o.Height += grow
// shift following objects
for i := index + 1; i < len(column); i++ {
column[i].TopLeft.Y += grow
}
delta -= grow
if delta <= 0 {
break
}
}
}
if delta > 0 {
grow := delta / float64(len(column))
for i := len(column) - 1; i >= 0; i-- {
o := column[i]
o.TopLeft.Y += grow * float64(i)
o.Height += grow
delta -= grow
}
}
}
}
gd.width = maxX
gd.height = maxY
}
// generate the best layout of objects aiming for each row to be the targetSize width
// if columns is true, each column aims to have the targetSize height
func (gd *gridDiagram) getBestLayout(targetSize float64, columns bool) [][]*d2graph.Object {
var nCuts int
if columns {
nCuts = gd.columns - 1
} else {
nCuts = gd.rows - 1
}
if nCuts == 0 {
return genLayout(gd.objects, nil)
}
// get all options for where to place these cuts, preferring later cuts over earlier cuts
// with 5 objects and 2 cuts we have these options:
// . A B C │ D │ E <- these cuts would produce: ┌A─┐ ┌B─┐ ┌C─┐
// . A B │ C D │ E └──┘ └──┘ └──┘
// . A │ B C D │ E ┌D───────────┐
// . A B │ C │ D E └────────────┘
// . A │ B C │ D E ┌E───────────┐
// . A │ B │ C D E └────────────┘
divisions := genDivisions(gd.objects, nCuts)
var bestLayout [][]*d2graph.Object
bestDist := math.MaxFloat64
// of these divisions, find the layout with rows closest to the targetSize
for _, division := range divisions {
layout := genLayout(gd.objects, division)
dist := getDistToTarget(layout, targetSize, columns)
if dist < bestDist {
bestLayout = layout
bestDist = dist
}
}
return bestLayout
}
// get all possible divisions of objects by the number of cuts
func genDivisions(objects []*d2graph.Object, nCuts int) (divisions [][]int) {
if len(objects) < 2 || nCuts == 0 {
return nil
}
// we go in this order to prefer extra objects in starting rows rather than later ones
lastObj := len(objects) - 1
for index := lastObj; index >= nCuts; index-- {
if nCuts > 1 {
for _, inner := range genDivisions(objects[:index], nCuts-1) {
divisions = append(divisions, append(inner, index-1))
}
} else {
divisions = append(divisions, []int{index - 1})
}
}
return divisions
}
// generate a grid of objects from the given cut indices
func genLayout(objects []*d2graph.Object, cutIndices []int) [][]*d2graph.Object {
layout := make([][]*d2graph.Object, len(cutIndices)+1)
objIndex := 0
for i := 0; i <= len(cutIndices); i++ {
var stop int
if i < len(cutIndices) {
stop = cutIndices[i]
} else {
stop = len(objects) - 1
}
for ; objIndex <= stop; objIndex++ {
layout[i] = append(layout[i], objects[objIndex])
}
}
return layout
}
func getDistToTarget(layout [][]*d2graph.Object, targetSize float64, columns bool) float64 {
totalDelta := 0.
for _, row := range layout {
rowSize := 0.
for _, o := range row {
if columns {
rowSize += o.Height + VERTICAL_PAD
} else {
rowSize += o.Width + HORIZONTAL_PAD
}
}
totalDelta += math.Abs(rowSize - targetSize)
}
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 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()]
})
}()
if graph.Root.IsGridDiagram() {
gd, exists := gridDiagrams[graph.Root.AbsID()]
if exists {
gd.cleanup(graph.Root, graph)
return
}
}
for _, obj := range graph.Objects {
gd, exists := gridDiagrams[obj.AbsID()]
if !exists {
continue
}
obj.LabelPosition = go2.Pointer(string(label.InsideTopCenter))
// shift the grid from (0, 0)
gd.shift(
obj.TopLeft.X+CONTAINER_PADDING,
obj.TopLeft.Y+CONTAINER_PADDING,
)
gd.cleanup(obj, graph)
}
}

View file

@ -59,7 +59,7 @@ func Layout(ctx context.Context, g *d2graph.Graph, constantNearGraphs []*d2graph
if processCenters == strings.Contains(d2graph.Key(obj.Attributes.NearKey)[0], "-center") {
// The z-index for constant nears does not matter, as it will not collide
g.Objects = append(g.Objects, tempGraph.Objects...)
obj.Parent.Children[obj.ID] = obj
obj.Parent.Children[strings.ToLower(obj.ID)] = obj
obj.Parent.ChildrenArray = append(obj.Parent.ChildrenArray, obj)
g.Edges = append(g.Edges, tempGraph.Edges...)
}

View file

@ -13,6 +13,33 @@ import (
"oss.terrastruct.com/d2/lib/label"
)
// 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
func Layout(ctx context.Context, g *d2graph.Graph, layout d2graph.LayoutGraph) error {
sequenceDiagrams, objectOrder, edgeOrder, err := WithoutSequenceDiagrams(ctx, g)
if err != nil {
return err
}
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
}
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{})
@ -69,33 +96,6 @@ func WithoutSequenceDiagrams(ctx context.Context, g *d2graph.Graph) (map[string]
return sequenceDiagrams, objectOrder, edgeOrder, nil
}
// 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
func Layout(ctx context.Context, g *d2graph.Graph, layout func(ctx context.Context, g *d2graph.Graph) error) error {
sequenceDiagrams, objectOrder, edgeOrder, err := WithoutSequenceDiagrams(ctx, g)
if err != nil {
return err
}
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
}
cleanup(g, sequenceDiagrams, objectOrder, edgeOrder)
return nil
}
// layoutSequenceDiagram finds the edges inside the sequence diagram and performs the layout on the object descendants
func layoutSequenceDiagram(g *d2graph.Graph, obj *d2graph.Object) (*sequenceDiagram, error) {
var edges []*d2graph.Edge
@ -154,11 +154,11 @@ func cleanup(g *d2graph.Graph, sequenceDiagrams map[string]*sequenceDiagram, obj
objects = g.Objects
}
for _, obj := range objects {
if _, exists := sequenceDiagrams[obj.AbsID()]; !exists {
sd, exists := sequenceDiagrams[obj.AbsID()]
if !exists {
continue
}
obj.LabelPosition = go2.Pointer(string(label.InsideTopCenter))
sd := sequenceDiagrams[obj.AbsID()]
// shift the sequence diagrams as they are always placed at (0, 0) with some padding
sd.shift(
@ -171,22 +171,22 @@ func cleanup(g *d2graph.Graph, sequenceDiagrams map[string]*sequenceDiagram, obj
obj.Children = make(map[string]*d2graph.Object)
obj.ChildrenArray = make([]*d2graph.Object, 0)
for _, child := range sd.actors {
obj.Children[child.ID] = child
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[child.ID] = child
obj.Children[strings.ToLower(child.ID)] = child
obj.ChildrenArray = append(obj.ChildrenArray, child)
}
}
g.Edges = append(g.Edges, sequenceDiagrams[obj.AbsID()].messages...)
g.Edges = append(g.Edges, sequenceDiagrams[obj.AbsID()].lifelines...)
g.Objects = append(g.Objects, sequenceDiagrams[obj.AbsID()].actors...)
g.Objects = append(g.Objects, sequenceDiagrams[obj.AbsID()].notes...)
g.Objects = append(g.Objects, sequenceDiagrams[obj.AbsID()].groups...)
g.Objects = append(g.Objects, sequenceDiagrams[obj.AbsID()].spans...)
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

View file

@ -10,6 +10,7 @@ import (
"oss.terrastruct.com/d2/d2exporter"
"oss.terrastruct.com/d2/d2graph"
"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"
@ -77,7 +78,9 @@ func compile(ctx context.Context, g *d2graph.Graph, opts *CompileOptions) (*d2ta
}
}
err = d2sequence.Layout(ctx, g, coreLayout)
layoutWithGrids := d2grid.Layout(ctx, g, coreLayout)
err = d2sequence.Layout(ctx, g, layoutWithGrids)
if err != nil {
return nil, err
}
@ -117,7 +120,7 @@ func compile(ctx context.Context, g *d2graph.Graph, opts *CompileOptions) (*d2ta
return d, nil
}
func getLayout(opts *CompileOptions) (func(context.Context, *d2graph.Graph) error, error) {
func getLayout(opts *CompileOptions) (d2graph.LayoutGraph, error) {
if opts.Layout != nil {
return opts.Layout, nil
} else if os.Getenv("D2_LAYOUT") == "dagre" {

View file

@ -314,6 +314,16 @@ func _set(g *d2graph.Graph, key string, tag, value *string) error {
attrs.Left.MapKey.SetScalar(mk.Value.ScalarBox())
return nil
}
case "grid-rows":
if attrs.GridRows != nil && attrs.GridRows.MapKey != nil {
attrs.GridRows.MapKey.SetScalar(mk.Value.ScalarBox())
return nil
}
case "grid-columns":
if attrs.GridColumns != nil && attrs.GridColumns.MapKey != nil {
attrs.GridColumns.MapKey.SetScalar(mk.Value.ScalarBox())
return nil
}
case "source-arrowhead", "target-arrowhead":
if reservedKey == "source-arrowhead" {
attrs = edge.SrcArrowhead

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 108 KiB

After

Width:  |  Height:  |  Size: 108 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 493 KiB

After

Width:  |  Height:  |  Size: 493 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 108 KiB

After

Width:  |  Height:  |  Size: 108 KiB

View file

@ -205,6 +205,12 @@ logs: { shape: page; style.multiple: true }
network.data processor -> api server
`,
},
{
name: "edge-label-overflow",
script: `student -> committee chair: Apply for appeal
student <- committee chair: Deny. Need more information
committee chair -> committee: Accept appeal`,
},
{
name: "mono-edge",
script: `direction: right
@ -2527,6 +2533,10 @@ scenarios: {
}`,
},
loadFromFile(t, "arrowhead_scaling"),
loadFromFile(t, "teleport_grid"),
loadFromFile(t, "dagger_grid"),
loadFromFile(t, "grid_tests"),
loadFromFile(t, "executive_grid"),
}
runa(t, tcs)

90
e2etests/testdata/files/dagger_grid.d2 vendored Normal file
View file

@ -0,0 +1,90 @@
grid-rows: 5
style.fill: black
flow1: "" {
width: 120
style: {fill: white; stroke: cornflowerblue; stroke-width: 10}
}
flow2: "" {
width: 120
style: {fill: white; stroke: cornflowerblue; stroke-width: 10}
}
flow3: "" {
width: 120
style: {fill: white; stroke: cornflowerblue; stroke-width: 10}
}
flow4: "" {
width: 120
style: {fill: white; stroke: cornflowerblue; stroke-width: 10}
}
flow5: "" {
width: 120
style: {fill: white; stroke: cornflowerblue; stroke-width: 10}
}
flow6: "" {
width: 240
style: {fill: white; stroke: cornflowerblue; stroke-width: 10}
}
flow7: "" {
width: 80
style: {fill: white; stroke: cornflowerblue; stroke-width: 10}
}
flow8: "" {
width: 160
style: {fill: white; stroke: cornflowerblue; stroke-width: 10}
}
flow9: "" {
width: 160
style: {fill: white; stroke: cornflowerblue; stroke-width: 10}
}
DAGGER ENGINE: {
width: 800
style: {
fill: beige
stroke: darkcyan
font-color: blue
stroke-width: 8
}
}
ANY DOCKER COMPATIBLE RUNTIME: {
width: 800
style: {
fill: lightcyan
stroke: darkcyan
font-color: black
stroke-width: 8
}
icon: https://icons.terrastruct.com/dev%2Fdocker.svg
}
ANY CI: {
style: {
fill: gold
stroke: maroon
font-color: maroon
stroke-width: 8
}
}
WINDOWS.style: {
font-color: white
fill: darkcyan
stroke: black
}
LINUX.style: {
font-color: white
fill: darkcyan
stroke: black
}
MACOS.style: {
font-color: white
fill: darkcyan
stroke: black
}
KUBERNETES.style: {
font-color: white
fill: darkcyan
stroke: black
}

View file

@ -0,0 +1,16 @@
grid-rows: 3
Executive Services.width: 1000
I/O\nManager.width: 100
I/O\nManager.height: 200
Security\nReference\nMonitor.width: 100
IPC\nManager.width: 100
Virtual\nMemory\nManager\n(VMM).width: 100
Process\nManager.width: 100
PnP\nManager.width: 100
Power\nManager.width: 100
# TODO recursive grids
Window\nManager\n\nGDI.width: 100
Object Manager.width: 1000

134
e2etests/testdata/files/grid_tests.d2 vendored Normal file
View file

@ -0,0 +1,134 @@
rows 1: {
grid-rows: 1
a
b
c
d
e
f
g
}
columns 1: {
grid-columns: 1
a
b
c
d
e
f
g
}
rows 2: {
grid-rows: 2
a
b
c
d
e
f
g
}
columns 2: {
grid-columns: 2
a
b
c
d
e
f
g
}
rows 2 columns 2: {
grid-rows: 2
grid-columns: 2
a
b
c
d
e
f
g
}
columns 2 rows 2: {
grid-columns: 2
grid-rows: 2
a
b
c
d
e
f
g
}
rows 3 columns 3: {
grid-rows: 3
grid-columns: 3
a
b
c
d
e
f
g
}
columns 3 rows 3: {
grid-columns: 3
grid-rows: 3
a
b
c
d
e
f
g
}
rows 3: {
grid-rows: 3
a
b
c
d
e
f
g
}
columns 3: {
grid-columns: 3
a
b
c
d
e
f
g
}
widths heights: {
grid-rows: 3
grid-columns: 3
a w200.width: 200
b h300.height: 300
c
d h200.height: 200
e
f w400.width: 400
g
h
i
}

View file

@ -0,0 +1,70 @@
direction: right
users -- via -- teleport
teleport -> jita: "all connections audited and logged"
teleport -> infra
teleport -> identity provider
teleport <- identity provider
users: "" {
grid-columns: 1
Engineers: {
shape: circle
icon: https://icons.terrastruct.com/essentials%2F365-user.svg
}
Machines: {
shape: circle
icon: https://icons.terrastruct.com/aws%2FCompute%2FCompute.svg
}
}
via: "" {
grid-columns: 1
https: "HTTPS://"
kubectl: "> kubectl"
tsh: "> tsh"
api: "> api"
db clients: "DB Clients"
}
teleport: Teleport {
grid-rows: 2
inp: |md
# Identity Native Proxy
| {
width: 300
}
Audit Log.icon: https://icons.terrastruct.com/tech%2Flaptop.svg
Cert Authority.icon: https://icons.terrastruct.com/azure%2FWeb%20Service%20Color%2FApp%20Service%20Certificates.svg
}
jita: "Just-in-time Access via" {
grid-rows: 1
Slack.icon: https://icons.terrastruct.com/dev%2Fslack.svg
Mattermost
Jira
Pagerduty
Email.icon: https://icons.terrastruct.com/aws%2F_General%2FAWS-Email_light-bg.svg
}
infra: Infrastructure {
grid-rows: 2
ssh.icon: https://icons.terrastruct.com/essentials%2F112-server.svg
Kubernetes.icon: https://icons.terrastruct.com/azure%2F_Companies%2FKubernetes.svg
My SQL.icon: https://icons.terrastruct.com/dev%2Fmysql.svg
MongoDB.icon: https://icons.terrastruct.com/dev%2Fmongodb.svg
PSQL.icon: https://icons.terrastruct.com/dev%2Fpostgresql.svg
Windows.icon: https://icons.terrastruct.com/dev%2Fwindows.svg
}
identity provider: Indentity Provider {
icon: https://icons.terrastruct.com/azure%2FIdentity%20Service%20Color%2FIdentity%20governance.svg
}

View file

@ -10,7 +10,7 @@
"x": 0,
"y": 41
},
"width": 334,
"width": 360,
"height": 640,
"opacity": 1,
"strokeDash": 0,
@ -52,7 +52,7 @@
"x": 20,
"y": 106
},
"width": 294,
"width": 320,
"height": 545,
"opacity": 1,
"strokeDash": 0,
@ -91,7 +91,7 @@
"id": "NETWORK.CELL TOWER.satellites",
"type": "stored_data",
"pos": {
"x": 87,
"x": 100,
"y": 195
},
"width": 161,
@ -132,7 +132,7 @@
"id": "NETWORK.CELL TOWER.transmitter",
"type": "rectangle",
"pos": {
"x": 92,
"x": 105,
"y": 496
},
"width": 151,
@ -173,7 +173,7 @@
"id": "costumes",
"type": "sql_table",
"pos": {
"x": 374,
"x": 401,
"y": 100
},
"width": 311,
@ -330,7 +330,7 @@
"id": "monsters",
"type": "sql_table",
"pos": {
"x": 374,
"x": 401,
"y": 401
},
"width": 311,
@ -512,19 +512,19 @@
"labelPercentage": 0,
"route": [
{
"x": 151,
"x": 163,
"y": 262
},
{
"x": 108,
"x": 114.4,
"y": 355.6
},
{
"x": 108.05,
"x": 114.45,
"y": 402.6
},
{
"x": 151.25,
"x": 163.25,
"y": 497
}
],
@ -561,19 +561,19 @@
"labelPercentage": 0,
"route": [
{
"x": 167,
"x": 180,
"y": 262
},
{
"x": 167,
"x": 180.2,
"y": 355.6
},
{
"x": 167,
"x": 180.25,
"y": 402.6
},
{
"x": 167,
"x": 180.25,
"y": 497
}
],
@ -610,19 +610,19 @@
"labelPercentage": 0,
"route": [
{
"x": 183,
"x": 198,
"y": 262
},
{
"x": 226,
"x": 246.2,
"y": 355.6
},
{
"x": 225.95,
"x": 246.05,
"y": 402.6
},
{
"x": 182.75,
"x": 197.25,
"y": 497
}
],
@ -659,19 +659,19 @@
"labelPercentage": 0,
"route": [
{
"x": 529.5,
"x": 556,
"y": 280
},
{
"x": 529.5,
"x": 556,
"y": 328.4
},
{
"x": 529.5,
"x": 556,
"y": 352.7
},
{
"x": 529.5,
"x": 556,
"y": 401.5
}
],

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 61 KiB

After

Width:  |  Height:  |  Size: 61 KiB

View file

@ -10,7 +10,7 @@
"x": 0,
"y": 41
},
"width": 334,
"width": 360,
"height": 412,
"opacity": 1,
"strokeDash": 0,
@ -52,7 +52,7 @@
"x": 20,
"y": 106
},
"width": 294,
"width": 320,
"height": 317,
"opacity": 1,
"strokeDash": 0,
@ -91,7 +91,7 @@
"id": "NETWORK.CELL TOWER.satellites",
"type": "stored_data",
"pos": {
"x": 87,
"x": 100,
"y": 138
},
"width": 161,
@ -132,7 +132,7 @@
"id": "NETWORK.CELL TOWER.transmitter",
"type": "rectangle",
"pos": {
"x": 92,
"x": 105,
"y": 325
},
"width": 151,
@ -198,19 +198,19 @@
"labelPercentage": 0,
"route": [
{
"x": 142,
"x": 152,
"y": 205
},
{
"x": 106.19999999999999,
"x": 112.19999999999999,
"y": 253
},
{
"x": 106.25,
"x": 112.25,
"y": 277.2
},
{
"x": 142.25,
"x": 152.25,
"y": 326
}
],
@ -247,19 +247,19 @@
"labelPercentage": 0,
"route": [
{
"x": 167,
"x": 180,
"y": 205
},
{
"x": 167,
"x": 180.2,
"y": 253
},
{
"x": 167,
"x": 180.25,
"y": 277.2
},
{
"x": 167,
"x": 180.25,
"y": 326
}
],
@ -296,19 +296,19 @@
"labelPercentage": 0,
"route": [
{
"x": 192,
"x": 208,
"y": 205
},
{
"x": 227.8,
"x": 248.2,
"y": 253
},
{
"x": 227.75,
"x": 248.25,
"y": 277.2
},
{
"x": 191.75,
"x": 208.25,
"y": 326
}
],

View file

@ -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.3.0-HEAD" preserveAspectRatio="xMinYMin meet" viewBox="0 0 336 454"><svg id="d2-svg" class="d2-2665946492" width="336" height="454" viewBox="-1 0 336 454"><rect x="-1.000000" y="0.000000" width="336.000000" height="454.000000" rx="0.000000" class=" fill-N7" stroke-width="0" /><style type="text/css"><![CDATA[
.d2-2665946492 .text-mono {
font-family: "d2-2665946492-font-mono";
<?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.3.0-HEAD" preserveAspectRatio="xMinYMin meet" viewBox="0 0 362 454"><svg id="d2-svg" class="d2-3084549463" width="362" height="454" viewBox="-1 0 362 454"><rect x="-1.000000" y="0.000000" width="362.000000" height="454.000000" rx="0.000000" class=" fill-N7" stroke-width="0" /><style type="text/css"><![CDATA[
.d2-3084549463 .text-mono {
font-family: "d2-3084549463-font-mono";
}
@font-face {
font-family: d2-2665946492-font-mono;
font-family: d2-3084549463-font-mono;
src: url("data:application/font-woff;base64,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");
}
.d2-2665946492 .text-mono-italic {
font-family: "d2-2665946492-font-mono-italic";
.d2-3084549463 .text-mono-italic {
font-family: "d2-3084549463-font-mono-italic";
}
@font-face {
font-family: d2-2665946492-font-mono-italic;
font-family: d2-3084549463-font-mono-italic;
src: url("data:application/font-woff;base64,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");
}]]></style><style type="text/css"><![CDATA[.shape {
shape-rendering: geometricPrecision;
@ -25,78 +25,78 @@
opacity: 0.5;
}
.d2-2665946492 .fill-N1{fill:#0A0F25;}
.d2-2665946492 .fill-N2{fill:#676C7E;}
.d2-2665946492 .fill-N3{fill:#9499AB;}
.d2-2665946492 .fill-N4{fill:#CFD2DD;}
.d2-2665946492 .fill-N5{fill:#DEE1EB;}
.d2-2665946492 .fill-N6{fill:#EEF1F8;}
.d2-2665946492 .fill-N7{fill:#FFFFFF;}
.d2-2665946492 .fill-B1{fill:#0D32B2;}
.d2-2665946492 .fill-B2{fill:#0D32B2;}
.d2-2665946492 .fill-B3{fill:#E3E9FD;}
.d2-2665946492 .fill-B4{fill:#E3E9FD;}
.d2-2665946492 .fill-B5{fill:#EDF0FD;}
.d2-2665946492 .fill-B6{fill:#F7F8FE;}
.d2-2665946492 .fill-AA2{fill:#4A6FF3;}
.d2-2665946492 .fill-AA4{fill:#EDF0FD;}
.d2-2665946492 .fill-AA5{fill:#F7F8FE;}
.d2-2665946492 .fill-AB4{fill:#EDF0FD;}
.d2-2665946492 .fill-AB5{fill:#F7F8FE;}
.d2-2665946492 .stroke-N1{stroke:#0A0F25;}
.d2-2665946492 .stroke-N2{stroke:#676C7E;}
.d2-2665946492 .stroke-N3{stroke:#9499AB;}
.d2-2665946492 .stroke-N4{stroke:#CFD2DD;}
.d2-2665946492 .stroke-N5{stroke:#DEE1EB;}
.d2-2665946492 .stroke-N6{stroke:#EEF1F8;}
.d2-2665946492 .stroke-N7{stroke:#FFFFFF;}
.d2-2665946492 .stroke-B1{stroke:#0D32B2;}
.d2-2665946492 .stroke-B2{stroke:#0D32B2;}
.d2-2665946492 .stroke-B3{stroke:#E3E9FD;}
.d2-2665946492 .stroke-B4{stroke:#E3E9FD;}
.d2-2665946492 .stroke-B5{stroke:#EDF0FD;}
.d2-2665946492 .stroke-B6{stroke:#F7F8FE;}
.d2-2665946492 .stroke-AA2{stroke:#4A6FF3;}
.d2-2665946492 .stroke-AA4{stroke:#EDF0FD;}
.d2-2665946492 .stroke-AA5{stroke:#F7F8FE;}
.d2-2665946492 .stroke-AB4{stroke:#EDF0FD;}
.d2-2665946492 .stroke-AB5{stroke:#F7F8FE;}
.d2-2665946492 .background-color-N1{background-color:#0A0F25;}
.d2-2665946492 .background-color-N2{background-color:#676C7E;}
.d2-2665946492 .background-color-N3{background-color:#9499AB;}
.d2-2665946492 .background-color-N4{background-color:#CFD2DD;}
.d2-2665946492 .background-color-N5{background-color:#DEE1EB;}
.d2-2665946492 .background-color-N6{background-color:#EEF1F8;}
.d2-2665946492 .background-color-N7{background-color:#FFFFFF;}
.d2-2665946492 .background-color-B1{background-color:#0D32B2;}
.d2-2665946492 .background-color-B2{background-color:#0D32B2;}
.d2-2665946492 .background-color-B3{background-color:#E3E9FD;}
.d2-2665946492 .background-color-B4{background-color:#E3E9FD;}
.d2-2665946492 .background-color-B5{background-color:#EDF0FD;}
.d2-2665946492 .background-color-B6{background-color:#F7F8FE;}
.d2-2665946492 .background-color-AA2{background-color:#4A6FF3;}
.d2-2665946492 .background-color-AA4{background-color:#EDF0FD;}
.d2-2665946492 .background-color-AA5{background-color:#F7F8FE;}
.d2-2665946492 .background-color-AB4{background-color:#EDF0FD;}
.d2-2665946492 .background-color-AB5{background-color:#F7F8FE;}
.d2-2665946492 .color-N1{color:#0A0F25;}
.d2-2665946492 .color-N2{color:#676C7E;}
.d2-2665946492 .color-N3{color:#9499AB;}
.d2-2665946492 .color-N4{color:#CFD2DD;}
.d2-2665946492 .color-N5{color:#DEE1EB;}
.d2-2665946492 .color-N6{color:#EEF1F8;}
.d2-2665946492 .color-N7{color:#FFFFFF;}
.d2-2665946492 .color-B1{color:#0D32B2;}
.d2-2665946492 .color-B2{color:#0D32B2;}
.d2-2665946492 .color-B3{color:#E3E9FD;}
.d2-2665946492 .color-B4{color:#E3E9FD;}
.d2-2665946492 .color-B5{color:#EDF0FD;}
.d2-2665946492 .color-B6{color:#F7F8FE;}
.d2-2665946492 .color-AA2{color:#4A6FF3;}
.d2-2665946492 .color-AA4{color:#EDF0FD;}
.d2-2665946492 .color-AA5{color:#F7F8FE;}
.d2-2665946492 .color-AB4{color:#EDF0FD;}
.d2-2665946492 .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"><![CDATA[
.d2-3084549463 .fill-N1{fill:#0A0F25;}
.d2-3084549463 .fill-N2{fill:#676C7E;}
.d2-3084549463 .fill-N3{fill:#9499AB;}
.d2-3084549463 .fill-N4{fill:#CFD2DD;}
.d2-3084549463 .fill-N5{fill:#DEE1EB;}
.d2-3084549463 .fill-N6{fill:#EEF1F8;}
.d2-3084549463 .fill-N7{fill:#FFFFFF;}
.d2-3084549463 .fill-B1{fill:#0D32B2;}
.d2-3084549463 .fill-B2{fill:#0D32B2;}
.d2-3084549463 .fill-B3{fill:#E3E9FD;}
.d2-3084549463 .fill-B4{fill:#E3E9FD;}
.d2-3084549463 .fill-B5{fill:#EDF0FD;}
.d2-3084549463 .fill-B6{fill:#F7F8FE;}
.d2-3084549463 .fill-AA2{fill:#4A6FF3;}
.d2-3084549463 .fill-AA4{fill:#EDF0FD;}
.d2-3084549463 .fill-AA5{fill:#F7F8FE;}
.d2-3084549463 .fill-AB4{fill:#EDF0FD;}
.d2-3084549463 .fill-AB5{fill:#F7F8FE;}
.d2-3084549463 .stroke-N1{stroke:#0A0F25;}
.d2-3084549463 .stroke-N2{stroke:#676C7E;}
.d2-3084549463 .stroke-N3{stroke:#9499AB;}
.d2-3084549463 .stroke-N4{stroke:#CFD2DD;}
.d2-3084549463 .stroke-N5{stroke:#DEE1EB;}
.d2-3084549463 .stroke-N6{stroke:#EEF1F8;}
.d2-3084549463 .stroke-N7{stroke:#FFFFFF;}
.d2-3084549463 .stroke-B1{stroke:#0D32B2;}
.d2-3084549463 .stroke-B2{stroke:#0D32B2;}
.d2-3084549463 .stroke-B3{stroke:#E3E9FD;}
.d2-3084549463 .stroke-B4{stroke:#E3E9FD;}
.d2-3084549463 .stroke-B5{stroke:#EDF0FD;}
.d2-3084549463 .stroke-B6{stroke:#F7F8FE;}
.d2-3084549463 .stroke-AA2{stroke:#4A6FF3;}
.d2-3084549463 .stroke-AA4{stroke:#EDF0FD;}
.d2-3084549463 .stroke-AA5{stroke:#F7F8FE;}
.d2-3084549463 .stroke-AB4{stroke:#EDF0FD;}
.d2-3084549463 .stroke-AB5{stroke:#F7F8FE;}
.d2-3084549463 .background-color-N1{background-color:#0A0F25;}
.d2-3084549463 .background-color-N2{background-color:#676C7E;}
.d2-3084549463 .background-color-N3{background-color:#9499AB;}
.d2-3084549463 .background-color-N4{background-color:#CFD2DD;}
.d2-3084549463 .background-color-N5{background-color:#DEE1EB;}
.d2-3084549463 .background-color-N6{background-color:#EEF1F8;}
.d2-3084549463 .background-color-N7{background-color:#FFFFFF;}
.d2-3084549463 .background-color-B1{background-color:#0D32B2;}
.d2-3084549463 .background-color-B2{background-color:#0D32B2;}
.d2-3084549463 .background-color-B3{background-color:#E3E9FD;}
.d2-3084549463 .background-color-B4{background-color:#E3E9FD;}
.d2-3084549463 .background-color-B5{background-color:#EDF0FD;}
.d2-3084549463 .background-color-B6{background-color:#F7F8FE;}
.d2-3084549463 .background-color-AA2{background-color:#4A6FF3;}
.d2-3084549463 .background-color-AA4{background-color:#EDF0FD;}
.d2-3084549463 .background-color-AA5{background-color:#F7F8FE;}
.d2-3084549463 .background-color-AB4{background-color:#EDF0FD;}
.d2-3084549463 .background-color-AB5{background-color:#F7F8FE;}
.d2-3084549463 .color-N1{color:#0A0F25;}
.d2-3084549463 .color-N2{color:#676C7E;}
.d2-3084549463 .color-N3{color:#9499AB;}
.d2-3084549463 .color-N4{color:#CFD2DD;}
.d2-3084549463 .color-N5{color:#DEE1EB;}
.d2-3084549463 .color-N6{color:#EEF1F8;}
.d2-3084549463 .color-N7{color:#FFFFFF;}
.d2-3084549463 .color-B1{color:#0D32B2;}
.d2-3084549463 .color-B2{color:#0D32B2;}
.d2-3084549463 .color-B3{color:#E3E9FD;}
.d2-3084549463 .color-B4{color:#E3E9FD;}
.d2-3084549463 .color-B5{color:#EDF0FD;}
.d2-3084549463 .color-B6{color:#F7F8FE;}
.d2-3084549463 .color-AA2{color:#4A6FF3;}
.d2-3084549463 .color-AA4{color:#EDF0FD;}
.d2-3084549463 .color-AA5{color:#F7F8FE;}
.d2-3084549463 .color-AB4{color:#EDF0FD;}
.d2-3084549463 .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"><![CDATA[
.dots-overlay {
fill: url(#dots);
mix-blend-mode: multiply;
@ -129,9 +129,9 @@
<rect x="7" y="7" width="1" height="1" fill="#0A0F25"/>
</g>
</pattern>
</defs><g id="NETWORK"><g class="shape" ><rect x="0.000000" y="41.000000" width="334.000000" height="412.000000" stroke="black" fill="#E7E9EE" style="stroke-width:2;" /><rect x="0.000000" y="41.000000" width="334.000000" height="412.000000" class="dots-overlay" style="stroke-width:2;" /><rect x="5.000000" y="46.000000" width="324.000000" height="402.000000" stroke="black" fill="transparent" style="stroke-width:2;" /></g><text x="167.000000" y="28.000000" class="text-mono fill-N1" style="text-anchor:middle;font-size:28px">NETWORK</text></g><g id="NETWORK.CELL TOWER"><g class="shape" ><rect x="20.000000" y="106.000000" width="294.000000" height="317.000000" stroke="black" fill="#F5F6F9" style="stroke-width:2;" /><rect x="20.000000" y="106.000000" width="294.000000" height="317.000000" class="dots-overlay" style="stroke-width:2;" /></g><text x="167.000000" y="94.000000" class="text-mono fill-N1" style="text-anchor:middle;font-size:24px">CELL TOWER</text></g><g id="NETWORK.CELL TOWER.satellites"><g class="shape" ><path d="M 112 128 H 258 C 254 128 243 146 243 161 C 243 176 254 194 258 194 H 112 C 108 194 97 176 97 161 C 97 146 108 128 112 128 Z" stroke="black" fill="white" style="stroke-width:2;" /><path d="M 102 138 H 248 C 244 138 233 156 233 171 C 233 186 244 204 248 204 H 102 C 98 204 87 186 87 171 C 87 156 98 138 102 138 Z" stroke="black" fill="white" style="stroke-width:2;" /></g><text x="167.500000" y="176.500000" class="text-mono fill-N1" style="text-anchor:middle;font-size:16px">SATELLITES</text></g><g id="NETWORK.CELL TOWER.transmitter"><g class="shape" ><rect x="92.000000" y="325.000000" width="151.000000" height="66.000000" stroke="black" fill="white" style="stroke-width:2;" /></g><text x="167.500000" y="363.500000" class="text-mono fill-N1" style="text-anchor:middle;font-size:16px">TRANSMITTER</text></g><g id="NETWORK.CELL TOWER.(satellites -&gt; transmitter)[0]"><marker id="mk-27687146" 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" fill="black" class="connection" stroke-width="2" /> </marker><path d="M 140.804279 206.603201 C 106.200000 253.000000 106.250000 277.200000 139.875404 322.781103" stroke="black" fill="none" class="connection" style="stroke-width:2;" marker-end="url(#mk-27687146)" mask="url(#d2-2665946492)" /><text x="106.000000" y="271.000000" class="text-mono-italic fill-N2" style="text-anchor:middle;font-size:16px">SEND</text></g><g id="NETWORK.CELL TOWER.(satellites -&gt; transmitter)[1]"><path d="M 167.000000 207.000000 C 167.000000 253.000000 167.000000 277.200000 167.000000 322.000000" stroke="black" fill="none" class="connection" style="stroke-width:2;" marker-end="url(#mk-27687146)" mask="url(#d2-2665946492)" /><text x="167.000000" y="271.000000" class="text-mono-italic fill-N2" style="text-anchor:middle;font-size:16px">SEND</text></g><g id="NETWORK.CELL TOWER.(satellites -&gt; transmitter)[2]"><path d="M 193.195721 206.603201 C 227.800000 253.000000 227.750000 277.200000 194.124596 322.781103" stroke="black" fill="none" class="connection" style="stroke-width:2;" marker-end="url(#mk-27687146)" mask="url(#d2-2665946492)" /><text x="228.000000" y="271.000000" class="text-mono-italic fill-N2" style="text-anchor:middle;font-size:16px">SEND</text></g><mask id="d2-2665946492" maskUnits="userSpaceOnUse" x="-1" y="0" width="336" height="454">
<rect x="-1" y="0" width="336" height="454" fill="white"></rect>
<rect x="87.000000" y="255.000000" width="38" height="21" fill="black"></rect>
<rect x="148.000000" y="255.000000" width="38" height="21" fill="black"></rect>
<rect x="209.000000" y="255.000000" width="38" height="21" fill="black"></rect>
</defs><g id="NETWORK"><g class="shape" ><rect x="0.000000" y="41.000000" width="360.000000" height="412.000000" stroke="black" fill="#E7E9EE" style="stroke-width:2;" /><rect x="0.000000" y="41.000000" width="360.000000" height="412.000000" class="dots-overlay" style="stroke-width:2;" /><rect x="5.000000" y="46.000000" width="350.000000" height="402.000000" stroke="black" fill="transparent" style="stroke-width:2;" /></g><text x="180.000000" y="28.000000" class="text-mono fill-N1" style="text-anchor:middle;font-size:28px">NETWORK</text></g><g id="NETWORK.CELL TOWER"><g class="shape" ><rect x="20.000000" y="106.000000" width="320.000000" height="317.000000" stroke="black" fill="#F5F6F9" style="stroke-width:2;" /><rect x="20.000000" y="106.000000" width="320.000000" height="317.000000" class="dots-overlay" style="stroke-width:2;" /></g><text x="180.000000" y="94.000000" class="text-mono fill-N1" style="text-anchor:middle;font-size:24px">CELL TOWER</text></g><g id="NETWORK.CELL TOWER.satellites"><g class="shape" ><path d="M 125 128 H 271 C 267 128 256 146 256 161 C 256 176 267 194 271 194 H 125 C 121 194 110 176 110 161 C 110 146 121 128 125 128 Z" stroke="black" fill="white" style="stroke-width:2;" /><path d="M 115 138 H 261 C 257 138 246 156 246 171 C 246 186 257 204 261 204 H 115 C 111 204 100 186 100 171 C 100 156 111 138 115 138 Z" stroke="black" fill="white" style="stroke-width:2;" /></g><text x="180.500000" y="176.500000" class="text-mono fill-N1" style="text-anchor:middle;font-size:16px">SATELLITES</text></g><g id="NETWORK.CELL TOWER.transmitter"><g class="shape" ><rect x="105.000000" y="325.000000" width="151.000000" height="66.000000" stroke="black" fill="white" style="stroke-width:2;" /></g><text x="180.500000" y="363.500000" class="text-mono fill-N1" style="text-anchor:middle;font-size:16px">TRANSMITTER</text></g><g id="NETWORK.CELL TOWER.(satellites -&gt; transmitter)[0]"><marker id="mk-27687146" 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" fill="black" class="connection" stroke-width="2" /> </marker><path d="M 150.723421 206.539593 C 112.200000 253.000000 112.250000 277.200000 149.714288 322.906432" stroke="black" fill="none" class="connection" style="stroke-width:2;" marker-end="url(#mk-27687146)" mask="url(#d2-3084549463)" /><text x="112.000000" y="271.000000" class="text-mono-italic fill-N2" style="text-anchor:middle;font-size:16px">SEND</text></g><g id="NETWORK.CELL TOWER.(satellites -&gt; transmitter)[1]"><path d="M 180.008333 206.999983 C 180.200000 253.000000 180.250000 277.200000 180.250000 322.000000" stroke="black" fill="none" class="connection" style="stroke-width:2;" marker-end="url(#mk-27687146)" mask="url(#d2-3084549463)" /><text x="180.000000" y="271.000000" class="text-mono-italic fill-N2" style="text-anchor:middle;font-size:16px">SEND</text></g><g id="NETWORK.CELL TOWER.(satellites -&gt; transmitter)[2]"><path d="M 209.284135 206.533296 C 248.200000 253.000000 248.250000 277.200000 210.785712 322.906432" stroke="black" fill="none" class="connection" style="stroke-width:2;" marker-end="url(#mk-27687146)" mask="url(#d2-3084549463)" /><text x="248.000000" y="271.000000" class="text-mono-italic fill-N2" style="text-anchor:middle;font-size:16px">SEND</text></g><mask id="d2-3084549463" maskUnits="userSpaceOnUse" x="-1" y="0" width="362" height="454">
<rect x="-1" y="0" width="362" height="454" fill="white"></rect>
<rect x="93.000000" y="255.000000" width="38" height="21" fill="black"></rect>
<rect x="161.000000" y="255.000000" width="38" height="21" fill="black"></rect>
<rect x="229.000000" y="255.000000" width="38" height="21" fill="black"></rect>
</mask></svg></svg>

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 19 KiB

View file

@ -10,7 +10,7 @@
"x": 0,
"y": 41
},
"width": 1200,
"width": 1220,
"height": 125,
"opacity": 1,
"strokeDash": 0,
@ -294,10 +294,10 @@
"id": "osvc",
"type": "rectangle",
"pos": {
"x": 826,
"x": 796,
"y": 328
},
"width": 364,
"width": 414,
"height": 125,
"opacity": 1,
"strokeDash": 0,
@ -335,7 +335,7 @@
"id": "osvc.vm1",
"type": "rectangle",
"pos": {
"x": 926,
"x": 916,
"y": 357
},
"width": 76,
@ -376,7 +376,7 @@
"id": "osvc.vm2",
"type": "rectangle",
"pos": {
"x": 1074,
"x": 1094,
"y": 357
},
"width": 76,
@ -442,19 +442,19 @@
"labelPercentage": 0,
"route": [
{
"x": 884.75,
"x": 854.75,
"y": 166
},
{
"x": 884.75,
"x": 854.75,
"y": 214.4
},
{
"x": 884.75,
"x": 854.75,
"y": 246.9
},
{
"x": 884.75,
"x": 854.75,
"y": 328.5
}
],
@ -491,19 +491,19 @@
"labelPercentage": 0,
"route": [
{
"x": 966.75,
"x": 956.75,
"y": 166
},
{
"x": 966.75,
"x": 956.75,
"y": 214.4
},
{
"x": 966.75,
"x": 956.75,
"y": 238.7
},
{
"x": 966.75,
"x": 956.75,
"y": 287.5
}
],
@ -540,19 +540,19 @@
"labelPercentage": 0,
"route": [
{
"x": 1042.75,
"x": 1052.75,
"y": 166
},
{
"x": 1042.75,
"x": 1052.75,
"y": 214.4
},
{
"x": 1042.75,
"x": 1052.75,
"y": 238.7
},
{
"x": 1042.75,
"x": 1052.75,
"y": 287.5
}
],
@ -589,19 +589,19 @@
"labelPercentage": 0,
"route": [
{
"x": 1137,
"x": 1157,
"y": 166
},
{
"x": 1137,
"x": 1157,
"y": 214.4
},
{
"x": 1137,
"x": 1157,
"y": 246.9
},
{
"x": 1137,
"x": 1157,
"y": 328.5
}
],

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 25 KiB

View file

@ -10,7 +10,7 @@
"x": 0,
"y": 41
},
"width": 806,
"width": 834,
"height": 1314,
"opacity": 1,
"strokeDash": 0,
@ -51,7 +51,7 @@
"x": 20,
"y": 106
},
"width": 567,
"width": 595,
"height": 1219,
"opacity": 1,
"strokeDash": 0,
@ -92,7 +92,7 @@
"x": 40,
"y": 721
},
"width": 393,
"width": 421,
"height": 572,
"opacity": 1,
"strokeDash": 0,
@ -252,7 +252,7 @@
"id": "aa.bb.cc.gg",
"type": "text",
"pos": {
"x": 190,
"x": 187,
"y": 1043
},
"width": 17,
@ -292,7 +292,7 @@
"id": "aa.bb.cc.hh",
"type": "rectangle",
"pos": {
"x": 324,
"x": 334,
"y": 1189
},
"width": 63,
@ -336,7 +336,7 @@
"x": 52,
"y": 169
},
"width": 469,
"width": 496,
"height": 161,
"opacity": 1,
"strokeDash": 0,
@ -374,7 +374,7 @@
"id": "aa.bb.ii.jj",
"type": "diamond",
"pos": {
"x": 431,
"x": 458,
"y": 204
},
"width": 50,
@ -415,7 +415,7 @@
"id": "aa.bb.kk",
"type": "oval",
"pos": {
"x": 474,
"x": 501,
"y": 1169
},
"width": 74,
@ -456,7 +456,7 @@
"id": "aa.ll",
"type": "rectangle",
"pos": {
"x": 670,
"x": 698,
"y": 772
},
"width": 54,
@ -497,7 +497,7 @@
"id": "aa.mm",
"type": "cylinder",
"pos": {
"x": 662,
"x": 689,
"y": 433
},
"width": 71,
@ -538,7 +538,7 @@
"id": "aa.nn",
"type": "text",
"pos": {
"x": 628,
"x": 655,
"y": 1178
},
"width": 16,
@ -578,7 +578,7 @@
"id": "aa.oo",
"type": "rectangle",
"pos": {
"x": 704,
"x": 731,
"y": 1155
},
"width": 63,
@ -652,12 +652,12 @@
"y": 910.3
},
{
"x": 132.35,
"y": 995.1959501557633
"x": 131.8,
"y": 995.1
},
{
"x": 189.75,
"y": 1045.9797507788162
"x": 187,
"y": 1045.5
}
],
"isCurve": true,
@ -693,20 +693,20 @@
"labelPercentage": 0,
"route": [
{
"x": 198.25,
"x": 195.5,
"y": 1064
},
{
"x": 198.25,
"x": 195.5,
"y": 1112.4
},
{
"x": 223.45,
"y": 1140.1
"x": 223.3,
"y": 1140.3
},
{
"x": 324.25,
"y": 1202.5
"x": 334.5,
"y": 1203.5
}
],
"isCurve": true,
@ -815,12 +815,12 @@
"labelPercentage": 0,
"route": [
{
"x": 670.25,
"y": 811.7993675333802
"x": 697.5,
"y": 811.4285714285714
},
{
"x": 587.25,
"y": 866.7993675333802
"x": 614.5,
"y": 865.4285714285714
}
],
"animated": false,
@ -855,12 +855,12 @@
"labelPercentage": 0,
"route": [
{
"x": 662,
"y": 501
"x": 689,
"y": 500
},
{
"x": 284.79999999999995,
"y": 589.8
"x": 290.2,
"y": 589.6
},
{
"x": 190.5,
@ -904,31 +904,31 @@
"labelPercentage": 0,
"route": [
{
"x": 697,
"x": 725,
"y": 552
},
{
"x": 697.2,
"x": 724.6,
"y": 600
},
{
"x": 697.25,
"x": 724.5,
"y": 624.1
},
{
"x": 697.25,
"x": 724.5,
"y": 642.25
},
{
"x": 697.25,
"x": 724.5,
"y": 660.4
},
{
"x": 697.25,
"x": 724.5,
"y": 732.5
},
{
"x": 697.25,
"x": 724.5,
"y": 772.5
}
],
@ -965,12 +965,12 @@
"labelPercentage": 0,
"route": [
{
"x": 662,
"x": 689,
"y": 505
},
{
"x": 587.75,
"y": 568.4633307868602
"x": 615,
"y": 566.9955817378498
}
],
"animated": false,
@ -1005,19 +1005,19 @@
"labelPercentage": 0,
"route": [
{
"x": 670.25,
"y": 811.1842105263158
"x": 697.5,
"y": 810.8167259786477
},
{
"x": 376.45,
"y": 873.0368421052632
"x": 381.9,
"y": 872.9633451957295
},
{
"x": 283.8,
"x": 283.2,
"y": 968.7
},
{
"x": 207,
"x": 204,
"y": 1047.5
}
],
@ -1054,19 +1054,19 @@
"labelPercentage": 0,
"route": [
{
"x": 662,
"x": 689,
"y": 473
},
{
"x": 517.8,
"x": 545,
"y": 393
},
{
"x": 481.8,
"x": 509,
"y": 364.6
},
{
"x": 482,
"x": 509,
"y": 331
}
],
@ -1103,12 +1103,12 @@
"labelPercentage": 0,
"route": [
{
"x": 434,
"x": 461,
"y": 896.5
},
{
"x": 670,
"y": 813.5
"x": 697.5,
"y": 812.9328358208955
}
],
"animated": false,
@ -1143,56 +1143,56 @@
"labelPercentage": 0,
"route": [
{
"x": 454,
"x": 481,
"y": 331
},
{
"x": 453.8,
"x": 481,
"y": 364.6
},
{
"x": 453.75,
"x": 481,
"y": 396.9
},
{
"x": 453.75,
"x": 481,
"y": 432.75
},
{
"x": 453.75,
"x": 481,
"y": 468.6
},
{
"x": 453.75,
"x": 481,
"y": 516.4
},
{
"x": 453.75,
"x": 481,
"y": 552.25
},
{
"x": 453.75,
"x": 481,
"y": 588.1
},
{
"x": 453.75,
"x": 481,
"y": 624.1
},
{
"x": 453.75,
"x": 481,
"y": 642.25
},
{
"x": 453.75,
"x": 481,
"y": 660.4
},
{
"x": 496.95,
"y": 737.3
"x": 524.3,
"y": 737.2593429158111
},
{
"x": 669.75,
"y": 796.5
"x": 697.5,
"y": 796.2967145790554
}
],
"isCurve": true,

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 39 KiB

View file

@ -0,0 +1,716 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{
"id": "flow1",
"type": "rectangle",
"pos": {
"x": 0,
"y": 0
},
"width": 128,
"height": 100,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 10,
"borderRadius": 0,
"fill": "white",
"stroke": "cornflowerblue",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 0,
"labelHeight": 0,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "flow2",
"type": "rectangle",
"pos": {
"x": 168,
"y": 0
},
"width": 128,
"height": 100,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 10,
"borderRadius": 0,
"fill": "white",
"stroke": "cornflowerblue",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 0,
"labelHeight": 0,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "flow3",
"type": "rectangle",
"pos": {
"x": 336,
"y": 0
},
"width": 128,
"height": 100,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 10,
"borderRadius": 0,
"fill": "white",
"stroke": "cornflowerblue",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 0,
"labelHeight": 0,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "flow4",
"type": "rectangle",
"pos": {
"x": 504,
"y": 0
},
"width": 128,
"height": 100,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 10,
"borderRadius": 0,
"fill": "white",
"stroke": "cornflowerblue",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 0,
"labelHeight": 0,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "flow5",
"type": "rectangle",
"pos": {
"x": 672,
"y": 0
},
"width": 128,
"height": 100,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 10,
"borderRadius": 0,
"fill": "white",
"stroke": "cornflowerblue",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 0,
"labelHeight": 0,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "flow6",
"type": "rectangle",
"pos": {
"x": 0,
"y": 140
},
"width": 240,
"height": 100,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 10,
"borderRadius": 0,
"fill": "white",
"stroke": "cornflowerblue",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 0,
"labelHeight": 0,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "flow7",
"type": "rectangle",
"pos": {
"x": 280,
"y": 140
},
"width": 120,
"height": 100,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 10,
"borderRadius": 0,
"fill": "white",
"stroke": "cornflowerblue",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 0,
"labelHeight": 0,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "flow8",
"type": "rectangle",
"pos": {
"x": 440,
"y": 140
},
"width": 160,
"height": 100,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 10,
"borderRadius": 0,
"fill": "white",
"stroke": "cornflowerblue",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 0,
"labelHeight": 0,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "flow9",
"type": "rectangle",
"pos": {
"x": 640,
"y": 140
},
"width": 160,
"height": 100,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 10,
"borderRadius": 0,
"fill": "white",
"stroke": "cornflowerblue",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 0,
"labelHeight": 0,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "DAGGER ENGINE",
"type": "rectangle",
"pos": {
"x": 0,
"y": 280
},
"width": 800,
"height": 61,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 8,
"borderRadius": 0,
"fill": "beige",
"stroke": "darkcyan",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "DAGGER ENGINE",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "blue",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 114,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "ANY DOCKER COMPATIBLE RUNTIME",
"type": "rectangle",
"pos": {
"x": 0,
"y": 381
},
"width": 800,
"height": 87,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 8,
"borderRadius": 0,
"fill": "lightcyan",
"stroke": "darkcyan",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": {
"Scheme": "https",
"Opaque": "",
"User": null,
"Host": "icons.terrastruct.com",
"Path": "/dev/docker.svg",
"RawPath": "/dev%2Fdocker.svg",
"OmitHost": false,
"ForceQuery": false,
"RawQuery": "",
"Fragment": "",
"RawFragment": ""
},
"iconPosition": "INSIDE_MIDDLE_CENTER",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "ANY DOCKER COMPATIBLE RUNTIME",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "black",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 255,
"labelHeight": 21,
"labelPosition": "INSIDE_TOP_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "ANY CI",
"type": "rectangle",
"pos": {
"x": 0,
"y": 508
},
"width": 139,
"height": 66,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 8,
"borderRadius": 0,
"fill": "gold",
"stroke": "maroon",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "ANY CI",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "maroon",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 46,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "WINDOWS",
"type": "rectangle",
"pos": {
"x": 179,
"y": 508
},
"width": 117,
"height": 66,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"borderRadius": 0,
"fill": "darkcyan",
"stroke": "black",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "WINDOWS",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "white",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 72,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "LINUX",
"type": "rectangle",
"pos": {
"x": 336,
"y": 508
},
"width": 139,
"height": 66,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"borderRadius": 0,
"fill": "darkcyan",
"stroke": "black",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "LINUX",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "white",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 43,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "MACOS",
"type": "rectangle",
"pos": {
"x": 515,
"y": 508
},
"width": 106,
"height": 66,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"borderRadius": 0,
"fill": "darkcyan",
"stroke": "black",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "MACOS",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "white",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 50,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "KUBERNETES",
"type": "rectangle",
"pos": {
"x": 661,
"y": 508
},
"width": 139,
"height": 66,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"borderRadius": 0,
"fill": "darkcyan",
"stroke": "black",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "KUBERNETES",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "white",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 94,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
}
],
"connections": [],
"root": {
"id": "",
"type": "",
"pos": {
"x": 0,
"y": 0
},
"width": 0,
"height": 0,
"opacity": 0,
"strokeDash": 0,
"strokeWidth": 0,
"borderRadius": 0,
"fill": "black",
"stroke": "",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 0,
"labelHeight": 0,
"zIndex": 0,
"level": 0
}
}

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 14 KiB

716
e2etests/testdata/stable/dagger_grid/elk/board.exp.json generated vendored Normal file
View file

@ -0,0 +1,716 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{
"id": "flow1",
"type": "rectangle",
"pos": {
"x": 0,
"y": 0
},
"width": 128,
"height": 100,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 10,
"borderRadius": 0,
"fill": "white",
"stroke": "cornflowerblue",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 0,
"labelHeight": 0,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "flow2",
"type": "rectangle",
"pos": {
"x": 168,
"y": 0
},
"width": 128,
"height": 100,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 10,
"borderRadius": 0,
"fill": "white",
"stroke": "cornflowerblue",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 0,
"labelHeight": 0,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "flow3",
"type": "rectangle",
"pos": {
"x": 336,
"y": 0
},
"width": 128,
"height": 100,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 10,
"borderRadius": 0,
"fill": "white",
"stroke": "cornflowerblue",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 0,
"labelHeight": 0,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "flow4",
"type": "rectangle",
"pos": {
"x": 504,
"y": 0
},
"width": 128,
"height": 100,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 10,
"borderRadius": 0,
"fill": "white",
"stroke": "cornflowerblue",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 0,
"labelHeight": 0,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "flow5",
"type": "rectangle",
"pos": {
"x": 672,
"y": 0
},
"width": 128,
"height": 100,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 10,
"borderRadius": 0,
"fill": "white",
"stroke": "cornflowerblue",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 0,
"labelHeight": 0,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "flow6",
"type": "rectangle",
"pos": {
"x": 0,
"y": 140
},
"width": 240,
"height": 100,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 10,
"borderRadius": 0,
"fill": "white",
"stroke": "cornflowerblue",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 0,
"labelHeight": 0,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "flow7",
"type": "rectangle",
"pos": {
"x": 280,
"y": 140
},
"width": 120,
"height": 100,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 10,
"borderRadius": 0,
"fill": "white",
"stroke": "cornflowerblue",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 0,
"labelHeight": 0,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "flow8",
"type": "rectangle",
"pos": {
"x": 440,
"y": 140
},
"width": 160,
"height": 100,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 10,
"borderRadius": 0,
"fill": "white",
"stroke": "cornflowerblue",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 0,
"labelHeight": 0,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "flow9",
"type": "rectangle",
"pos": {
"x": 640,
"y": 140
},
"width": 160,
"height": 100,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 10,
"borderRadius": 0,
"fill": "white",
"stroke": "cornflowerblue",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 0,
"labelHeight": 0,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "DAGGER ENGINE",
"type": "rectangle",
"pos": {
"x": 0,
"y": 280
},
"width": 800,
"height": 61,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 8,
"borderRadius": 0,
"fill": "beige",
"stroke": "darkcyan",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "DAGGER ENGINE",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "blue",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 114,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "ANY DOCKER COMPATIBLE RUNTIME",
"type": "rectangle",
"pos": {
"x": 0,
"y": 381
},
"width": 800,
"height": 87,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 8,
"borderRadius": 0,
"fill": "lightcyan",
"stroke": "darkcyan",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": {
"Scheme": "https",
"Opaque": "",
"User": null,
"Host": "icons.terrastruct.com",
"Path": "/dev/docker.svg",
"RawPath": "/dev%2Fdocker.svg",
"OmitHost": false,
"ForceQuery": false,
"RawQuery": "",
"Fragment": "",
"RawFragment": ""
},
"iconPosition": "INSIDE_MIDDLE_CENTER",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "ANY DOCKER COMPATIBLE RUNTIME",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "black",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 255,
"labelHeight": 21,
"labelPosition": "INSIDE_TOP_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "ANY CI",
"type": "rectangle",
"pos": {
"x": 0,
"y": 508
},
"width": 139,
"height": 66,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 8,
"borderRadius": 0,
"fill": "gold",
"stroke": "maroon",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "ANY CI",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "maroon",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 46,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "WINDOWS",
"type": "rectangle",
"pos": {
"x": 179,
"y": 508
},
"width": 117,
"height": 66,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"borderRadius": 0,
"fill": "darkcyan",
"stroke": "black",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "WINDOWS",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "white",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 72,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "LINUX",
"type": "rectangle",
"pos": {
"x": 336,
"y": 508
},
"width": 139,
"height": 66,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"borderRadius": 0,
"fill": "darkcyan",
"stroke": "black",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "LINUX",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "white",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 43,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "MACOS",
"type": "rectangle",
"pos": {
"x": 515,
"y": 508
},
"width": 106,
"height": 66,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"borderRadius": 0,
"fill": "darkcyan",
"stroke": "black",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "MACOS",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "white",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 50,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "KUBERNETES",
"type": "rectangle",
"pos": {
"x": 661,
"y": 508
},
"width": 139,
"height": 66,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"borderRadius": 0,
"fill": "darkcyan",
"stroke": "black",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "KUBERNETES",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "white",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 94,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
}
],
"connections": [],
"root": {
"id": "",
"type": "",
"pos": {
"x": 0,
"y": 0
},
"width": 0,
"height": 0,
"opacity": 0,
"strokeDash": 0,
"strokeWidth": 0,
"borderRadius": 0,
"fill": "black",
"stroke": "",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 0,
"labelHeight": 0,
"zIndex": 0,
"level": 0
}
}

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 14 KiB

View file

@ -0,0 +1,319 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{
"id": "student",
"type": "rectangle",
"pos": {
"x": 110,
"y": 0
},
"width": 100,
"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": "student",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 55,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "committee chair",
"type": "rectangle",
"pos": {
"x": 79,
"y": 187
},
"width": 162,
"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": "committee chair",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 117,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "committee",
"type": "rectangle",
"pos": {
"x": 99,
"y": 374
},
"width": 122,
"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": "committee",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 77,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
}
],
"connections": [
{
"id": "(student -> committee chair)[0]",
"src": "student",
"srcArrow": "none",
"srcLabel": "",
"dst": "committee chair",
"dstArrow": "triangle",
"dstLabel": "",
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"stroke": "B1",
"borderRadius": 10,
"label": "Apply for appeal",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N2",
"italic": true,
"bold": false,
"underline": false,
"labelWidth": 109,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"labelPercentage": 0,
"route": [
{
"x": 126.13235294117646,
"y": 66
},
{
"x": 76.82647058823528,
"y": 114.4
},
{
"x": 76.9,
"y": 138.7
},
{
"x": 126.5,
"y": 187.5
}
],
"isCurve": true,
"animated": false,
"tooltip": "",
"icon": null,
"zIndex": 0
},
{
"id": "(student <- committee chair)[0]",
"src": "student",
"srcArrow": "triangle",
"srcLabel": "",
"dst": "committee chair",
"dstArrow": "none",
"dstLabel": "",
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"stroke": "B1",
"borderRadius": 10,
"label": "Deny. Need more information",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N2",
"italic": true,
"bold": false,
"underline": false,
"labelWidth": 192,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"labelPercentage": 0,
"route": [
{
"x": 193.36764705882354,
"y": 66
},
{
"x": 242.67352941176472,
"y": 114.4
},
{
"x": 242.6,
"y": 138.7
},
{
"x": 193,
"y": 187.5
}
],
"isCurve": true,
"animated": false,
"tooltip": "",
"icon": null,
"zIndex": 0
},
{
"id": "(committee chair -> committee)[0]",
"src": "committee chair",
"srcArrow": "none",
"srcLabel": "",
"dst": "committee",
"dstArrow": "triangle",
"dstLabel": "",
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"stroke": "B1",
"borderRadius": 10,
"label": "Accept appeal",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N2",
"italic": true,
"bold": false,
"underline": false,
"labelWidth": 94,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"labelPercentage": 0,
"route": [
{
"x": 159.75,
"y": 253
},
{
"x": 159.75,
"y": 301.4
},
{
"x": 159.75,
"y": 325.7
},
{
"x": 159.75,
"y": 374.5
}
],
"isCurve": true,
"animated": false,
"tooltip": "",
"icon": null,
"zIndex": 0
}
],
"root": {
"id": "",
"type": "",
"pos": {
"x": 0,
"y": 0
},
"width": 0,
"height": 0,
"opacity": 0,
"strokeDash": 0,
"strokeWidth": 0,
"borderRadius": 0,
"fill": "N7",
"stroke": "",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 0,
"labelHeight": 0,
"zIndex": 0,
"level": 0
}
}

View file

@ -0,0 +1,104 @@
<?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.3.0-HEAD" preserveAspectRatio="xMinYMin meet" viewBox="0 0 317 442"><svg id="d2-svg" class="d2-802819785" width="317" height="442" viewBox="22 -1 317 442"><rect x="22.000000" y="-1.000000" width="317.000000" height="442.000000" rx="0.000000" class=" fill-N7" stroke-width="0" /><style type="text/css"><![CDATA[
.d2-802819785 .text-bold {
font-family: "d2-802819785-font-bold";
}
@font-face {
font-family: d2-802819785-font-bold;
src: url("data:application/font-woff;base64,d09GRgABAAAAAAusAAoAAAAAEjAAAguFAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAAA9AAAAGAAAABgXxHXrmNtYXAAAAFUAAAAiAAAAKoCcgN4Z2x5ZgAAAdwAAAVzAAAHGJci3TNoZWFkAAAHUAAAADYAAAA2G38e1GhoZWEAAAeIAAAAJAAAACQKfwXYaG10eAAAB6wAAABkAAAAZC36BA9sb2NhAAAIEAAAADQAAAA0FpIYfm1heHAAAAhEAAAAIAAAACAAMQD3bmFtZQAACGQAAAMoAAAIKgjwVkFwb3N0AAALjAAAAB0AAAAg/9EAMgADAioCvAAFAAACigJYAAAASwKKAlgAAAFeADIBKQAAAgsHAwMEAwICBGAAAvcAAAADAAAAAAAAAABBREJPACAAIP//Au7/BgAAA9gBESAAAZ8AAAAAAfAClAAAACAAA3icbMy/aQIBHEDh73KX5JJckvMvlk7gDoK1O4ggChYiWLiCMwiKOoOtOIqdW/xEO8HXfvCQSCUoZFZoKaVybR1dPX0DIxMzC8sInmRobGp+l7jENc5ximMcYh+72MYm1o/36xJNb1KZdx8+5b58+1H49edfqaKqpq7BDQAA//8BAAD//8ZFH9h4nGSUTWwT+RnG3//f9gxxJh/j8cz4+2viGTvBDvZ4PPl2nDgxATsfRCQEEkJR1dKGJIiYJkWtWqm0UksoLUZtVar20krdFRzQXli02ZX2wiK4ActptbvaFXvcaGWtVsgZr8Z2EqI92P/b8/6e93nmBRNMAuDz+DYYoAFawAIsgEz76aAsSQKpyqoq8AZVQjQ5iS3a//4rhY3hsLHd9w/v1cVFlD+Lb+9cPJM/f/7bxd5e7d/vPtRuoLWHALjyGgAP401oABqAIWVJFCWBIAyMzAiSQL5qvd7S5GwyUvbXT+8//VfoUQgd6+uLrciJZe33eHOncOcOAACGPADO4U0w18jkOMexVoIQJDmeTCoJURSE/IMf35qavHku4uqajkanu1x4M3Pz0qVb2fXQ/Pj4XBAA0J4OU1VheFkUFUWmBYMkcBzL5v/+9qDR2LypP6YmvKm995fEb3te7RTQyJ+Tv+r5qsrSXimh56gMdhAA+ICoJJKqKAoBgpSSSTnOsbSge1TjSVUhCNbKvZ+ZvFbEQtg72KZ0LvUs/mTDbPRmD9mDzHifl5pNjZ9q8Us29kfutpXL2peyS7jMM7PmDreNrzK3VUpoC5XBAWAKiPo4fQpP6iNZKyfHkypPEMg+spo++otMNOsaEXxKKnXEFmV6gjNU/5UT04V+D7/ozqUH82zLOZ+ztlOpUkJlvAUM+HZ9VIUlfSF7DsT6mG/mV3sXE+EuO1HcMBsdo9gmWZgOq5DspK7/curKgMuWe2tnOOYQNqz2J5bm4ezYCOAq++eoDDbwHqDX0yP9HCfHdXaDnNCnIG/28tDwxd7sQqcRay/NozElGRPP/vMd6XAgSQ0UTkwVUqmlDBNsSMr+OYcH9YSVTqjuyAaACvix/sq0oKj7S6riszIr0KeHhtomh72JVmeTg3J65ubQr5dNTmUmQREXTSa/6FnTfqdrpfXl4C2wVjvCkruh0lVIkk4XSdfx+NRY0e1zhWx46+6cvWNpQXuK/MmQndfuQ6UCKgB8gp9hEfQMSbDBn6qc6UoJWfAWtNQ2Tsv0XoAf5XqLdIOJJCxUkDpzHAs7L3kLQssmssZkcKMy+KtMvFxzd4CM3HvTer9GY0qa8R+LTR4vun3BI/pfJ9oe9EY6QoHYLu4R7X792fWNynXf9Rlv+t4wG335PeNoO+WJHPBdyxuTqAwt4PxB3oQU1z/VWp0Ql1rNZFZTqZVMZiUViUYj0Uik3tX+wvSJK/3r+cF0Tq+srpuuHMUcKgMDHgB+n06/AQFR4llG1xYCJMtxOqd7TDp9oW8x6etzmCbE5ExHuzX0AP8/5hD+uHZyI+W0T/wVtY3m/hB5YmmuZ45uojJYDuy31p6ac2dOZF1mW5O91dVvRduz8ZjJ9BujMRzXPgMEbKWE/oPKIFVzlVS92dW7JEWxktgXY60c78GslXgW+6k4FEh5/R531OHpDf3sZPesd8iRcHR3i77+8AVK9M7bnTxDc4yZausOj8xItlNWTrLZmxuF7ujwQq33dKWEVnBBb5kpICqKoKiqrLf9jcMA8xOZHH11fV1wU3Yzz6jUz2ceLxPXrq09ag8SxiWCqmn1VUroO7St53+gm3T9HHw8NVb0+FwiV9xoNHiPUUsLKKF9qoQdbnRUax0JHgYEVGUA7aBtPf39PaiqQeY5Tt+qqsqGZrzB+VscpOVQMGQmP7idbbSYjYfohr4bd/muiQ8J4yVkanM70BcvAqNBISu80BoHTrbXGPsrJfga7kHj7sWqleBvoiyLoixTihRSlJCk1DOF52gbDNVM6XQRbWutgCr3cDdM42e6Bv2GRjAaDQajUdzdLgjt+g++BwAA//8BAAD//0iTdr0AAAEAAAACC4XNUav5Xw889QABA+gAAAAA2F2ghAAAAADdZi82/jf+xAhtA/EAAQADAAIAAAAAAAAAAQAAA9j+7wAACJj+N/43CG0AAQAAAAAAAAAAAAAAAAAAABkCsgBQAMgAAAI9//oCewBNApkATQIPACoB0wAkAj0AJwIGACQBVQAYAjsAQQEUADcBHgBBA1kAQQI8AEECKwAkAj0AQQGOAEEBuwAVAX8AEQI4ADwCCQAMASwAPQEUAEEAAP+tAAAALAAsAFAAdACWAM4A+gEsAWABhgGoAbQB0AICAiQCUAKAAqAC3AMCAyQDVANqA3YDjAABAAAAGQCQAAwAYwAHAAEAAAAAAAAAAAAAAAAABAADeJyclM9uG1UUxn9ObNMKwQJFVbqJ7oJFkejYVEnVNiuH1IpFFAePC0JCSBPP+I8ynhl5Jg7hCVjzFrxFVzwEz4FYo/l87NgF0SaKknx37vnznXO+c4Ed/mabSvUh8Ec9MVxhr35ueIsH9RPD27TrW4arPKn9abhGWJsbrvN5rWf4I95WfzP8gP3qT4YfslttG/6YZ9Udw59sO/4y/Cn7vF3gCrzgV8MVdskMb7HDj4a3eYTFrFR5RNNwjc/YM1xnD+gzoSBmQsIIx5AJI66YEZHjEzFjwpCIEEeHFjGFviYEQo7Rf34N8CmYESjimAJHjE9MQM7YIv4ir5RzZRzqNLO7FgVjAi7kcUlAgiNlREpCxKXiFBRkvKJBg5yB+GYU5HjkTIjxSJkxokGXNqf0GTMhx9FWpJKZT8qQgmsC5XdmUXZmQERCbqyuSAjF04lfJO8Opzi6ZLJdj3y6EeFLHN/Ju+SWyvYrPP26NWabeZdsAubqZ6yuxLq51gTHui3ztvhWuOAV7l792WTy/h6F+l8o8gVXmn+oSSVikuDcLi18Kch3j3Ec6dzBV0e+p0OfE7q8oa9zix49WpzRp8Nr+Xbp4fiaLmccy6MjvLhrSzFn/IDjGzqyKWNH1p/FxCJ+JjN15+I4Ux1TMvW8ZO6p1kgV3n3C5Q6lG+rI5TPQHpWWTvNLtGcBI1NFJoZT9XKpjdz6F5oipqqlnO3tfbkNc9u95RbfkGqHS7UuOJWTWzB631S9dzRzrR+PgJCUC1kMSJnSoOBGvM8JuCLGcazunWhLClornzLPjVQSMRWDDonizMj0NzDd+MZ9sKF7Z29JKP+S6eWqqvtkcerV7YzeqHvLO9+6HK1NoGFTTdfUNBDXxLQfaafW+fvyzfW6pTzliJSY8F8vwDM8muxzwCFjZRjoZm6vQ1MvRJOXHKr6SyJZDaXnyCIc4PGcAw54yfN3+rhk4oyLW3FZz93imCO6HH5QFQv7Lke8Xn37/6y/i2lTtTierk4v7j3FJ3dQ6xfas9v3sqeJlZOYW7TbrTgjYFpycbvrNbnHeP8AAAD//wEAAP//9LdPUXicYmBmAIP/5xiMGLAAAAAAAP//AQAA//8vAQIDAAAA");
}
.d2-802819785 .text-italic {
font-family: "d2-802819785-font-italic";
}
@font-face {
font-family: d2-802819785-font-italic;
src: url("data:application/font-woff;base64,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");
}]]></style><style type="text/css"><![CDATA[.shape {
shape-rendering: geometricPrecision;
stroke-linejoin: round;
}
.connection {
stroke-linecap: round;
stroke-linejoin: round;
}
.blend {
mix-blend-mode: multiply;
opacity: 0.5;
}
.d2-802819785 .fill-N1{fill:#0A0F25;}
.d2-802819785 .fill-N2{fill:#676C7E;}
.d2-802819785 .fill-N3{fill:#9499AB;}
.d2-802819785 .fill-N4{fill:#CFD2DD;}
.d2-802819785 .fill-N5{fill:#DEE1EB;}
.d2-802819785 .fill-N6{fill:#EEF1F8;}
.d2-802819785 .fill-N7{fill:#FFFFFF;}
.d2-802819785 .fill-B1{fill:#0D32B2;}
.d2-802819785 .fill-B2{fill:#0D32B2;}
.d2-802819785 .fill-B3{fill:#E3E9FD;}
.d2-802819785 .fill-B4{fill:#E3E9FD;}
.d2-802819785 .fill-B5{fill:#EDF0FD;}
.d2-802819785 .fill-B6{fill:#F7F8FE;}
.d2-802819785 .fill-AA2{fill:#4A6FF3;}
.d2-802819785 .fill-AA4{fill:#EDF0FD;}
.d2-802819785 .fill-AA5{fill:#F7F8FE;}
.d2-802819785 .fill-AB4{fill:#EDF0FD;}
.d2-802819785 .fill-AB5{fill:#F7F8FE;}
.d2-802819785 .stroke-N1{stroke:#0A0F25;}
.d2-802819785 .stroke-N2{stroke:#676C7E;}
.d2-802819785 .stroke-N3{stroke:#9499AB;}
.d2-802819785 .stroke-N4{stroke:#CFD2DD;}
.d2-802819785 .stroke-N5{stroke:#DEE1EB;}
.d2-802819785 .stroke-N6{stroke:#EEF1F8;}
.d2-802819785 .stroke-N7{stroke:#FFFFFF;}
.d2-802819785 .stroke-B1{stroke:#0D32B2;}
.d2-802819785 .stroke-B2{stroke:#0D32B2;}
.d2-802819785 .stroke-B3{stroke:#E3E9FD;}
.d2-802819785 .stroke-B4{stroke:#E3E9FD;}
.d2-802819785 .stroke-B5{stroke:#EDF0FD;}
.d2-802819785 .stroke-B6{stroke:#F7F8FE;}
.d2-802819785 .stroke-AA2{stroke:#4A6FF3;}
.d2-802819785 .stroke-AA4{stroke:#EDF0FD;}
.d2-802819785 .stroke-AA5{stroke:#F7F8FE;}
.d2-802819785 .stroke-AB4{stroke:#EDF0FD;}
.d2-802819785 .stroke-AB5{stroke:#F7F8FE;}
.d2-802819785 .background-color-N1{background-color:#0A0F25;}
.d2-802819785 .background-color-N2{background-color:#676C7E;}
.d2-802819785 .background-color-N3{background-color:#9499AB;}
.d2-802819785 .background-color-N4{background-color:#CFD2DD;}
.d2-802819785 .background-color-N5{background-color:#DEE1EB;}
.d2-802819785 .background-color-N6{background-color:#EEF1F8;}
.d2-802819785 .background-color-N7{background-color:#FFFFFF;}
.d2-802819785 .background-color-B1{background-color:#0D32B2;}
.d2-802819785 .background-color-B2{background-color:#0D32B2;}
.d2-802819785 .background-color-B3{background-color:#E3E9FD;}
.d2-802819785 .background-color-B4{background-color:#E3E9FD;}
.d2-802819785 .background-color-B5{background-color:#EDF0FD;}
.d2-802819785 .background-color-B6{background-color:#F7F8FE;}
.d2-802819785 .background-color-AA2{background-color:#4A6FF3;}
.d2-802819785 .background-color-AA4{background-color:#EDF0FD;}
.d2-802819785 .background-color-AA5{background-color:#F7F8FE;}
.d2-802819785 .background-color-AB4{background-color:#EDF0FD;}
.d2-802819785 .background-color-AB5{background-color:#F7F8FE;}
.d2-802819785 .color-N1{color:#0A0F25;}
.d2-802819785 .color-N2{color:#676C7E;}
.d2-802819785 .color-N3{color:#9499AB;}
.d2-802819785 .color-N4{color:#CFD2DD;}
.d2-802819785 .color-N5{color:#DEE1EB;}
.d2-802819785 .color-N6{color:#EEF1F8;}
.d2-802819785 .color-N7{color:#FFFFFF;}
.d2-802819785 .color-B1{color:#0D32B2;}
.d2-802819785 .color-B2{color:#0D32B2;}
.d2-802819785 .color-B3{color:#E3E9FD;}
.d2-802819785 .color-B4{color:#E3E9FD;}
.d2-802819785 .color-B5{color:#EDF0FD;}
.d2-802819785 .color-B6{color:#F7F8FE;}
.d2-802819785 .color-AA2{color:#4A6FF3;}
.d2-802819785 .color-AA4{color:#EDF0FD;}
.d2-802819785 .color-AA5{color:#F7F8FE;}
.d2-802819785 .color-AB4{color:#EDF0FD;}
.d2-802819785 .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><g id="student"><g class="shape" ><rect x="110.000000" y="0.000000" width="100.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="160.000000" y="38.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">student</text></g><g id="committee chair"><g class="shape" ><rect x="79.000000" y="187.000000" width="162.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="160.000000" y="225.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">committee chair</text></g><g id="committee"><g class="shape" ><rect x="99.000000" y="374.000000" width="122.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="160.000000" y="412.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">committee</text></g><g id="(student -&gt; committee chair)[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 124.705089 67.401041 C 76.826471 114.400000 76.900000 138.700000 123.648672 184.694661" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-802819785)" /><text x="76.500000" y="132.000000" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">Apply for appeal</text></g><g id="(student &lt;- committee chair)[0]"><marker id="mk-2451250203" markerWidth="10.000000" markerHeight="12.000000" refX="3.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="10.000000,0.000000 0.000000,6.000000 10.000000,12.000000" class="connection fill-B1" stroke-width="2" /> </marker><path d="M 196.222175 68.802083 C 242.673529 114.400000 242.600000 138.700000 194.425664 186.097330" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-start="url(#mk-2451250203)" mask="url(#d2-802819785)" /><text x="243.000000" y="132.000000" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">Deny. Need more information</text></g><g id="(committee chair -&gt; committee)[0]"><path d="M 159.750000 255.000000 C 159.750000 301.400000 159.750000 325.700000 159.750000 370.500000" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-802819785)" /><text x="160.000000" y="319.000000" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">Accept appeal</text></g><mask id="d2-802819785" maskUnits="userSpaceOnUse" x="22" y="-1" width="317" height="442">
<rect x="22" y="-1" width="317" height="442" fill="white"></rect>
<rect x="22.000000" y="116.000000" width="109" height="21" fill="black"></rect>
<rect x="147.000000" y="116.000000" width="192" height="21" fill="black"></rect>
<rect x="113.000000" y="303.000000" width="94" height="21" fill="black"></rect>
</mask></svg></svg>

After

Width:  |  Height:  |  Size: 17 KiB

View file

@ -0,0 +1,324 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{
"id": "student",
"type": "rectangle",
"pos": {
"x": 97,
"y": 12
},
"width": 100,
"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": "student",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 55,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "committee chair",
"type": "rectangle",
"pos": {
"x": 66,
"y": 259
},
"width": 162,
"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": "committee chair",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 117,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "committee",
"type": "rectangle",
"pos": {
"x": 86,
"y": 486
},
"width": 122,
"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": "committee",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 77,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
}
],
"connections": [
{
"id": "(student -> committee chair)[0]",
"src": "student",
"srcArrow": "none",
"srcLabel": "",
"dst": "committee chair",
"dstArrow": "triangle",
"dstLabel": "",
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"stroke": "B1",
"borderRadius": 10,
"label": "Apply for appeal",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N2",
"italic": true,
"bold": false,
"underline": false,
"labelWidth": 109,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"labelPercentage": 0,
"route": [
{
"x": 130.58333333333331,
"y": 78
},
{
"x": 130.58333333333331,
"y": 118
},
{
"x": 66.5,
"y": 118
},
{
"x": 66.5,
"y": 219
},
{
"x": 120.25,
"y": 219
},
{
"x": 120.25,
"y": 259
}
],
"animated": false,
"tooltip": "",
"icon": null,
"zIndex": 0
},
{
"id": "(student <- committee chair)[0]",
"src": "student",
"srcArrow": "triangle",
"srcLabel": "",
"dst": "committee chair",
"dstArrow": "none",
"dstLabel": "",
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"stroke": "B1",
"borderRadius": 10,
"label": "Deny. Need more information",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N2",
"italic": true,
"bold": false,
"underline": false,
"labelWidth": 192,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"labelPercentage": 0,
"route": [
{
"x": 163.91666666666666,
"y": 78
},
{
"x": 163.91666666666666,
"y": 118
},
{
"x": 228,
"y": 118
},
{
"x": 228,
"y": 219
},
{
"x": 174.25,
"y": 219
},
{
"x": 174.25,
"y": 259
}
],
"animated": false,
"tooltip": "",
"icon": null,
"zIndex": 0
},
{
"id": "(committee chair -> committee)[0]",
"src": "committee chair",
"srcArrow": "none",
"srcLabel": "",
"dst": "committee",
"dstArrow": "triangle",
"dstLabel": "",
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"stroke": "B1",
"borderRadius": 10,
"label": "Accept appeal",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N2",
"italic": true,
"bold": false,
"underline": false,
"labelWidth": 94,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"labelPercentage": 0,
"route": [
{
"x": 147.25,
"y": 325
},
{
"x": 147.25,
"y": 486
}
],
"animated": false,
"tooltip": "",
"icon": null,
"zIndex": 0
}
],
"root": {
"id": "",
"type": "",
"pos": {
"x": 0,
"y": 0
},
"width": 0,
"height": 0,
"opacity": 0,
"strokeDash": 0,
"strokeWidth": 0,
"borderRadius": 0,
"fill": "N7",
"stroke": "",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 0,
"labelHeight": 0,
"zIndex": 0,
"level": 0
}
}

View file

@ -0,0 +1,104 @@
<?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.3.0-HEAD" preserveAspectRatio="xMinYMin meet" viewBox="0 0 312 542"><svg id="d2-svg" class="d2-3167598655" width="312" height="542" viewBox="12 11 312 542"><rect x="12.000000" y="11.000000" width="312.000000" height="542.000000" rx="0.000000" class=" fill-N7" stroke-width="0" /><style type="text/css"><![CDATA[
.d2-3167598655 .text-bold {
font-family: "d2-3167598655-font-bold";
}
@font-face {
font-family: d2-3167598655-font-bold;
src: url("data:application/font-woff;base64,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");
}
.d2-3167598655 .text-italic {
font-family: "d2-3167598655-font-italic";
}
@font-face {
font-family: d2-3167598655-font-italic;
src: url("data:application/font-woff;base64,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");
}]]></style><style type="text/css"><![CDATA[.shape {
shape-rendering: geometricPrecision;
stroke-linejoin: round;
}
.connection {
stroke-linecap: round;
stroke-linejoin: round;
}
.blend {
mix-blend-mode: multiply;
opacity: 0.5;
}
.d2-3167598655 .fill-N1{fill:#0A0F25;}
.d2-3167598655 .fill-N2{fill:#676C7E;}
.d2-3167598655 .fill-N3{fill:#9499AB;}
.d2-3167598655 .fill-N4{fill:#CFD2DD;}
.d2-3167598655 .fill-N5{fill:#DEE1EB;}
.d2-3167598655 .fill-N6{fill:#EEF1F8;}
.d2-3167598655 .fill-N7{fill:#FFFFFF;}
.d2-3167598655 .fill-B1{fill:#0D32B2;}
.d2-3167598655 .fill-B2{fill:#0D32B2;}
.d2-3167598655 .fill-B3{fill:#E3E9FD;}
.d2-3167598655 .fill-B4{fill:#E3E9FD;}
.d2-3167598655 .fill-B5{fill:#EDF0FD;}
.d2-3167598655 .fill-B6{fill:#F7F8FE;}
.d2-3167598655 .fill-AA2{fill:#4A6FF3;}
.d2-3167598655 .fill-AA4{fill:#EDF0FD;}
.d2-3167598655 .fill-AA5{fill:#F7F8FE;}
.d2-3167598655 .fill-AB4{fill:#EDF0FD;}
.d2-3167598655 .fill-AB5{fill:#F7F8FE;}
.d2-3167598655 .stroke-N1{stroke:#0A0F25;}
.d2-3167598655 .stroke-N2{stroke:#676C7E;}
.d2-3167598655 .stroke-N3{stroke:#9499AB;}
.d2-3167598655 .stroke-N4{stroke:#CFD2DD;}
.d2-3167598655 .stroke-N5{stroke:#DEE1EB;}
.d2-3167598655 .stroke-N6{stroke:#EEF1F8;}
.d2-3167598655 .stroke-N7{stroke:#FFFFFF;}
.d2-3167598655 .stroke-B1{stroke:#0D32B2;}
.d2-3167598655 .stroke-B2{stroke:#0D32B2;}
.d2-3167598655 .stroke-B3{stroke:#E3E9FD;}
.d2-3167598655 .stroke-B4{stroke:#E3E9FD;}
.d2-3167598655 .stroke-B5{stroke:#EDF0FD;}
.d2-3167598655 .stroke-B6{stroke:#F7F8FE;}
.d2-3167598655 .stroke-AA2{stroke:#4A6FF3;}
.d2-3167598655 .stroke-AA4{stroke:#EDF0FD;}
.d2-3167598655 .stroke-AA5{stroke:#F7F8FE;}
.d2-3167598655 .stroke-AB4{stroke:#EDF0FD;}
.d2-3167598655 .stroke-AB5{stroke:#F7F8FE;}
.d2-3167598655 .background-color-N1{background-color:#0A0F25;}
.d2-3167598655 .background-color-N2{background-color:#676C7E;}
.d2-3167598655 .background-color-N3{background-color:#9499AB;}
.d2-3167598655 .background-color-N4{background-color:#CFD2DD;}
.d2-3167598655 .background-color-N5{background-color:#DEE1EB;}
.d2-3167598655 .background-color-N6{background-color:#EEF1F8;}
.d2-3167598655 .background-color-N7{background-color:#FFFFFF;}
.d2-3167598655 .background-color-B1{background-color:#0D32B2;}
.d2-3167598655 .background-color-B2{background-color:#0D32B2;}
.d2-3167598655 .background-color-B3{background-color:#E3E9FD;}
.d2-3167598655 .background-color-B4{background-color:#E3E9FD;}
.d2-3167598655 .background-color-B5{background-color:#EDF0FD;}
.d2-3167598655 .background-color-B6{background-color:#F7F8FE;}
.d2-3167598655 .background-color-AA2{background-color:#4A6FF3;}
.d2-3167598655 .background-color-AA4{background-color:#EDF0FD;}
.d2-3167598655 .background-color-AA5{background-color:#F7F8FE;}
.d2-3167598655 .background-color-AB4{background-color:#EDF0FD;}
.d2-3167598655 .background-color-AB5{background-color:#F7F8FE;}
.d2-3167598655 .color-N1{color:#0A0F25;}
.d2-3167598655 .color-N2{color:#676C7E;}
.d2-3167598655 .color-N3{color:#9499AB;}
.d2-3167598655 .color-N4{color:#CFD2DD;}
.d2-3167598655 .color-N5{color:#DEE1EB;}
.d2-3167598655 .color-N6{color:#EEF1F8;}
.d2-3167598655 .color-N7{color:#FFFFFF;}
.d2-3167598655 .color-B1{color:#0D32B2;}
.d2-3167598655 .color-B2{color:#0D32B2;}
.d2-3167598655 .color-B3{color:#E3E9FD;}
.d2-3167598655 .color-B4{color:#E3E9FD;}
.d2-3167598655 .color-B5{color:#EDF0FD;}
.d2-3167598655 .color-B6{color:#F7F8FE;}
.d2-3167598655 .color-AA2{color:#4A6FF3;}
.d2-3167598655 .color-AA4{color:#EDF0FD;}
.d2-3167598655 .color-AA5{color:#F7F8FE;}
.d2-3167598655 .color-AB4{color:#EDF0FD;}
.d2-3167598655 .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><g id="student"><g class="shape" ><rect x="97.000000" y="12.000000" width="100.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="147.000000" y="50.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">student</text></g><g id="committee chair"><g class="shape" ><rect x="66.000000" y="259.000000" width="162.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="147.000000" y="297.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">committee chair</text></g><g id="committee"><g class="shape" ><rect x="86.000000" y="486.000000" width="122.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="147.000000" y="524.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">committee</text></g><g id="(student -&gt; committee chair)[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 130.583333 80.000000 L 130.583333 108.000000 S 130.583333 118.000000 120.583333 118.000000 L 76.500000 118.000000 S 66.500000 118.000000 66.500000 128.000000 L 66.500000 209.000000 S 66.500000 219.000000 76.500000 219.000000 L 110.250000 219.000000 S 120.250000 219.000000 120.250000 229.000000 L 120.250000 255.000000" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-3167598655)" /><text x="66.500000" y="169.000000" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">Apply for appeal</text></g><g id="(student &lt;- committee chair)[0]"><marker id="mk-2451250203" markerWidth="10.000000" markerHeight="12.000000" refX="3.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="10.000000,0.000000 0.000000,6.000000 10.000000,12.000000" class="connection fill-B1" stroke-width="2" /> </marker><path d="M 163.916667 82.000000 L 163.916667 108.000000 S 163.916667 118.000000 173.916667 118.000000 L 218.000000 118.000000 S 228.000000 118.000000 228.000000 128.000000 L 228.000000 209.000000 S 228.000000 219.000000 218.000000 219.000000 L 184.250000 219.000000 S 174.250000 219.000000 174.250000 229.000000 L 174.250000 257.000000" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-start="url(#mk-2451250203)" mask="url(#d2-3167598655)" /><text x="228.000000" y="169.000000" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">Deny. Need more information</text></g><g id="(committee chair -&gt; committee)[0]"><path d="M 147.250000 327.000000 L 147.250000 482.000000" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-3167598655)" /><text x="147.000000" y="411.000000" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">Accept appeal</text></g><mask id="d2-3167598655" maskUnits="userSpaceOnUse" x="12" y="11" width="312" height="542">
<rect x="12" y="11" width="312" height="542" fill="white"></rect>
<rect x="12.000000" y="153.000000" width="109" height="21" fill="black"></rect>
<rect x="132.000000" y="153.000000" width="192" height="21" fill="black"></rect>
<rect x="100.000000" y="395.000000" width="94" height="21" fill="black"></rect>
</mask></svg></svg>

After

Width:  |  Height:  |  Size: 17 KiB

View file

@ -10,7 +10,7 @@
"x": 0,
"y": 275
},
"width": 387,
"width": 417,
"height": 1215,
"opacity": 1,
"strokeDash": 0,
@ -51,7 +51,7 @@
"x": 95,
"y": 340
},
"width": 273,
"width": 302,
"height": 307,
"opacity": 1,
"strokeDash": 0,
@ -89,7 +89,7 @@
"id": "network.cell tower.satellites",
"type": "stored_data",
"pos": {
"x": 161,
"x": 176,
"y": 372
},
"width": 140,
@ -130,7 +130,7 @@
"id": "network.cell tower.transmitter",
"type": "rectangle",
"pos": {
"x": 161,
"x": 176,
"y": 554
},
"width": 140,
@ -253,7 +253,7 @@
"id": "network.data processor",
"type": "rectangle",
"pos": {
"x": 142,
"x": 157,
"y": 804
},
"width": 179,
@ -294,7 +294,7 @@
"id": "network.data processor.storage",
"type": "cylinder",
"pos": {
"x": 182,
"x": 197,
"y": 836
},
"width": 99,
@ -335,7 +335,7 @@
"id": "user",
"type": "person",
"pos": {
"x": 75,
"x": 80,
"y": 0
},
"width": 130,
@ -376,7 +376,7 @@
"id": "api server",
"type": "rectangle",
"pos": {
"x": 428,
"x": 457,
"y": 1066
},
"width": 116,
@ -417,7 +417,7 @@
"id": "logs",
"type": "page",
"pos": {
"x": 449,
"x": 479,
"y": 1303
},
"width": 73,
@ -483,19 +483,19 @@
"labelPercentage": 0,
"route": [
{
"x": 210,
"x": 221,
"y": 434
},
{
"x": 176.4,
"x": 182.6,
"y": 482
},
{
"x": 176.4,
"x": 182.8,
"y": 506.2
},
{
"x": 210,
"x": 222,
"y": 555
}
],
@ -532,19 +532,19 @@
"labelPercentage": 0,
"route": [
{
"x": 231,
"x": 246,
"y": 434
},
{
"x": 231.2,
"x": 246,
"y": 482
},
{
"x": 231.25,
"x": 246,
"y": 506.2
},
{
"x": 231.25,
"x": 246,
"y": 555
}
],
@ -581,19 +581,19 @@
"labelPercentage": 0,
"route": [
{
"x": 253,
"x": 271,
"y": 434
},
{
"x": 286.2,
"x": 309.4,
"y": 482
},
{
"x": 286.1,
"x": 309.2,
"y": 506.2
},
{
"x": 252.5,
"x": 270,
"y": 555
}
],
@ -630,31 +630,31 @@
"labelPercentage": 0,
"route": [
{
"x": 231.25,
"x": 246,
"y": 615.5
},
{
"x": 231.25,
"x": 246,
"y": 641.1
},
{
"x": 231.25,
"x": 246,
"y": 659.6
},
{
"x": 231.25,
"x": 246,
"y": 677.75
},
{
"x": 231.25,
"x": 246,
"y": 695.9
},
{
"x": 231.2,
"x": 246,
"y": 782.2
},
{
"x": 231,
"x": 246,
"y": 837
}
],
@ -691,19 +691,19 @@
"labelPercentage": 0,
"route": [
{
"x": 164,
"x": 171,
"y": 87
},
{
"x": 217.8,
"x": 231,
"y": 156.2
},
{
"x": 231.25,
"x": 246,
"y": 248.2
},
{
"x": 231.25,
"x": 246,
"y": 305
}
],
@ -740,11 +740,11 @@
"labelPercentage": 0,
"route": [
{
"x": 123,
"x": 126,
"y": 87
},
{
"x": 84.4,
"x": 85,
"y": 156.2
},
{
@ -945,12 +945,12 @@
"labelPercentage": 0,
"route": [
{
"x": 427.75,
"y": 1113.8881262868908
"x": 457.25,
"y": 1112.7726984126984
},
{
"x": 182.75,
"y": 1176.777625257378
"x": 188.64999999999998,
"y": 1176.5545396825396
},
{
"x": 118.2,
@ -994,19 +994,19 @@
"labelPercentage": 0,
"route": [
{
"x": 485.75,
"x": 515.25,
"y": 1132
},
{
"x": 485.75,
"x": 515.25,
"y": 1180.4
},
{
"x": 485.8,
"x": 515.2,
"y": 1263
},
{
"x": 486,
"x": 515,
"y": 1303
}
],
@ -1043,20 +1043,20 @@
"labelPercentage": 0,
"route": [
{
"x": 231.25,
"x": 246,
"y": 986.5
},
{
"x": 231.25,
"x": 246,
"y": 1010.1
},
{
"x": 270.55,
"y": 1028.8168958742633
"x": 288.2,
"y": 1029
},
{
"x": 427.75,
"y": 1080.0844793713163
"x": 457,
"y": 1081
}
],
"isCurve": true,

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 30 KiB

View file

@ -0,0 +1,458 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{
"id": "Executive Services",
"type": "rectangle",
"pos": {
"x": 0,
"y": 0
},
"width": 1080,
"height": 61,
"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": "Executive Services",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 131,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "\"I/O\\nManager\"",
"type": "rectangle",
"pos": {
"x": 0,
"y": 101
},
"width": 100,
"height": 200,
"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": "I/O\nManager",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 62,
"labelHeight": 37,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "\"Security\\nReference\\nMonitor\"",
"type": "rectangle",
"pos": {
"x": 140,
"y": 101
},
"width": 100,
"height": 200,
"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": "Security\nReference\nMonitor",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 72,
"labelHeight": 53,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "\"IPC\\nManager\"",
"type": "rectangle",
"pos": {
"x": 280,
"y": 101
},
"width": 100,
"height": 200,
"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": "IPC\nManager",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 62,
"labelHeight": 37,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "\"Virtual\\nMemory\\nManager\\n(VMM)\"",
"type": "rectangle",
"pos": {
"x": 420,
"y": 101
},
"width": 100,
"height": 200,
"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": "Virtual\nMemory\nManager\n(VMM)",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 64,
"labelHeight": 69,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "\"Process\\nManager\"",
"type": "rectangle",
"pos": {
"x": 560,
"y": 101
},
"width": 100,
"height": 200,
"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": "Process\nManager",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 62,
"labelHeight": 37,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "\"PnP\\nManager\"",
"type": "rectangle",
"pos": {
"x": 700,
"y": 101
},
"width": 100,
"height": 200,
"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": "PnP\nManager",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 62,
"labelHeight": 37,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "\"Power\\nManager\"",
"type": "rectangle",
"pos": {
"x": 840,
"y": 101
},
"width": 100,
"height": 200,
"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": "Power\nManager",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 62,
"labelHeight": 37,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "\"Window\\nManager\\n\\nGDI\"",
"type": "rectangle",
"pos": {
"x": 980,
"y": 101
},
"width": 100,
"height": 200,
"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": "Window\nManager\n\nGDI",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 63,
"labelHeight": 69,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "Object Manager",
"type": "rectangle",
"pos": {
"x": 0,
"y": 341
},
"width": 1080,
"height": 61,
"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": "Object Manager",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 112,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
}
],
"connections": [],
"root": {
"id": "",
"type": "",
"pos": {
"x": 0,
"y": 0
},
"width": 0,
"height": 0,
"opacity": 0,
"strokeDash": 0,
"strokeWidth": 0,
"borderRadius": 0,
"fill": "N7",
"stroke": "",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 0,
"labelHeight": 0,
"zIndex": 0,
"level": 0
}
}

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 15 KiB

View file

@ -0,0 +1,458 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{
"id": "Executive Services",
"type": "rectangle",
"pos": {
"x": 0,
"y": 0
},
"width": 1080,
"height": 61,
"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": "Executive Services",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 131,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "\"I/O\\nManager\"",
"type": "rectangle",
"pos": {
"x": 0,
"y": 101
},
"width": 100,
"height": 200,
"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": "I/O\nManager",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 62,
"labelHeight": 37,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "\"Security\\nReference\\nMonitor\"",
"type": "rectangle",
"pos": {
"x": 140,
"y": 101
},
"width": 100,
"height": 200,
"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": "Security\nReference\nMonitor",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 72,
"labelHeight": 53,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "\"IPC\\nManager\"",
"type": "rectangle",
"pos": {
"x": 280,
"y": 101
},
"width": 100,
"height": 200,
"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": "IPC\nManager",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 62,
"labelHeight": 37,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "\"Virtual\\nMemory\\nManager\\n(VMM)\"",
"type": "rectangle",
"pos": {
"x": 420,
"y": 101
},
"width": 100,
"height": 200,
"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": "Virtual\nMemory\nManager\n(VMM)",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 64,
"labelHeight": 69,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "\"Process\\nManager\"",
"type": "rectangle",
"pos": {
"x": 560,
"y": 101
},
"width": 100,
"height": 200,
"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": "Process\nManager",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 62,
"labelHeight": 37,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "\"PnP\\nManager\"",
"type": "rectangle",
"pos": {
"x": 700,
"y": 101
},
"width": 100,
"height": 200,
"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": "PnP\nManager",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 62,
"labelHeight": 37,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "\"Power\\nManager\"",
"type": "rectangle",
"pos": {
"x": 840,
"y": 101
},
"width": 100,
"height": 200,
"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": "Power\nManager",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 62,
"labelHeight": 37,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "\"Window\\nManager\\n\\nGDI\"",
"type": "rectangle",
"pos": {
"x": 980,
"y": 101
},
"width": 100,
"height": 200,
"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": "Window\nManager\n\nGDI",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 63,
"labelHeight": 69,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "Object Manager",
"type": "rectangle",
"pos": {
"x": 0,
"y": 341
},
"width": 1080,
"height": 61,
"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": "Object Manager",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 112,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
}
],
"connections": [],
"root": {
"id": "",
"type": "",
"pos": {
"x": 0,
"y": 0
},
"width": 0,
"height": 0,
"opacity": 0,
"strokeDash": 0,
"strokeWidth": 0,
"borderRadius": 0,
"fill": "N7",
"stroke": "",
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 0,
"labelHeight": 0,
"zIndex": 0,
"level": 0
}
}

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 15 KiB

3738
e2etests/testdata/stable/grid_tests/dagre/board.exp.json generated vendored Normal file

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 40 KiB

3738
e2etests/testdata/stable/grid_tests/elk/board.exp.json generated vendored Normal file

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 40 KiB

View file

@ -7,7 +7,7 @@
"id": "satellites",
"type": "stored_data",
"pos": {
"x": 0,
"x": 27,
"y": 0
},
"width": 161,
@ -48,7 +48,7 @@
"id": "transmitter",
"type": "rectangle",
"pos": {
"x": 5,
"x": 32,
"y": 187
},
"width": 151,
@ -114,19 +114,19 @@
"labelPercentage": 0,
"route": [
{
"x": 60,
"x": 79,
"y": 66
},
{
"x": 30,
"x": 39,
"y": 114.4
},
{
"x": 30.1,
"x": 39,
"y": 138.7
},
{
"x": 60.5,
"x": 79,
"y": 187.5
}
],
@ -163,19 +163,19 @@
"labelPercentage": 0,
"route": [
{
"x": 80,
"x": 107,
"y": 66
},
{
"x": 80.4,
"x": 107,
"y": 114.4
},
{
"x": 80.5,
"x": 107,
"y": 138.7
},
{
"x": 80.5,
"x": 107,
"y": 187.5
}
],
@ -212,19 +212,19 @@
"labelPercentage": 0,
"route": [
{
"x": 101,
"x": 135,
"y": 66
},
{
"x": 131,
"x": 175,
"y": 114.4
},
{
"x": 130.9,
"x": 175,
"y": 138.7
},
{
"x": 100.5,
"x": 135,
"y": 187.5
}
],

View file

@ -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.3.0-HEAD" preserveAspectRatio="xMinYMin meet" viewBox="0 0 174 266"><svg id="d2-svg" class="d2-3632172451" width="174" height="266" viewBox="-1 -12 174 266"><rect x="-1.000000" y="-12.000000" width="174.000000" height="266.000000" rx="0.000000" class=" fill-N7" stroke-width="0" /><style type="text/css"><![CDATA[
.d2-3632172451 .text-mono {
font-family: "d2-3632172451-font-mono";
<?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.3.0-HEAD" preserveAspectRatio="xMinYMin meet" viewBox="0 0 180 266"><svg id="d2-svg" class="d2-1620692864" width="180" height="266" viewBox="20 -12 180 266"><rect x="20.000000" y="-12.000000" width="180.000000" height="266.000000" rx="0.000000" class=" fill-N7" stroke-width="0" /><style type="text/css"><![CDATA[
.d2-1620692864 .text-mono {
font-family: "d2-1620692864-font-mono";
}
@font-face {
font-family: d2-3632172451-font-mono;
font-family: d2-1620692864-font-mono;
src: url("data:application/font-woff;base64,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");
}
.d2-3632172451 .text-mono-italic {
font-family: "d2-3632172451-font-mono-italic";
.d2-1620692864 .text-mono-italic {
font-family: "d2-1620692864-font-mono-italic";
}
@font-face {
font-family: d2-3632172451-font-mono-italic;
font-family: d2-1620692864-font-mono-italic;
src: url("data:application/font-woff;base64,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");
}]]></style><style type="text/css"><![CDATA[.shape {
shape-rendering: geometricPrecision;
@ -25,80 +25,80 @@
opacity: 0.5;
}
.d2-3632172451 .fill-N1{fill:#0A0F25;}
.d2-3632172451 .fill-N2{fill:#676C7E;}
.d2-3632172451 .fill-N3{fill:#9499AB;}
.d2-3632172451 .fill-N4{fill:#CFD2DD;}
.d2-3632172451 .fill-N5{fill:#DEE1EB;}
.d2-3632172451 .fill-N6{fill:#EEF1F8;}
.d2-3632172451 .fill-N7{fill:#FFFFFF;}
.d2-3632172451 .fill-B1{fill:#0D32B2;}
.d2-3632172451 .fill-B2{fill:#0D32B2;}
.d2-3632172451 .fill-B3{fill:#E3E9FD;}
.d2-3632172451 .fill-B4{fill:#E3E9FD;}
.d2-3632172451 .fill-B5{fill:#EDF0FD;}
.d2-3632172451 .fill-B6{fill:#F7F8FE;}
.d2-3632172451 .fill-AA2{fill:#4A6FF3;}
.d2-3632172451 .fill-AA4{fill:#EDF0FD;}
.d2-3632172451 .fill-AA5{fill:#F7F8FE;}
.d2-3632172451 .fill-AB4{fill:#EDF0FD;}
.d2-3632172451 .fill-AB5{fill:#F7F8FE;}
.d2-3632172451 .stroke-N1{stroke:#0A0F25;}
.d2-3632172451 .stroke-N2{stroke:#676C7E;}
.d2-3632172451 .stroke-N3{stroke:#9499AB;}
.d2-3632172451 .stroke-N4{stroke:#CFD2DD;}
.d2-3632172451 .stroke-N5{stroke:#DEE1EB;}
.d2-3632172451 .stroke-N6{stroke:#EEF1F8;}
.d2-3632172451 .stroke-N7{stroke:#FFFFFF;}
.d2-3632172451 .stroke-B1{stroke:#0D32B2;}
.d2-3632172451 .stroke-B2{stroke:#0D32B2;}
.d2-3632172451 .stroke-B3{stroke:#E3E9FD;}
.d2-3632172451 .stroke-B4{stroke:#E3E9FD;}
.d2-3632172451 .stroke-B5{stroke:#EDF0FD;}
.d2-3632172451 .stroke-B6{stroke:#F7F8FE;}
.d2-3632172451 .stroke-AA2{stroke:#4A6FF3;}
.d2-3632172451 .stroke-AA4{stroke:#EDF0FD;}
.d2-3632172451 .stroke-AA5{stroke:#F7F8FE;}
.d2-3632172451 .stroke-AB4{stroke:#EDF0FD;}
.d2-3632172451 .stroke-AB5{stroke:#F7F8FE;}
.d2-3632172451 .background-color-N1{background-color:#0A0F25;}
.d2-3632172451 .background-color-N2{background-color:#676C7E;}
.d2-3632172451 .background-color-N3{background-color:#9499AB;}
.d2-3632172451 .background-color-N4{background-color:#CFD2DD;}
.d2-3632172451 .background-color-N5{background-color:#DEE1EB;}
.d2-3632172451 .background-color-N6{background-color:#EEF1F8;}
.d2-3632172451 .background-color-N7{background-color:#FFFFFF;}
.d2-3632172451 .background-color-B1{background-color:#0D32B2;}
.d2-3632172451 .background-color-B2{background-color:#0D32B2;}
.d2-3632172451 .background-color-B3{background-color:#E3E9FD;}
.d2-3632172451 .background-color-B4{background-color:#E3E9FD;}
.d2-3632172451 .background-color-B5{background-color:#EDF0FD;}
.d2-3632172451 .background-color-B6{background-color:#F7F8FE;}
.d2-3632172451 .background-color-AA2{background-color:#4A6FF3;}
.d2-3632172451 .background-color-AA4{background-color:#EDF0FD;}
.d2-3632172451 .background-color-AA5{background-color:#F7F8FE;}
.d2-3632172451 .background-color-AB4{background-color:#EDF0FD;}
.d2-3632172451 .background-color-AB5{background-color:#F7F8FE;}
.d2-3632172451 .color-N1{color:#0A0F25;}
.d2-3632172451 .color-N2{color:#676C7E;}
.d2-3632172451 .color-N3{color:#9499AB;}
.d2-3632172451 .color-N4{color:#CFD2DD;}
.d2-3632172451 .color-N5{color:#DEE1EB;}
.d2-3632172451 .color-N6{color:#EEF1F8;}
.d2-3632172451 .color-N7{color:#FFFFFF;}
.d2-3632172451 .color-B1{color:#0D32B2;}
.d2-3632172451 .color-B2{color:#0D32B2;}
.d2-3632172451 .color-B3{color:#E3E9FD;}
.d2-3632172451 .color-B4{color:#E3E9FD;}
.d2-3632172451 .color-B5{color:#EDF0FD;}
.d2-3632172451 .color-B6{color:#F7F8FE;}
.d2-3632172451 .color-AA2{color:#4A6FF3;}
.d2-3632172451 .color-AA4{color:#EDF0FD;}
.d2-3632172451 .color-AA5{color:#F7F8FE;}
.d2-3632172451 .color-AB4{color:#EDF0FD;}
.d2-3632172451 .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><g id="satellites"><g class="shape" ><path d="M 25 -10 H 171 C 167 -10 156 8 156 23 C 156 38 167 56 171 56 H 25 C 21 56 10 38 10 23 C 10 8 21 -10 25 -10 Z" stroke="black" fill="white" style="stroke-width:2;" /><path d="M 15 0 H 161 C 157 0 146 18 146 33 C 146 48 157 66 161 66 H 15 C 11 66 0 48 0 33 C 0 18 11 0 15 0 Z" stroke="black" fill="white" style="stroke-width:2;" /></g><text x="80.500000" y="38.500000" class="text-mono fill-N1" style="text-anchor:middle;font-size:16px">SATELLITES</text></g><g id="transmitter"><g class="shape" ><rect x="5.000000" y="187.000000" width="151.000000" height="66.000000" stroke="black" fill="white" style="stroke-width:2;" /></g><text x="80.500000" y="225.500000" class="text-mono fill-N1" style="text-anchor:middle;font-size:16px">TRANSMITTER</text></g><g id="(satellites -&gt; transmitter)[0]"><marker id="mk-27687146" 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" fill="black" class="connection" stroke-width="2" /> </marker><path d="M 58.946324 67.699931 C 30.000000 114.400000 30.100000 138.700000 58.385009 184.104884" stroke="black" fill="none" class="connection" style="stroke-width:2;" marker-end="url(#mk-27687146)" mask="url(#d2-3632172451)" /><text x="30.000000" y="132.000000" class="text-mono-italic fill-N2" style="text-anchor:middle;font-size:16px">SEND</text></g><g id="(satellites -&gt; transmitter)[1]"><path d="M 80.016528 67.999932 C 80.400000 114.400000 80.500000 138.700000 80.500000 183.500000" stroke="black" fill="none" class="connection" style="stroke-width:2;" marker-end="url(#mk-27687146)" mask="url(#d2-3632172451)" /><text x="80.000000" y="132.000000" class="text-mono-italic fill-N2" style="text-anchor:middle;font-size:16px">SEND</text></g><g id="(satellites -&gt; transmitter)[2]"><path d="M 102.053676 67.699931 C 131.000000 114.400000 130.900000 138.700000 102.614991 184.104884" stroke="black" fill="none" class="connection" style="stroke-width:2;" marker-end="url(#mk-27687146)" mask="url(#d2-3632172451)" /><text x="131.000000" y="132.000000" class="text-mono-italic fill-N2" style="text-anchor:middle;font-size:16px">SEND</text></g><mask id="d2-3632172451" maskUnits="userSpaceOnUse" x="-1" y="-12" width="174" height="266">
<rect x="-1" y="-12" width="174" height="266" fill="white"></rect>
<rect x="11.000000" y="116.000000" width="38" height="21" fill="black"></rect>
<rect x="61.000000" y="116.000000" width="38" height="21" fill="black"></rect>
<rect x="112.000000" y="116.000000" width="38" height="21" fill="black"></rect>
.d2-1620692864 .fill-N1{fill:#0A0F25;}
.d2-1620692864 .fill-N2{fill:#676C7E;}
.d2-1620692864 .fill-N3{fill:#9499AB;}
.d2-1620692864 .fill-N4{fill:#CFD2DD;}
.d2-1620692864 .fill-N5{fill:#DEE1EB;}
.d2-1620692864 .fill-N6{fill:#EEF1F8;}
.d2-1620692864 .fill-N7{fill:#FFFFFF;}
.d2-1620692864 .fill-B1{fill:#0D32B2;}
.d2-1620692864 .fill-B2{fill:#0D32B2;}
.d2-1620692864 .fill-B3{fill:#E3E9FD;}
.d2-1620692864 .fill-B4{fill:#E3E9FD;}
.d2-1620692864 .fill-B5{fill:#EDF0FD;}
.d2-1620692864 .fill-B6{fill:#F7F8FE;}
.d2-1620692864 .fill-AA2{fill:#4A6FF3;}
.d2-1620692864 .fill-AA4{fill:#EDF0FD;}
.d2-1620692864 .fill-AA5{fill:#F7F8FE;}
.d2-1620692864 .fill-AB4{fill:#EDF0FD;}
.d2-1620692864 .fill-AB5{fill:#F7F8FE;}
.d2-1620692864 .stroke-N1{stroke:#0A0F25;}
.d2-1620692864 .stroke-N2{stroke:#676C7E;}
.d2-1620692864 .stroke-N3{stroke:#9499AB;}
.d2-1620692864 .stroke-N4{stroke:#CFD2DD;}
.d2-1620692864 .stroke-N5{stroke:#DEE1EB;}
.d2-1620692864 .stroke-N6{stroke:#EEF1F8;}
.d2-1620692864 .stroke-N7{stroke:#FFFFFF;}
.d2-1620692864 .stroke-B1{stroke:#0D32B2;}
.d2-1620692864 .stroke-B2{stroke:#0D32B2;}
.d2-1620692864 .stroke-B3{stroke:#E3E9FD;}
.d2-1620692864 .stroke-B4{stroke:#E3E9FD;}
.d2-1620692864 .stroke-B5{stroke:#EDF0FD;}
.d2-1620692864 .stroke-B6{stroke:#F7F8FE;}
.d2-1620692864 .stroke-AA2{stroke:#4A6FF3;}
.d2-1620692864 .stroke-AA4{stroke:#EDF0FD;}
.d2-1620692864 .stroke-AA5{stroke:#F7F8FE;}
.d2-1620692864 .stroke-AB4{stroke:#EDF0FD;}
.d2-1620692864 .stroke-AB5{stroke:#F7F8FE;}
.d2-1620692864 .background-color-N1{background-color:#0A0F25;}
.d2-1620692864 .background-color-N2{background-color:#676C7E;}
.d2-1620692864 .background-color-N3{background-color:#9499AB;}
.d2-1620692864 .background-color-N4{background-color:#CFD2DD;}
.d2-1620692864 .background-color-N5{background-color:#DEE1EB;}
.d2-1620692864 .background-color-N6{background-color:#EEF1F8;}
.d2-1620692864 .background-color-N7{background-color:#FFFFFF;}
.d2-1620692864 .background-color-B1{background-color:#0D32B2;}
.d2-1620692864 .background-color-B2{background-color:#0D32B2;}
.d2-1620692864 .background-color-B3{background-color:#E3E9FD;}
.d2-1620692864 .background-color-B4{background-color:#E3E9FD;}
.d2-1620692864 .background-color-B5{background-color:#EDF0FD;}
.d2-1620692864 .background-color-B6{background-color:#F7F8FE;}
.d2-1620692864 .background-color-AA2{background-color:#4A6FF3;}
.d2-1620692864 .background-color-AA4{background-color:#EDF0FD;}
.d2-1620692864 .background-color-AA5{background-color:#F7F8FE;}
.d2-1620692864 .background-color-AB4{background-color:#EDF0FD;}
.d2-1620692864 .background-color-AB5{background-color:#F7F8FE;}
.d2-1620692864 .color-N1{color:#0A0F25;}
.d2-1620692864 .color-N2{color:#676C7E;}
.d2-1620692864 .color-N3{color:#9499AB;}
.d2-1620692864 .color-N4{color:#CFD2DD;}
.d2-1620692864 .color-N5{color:#DEE1EB;}
.d2-1620692864 .color-N6{color:#EEF1F8;}
.d2-1620692864 .color-N7{color:#FFFFFF;}
.d2-1620692864 .color-B1{color:#0D32B2;}
.d2-1620692864 .color-B2{color:#0D32B2;}
.d2-1620692864 .color-B3{color:#E3E9FD;}
.d2-1620692864 .color-B4{color:#E3E9FD;}
.d2-1620692864 .color-B5{color:#EDF0FD;}
.d2-1620692864 .color-B6{color:#F7F8FE;}
.d2-1620692864 .color-AA2{color:#4A6FF3;}
.d2-1620692864 .color-AA4{color:#EDF0FD;}
.d2-1620692864 .color-AA5{color:#F7F8FE;}
.d2-1620692864 .color-AB4{color:#EDF0FD;}
.d2-1620692864 .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><g id="satellites"><g class="shape" ><path d="M 52 -10 H 198 C 194 -10 183 8 183 23 C 183 38 194 56 198 56 H 52 C 48 56 37 38 37 23 C 37 8 48 -10 52 -10 Z" stroke="black" fill="white" style="stroke-width:2;" /><path d="M 42 0 H 188 C 184 0 173 18 173 33 C 173 48 184 66 188 66 H 42 C 38 66 27 48 27 33 C 27 18 38 0 42 0 Z" stroke="black" fill="white" style="stroke-width:2;" /></g><text x="107.500000" y="38.500000" class="text-mono fill-N1" style="text-anchor:middle;font-size:16px">SATELLITES</text></g><g id="transmitter"><g class="shape" ><rect x="32.000000" y="187.000000" width="151.000000" height="66.000000" stroke="black" fill="white" style="stroke-width:2;" /></g><text x="107.500000" y="225.500000" class="text-mono fill-N1" style="text-anchor:middle;font-size:16px">TRANSMITTER</text></g><g id="(satellites -&gt; transmitter)[0]"><marker id="mk-27687146" 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" fill="black" class="connection" stroke-width="2" /> </marker><path d="M 77.725908 67.541651 C 39.000000 114.400000 39.000000 138.700000 76.464288 184.406432" stroke="black" fill="none" class="connection" style="stroke-width:2;" marker-end="url(#mk-27687146)" mask="url(#d2-1620692864)" /><text x="39.000000" y="132.000000" class="text-mono-italic fill-N2" style="text-anchor:middle;font-size:16px">SEND</text></g><g id="(satellites -&gt; transmitter)[1]"><path d="M 107.000000 68.000000 C 107.000000 114.400000 107.000000 138.700000 107.000000 183.500000" stroke="black" fill="none" class="connection" style="stroke-width:2;" marker-end="url(#mk-27687146)" mask="url(#d2-1620692864)" /><text x="107.000000" y="132.000000" class="text-mono-italic fill-N2" style="text-anchor:middle;font-size:16px">SEND</text></g><g id="(satellites -&gt; transmitter)[2]"><path d="M 136.274092 67.541651 C 175.000000 114.400000 175.000000 138.700000 137.535712 184.406432" stroke="black" fill="none" class="connection" style="stroke-width:2;" marker-end="url(#mk-27687146)" mask="url(#d2-1620692864)" /><text x="175.000000" y="132.000000" class="text-mono-italic fill-N2" style="text-anchor:middle;font-size:16px">SEND</text></g><mask id="d2-1620692864" maskUnits="userSpaceOnUse" x="20" y="-12" width="180" height="266">
<rect x="20" y="-12" width="180" height="266" fill="white"></rect>
<rect x="20.000000" y="116.000000" width="38" height="21" fill="black"></rect>
<rect x="88.000000" y="116.000000" width="38" height="21" fill="black"></rect>
<rect x="156.000000" y="116.000000" width="38" height="21" fill="black"></rect>
</mask></svg></svg>

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

View file

@ -48,7 +48,7 @@
"id": "y",
"type": "rectangle",
"pos": {
"x": 76,
"x": 96,
"y": 166
},
"width": 54,
@ -89,7 +89,7 @@
"id": "z",
"type": "rectangle",
"pos": {
"x": 153,
"x": 193,
"y": 0
},
"width": 52,
@ -156,55 +156,55 @@
"route": [
{
"x": 53,
"y": 16.551724137931032
"y": 18.38440111420613
},
{
"x": 74.33333333333333,
"y": 3.3103448275862064
"x": 79.66666666666667,
"y": 3.676880222841225
},
{
"x": 81,
"x": 88,
"y": 0
},
{
"x": 83,
"x": 90.5,
"y": 0
},
{
"x": 85,
"x": 93,
"y": 0
},
{
"x": 87.66666666666667,
"x": 96.33333333333333,
"y": 6.6000000000000005
},
{
"x": 89.66666666666667,
"x": 98.83333333333333,
"y": 16.5
},
{
"x": 91.66666666666667,
"x": 101.33333333333333,
"y": 26.400000000000002
},
{
"x": 91.66666666666667,
"x": 101.33333333333333,
"y": 39.6
},
{
"x": 89.66666666666667,
"x": 98.83333333333333,
"y": 49.5
},
{
"x": 87.66666666666667,
"x": 96.33333333333333,
"y": 59.400000000000006
},
{
"x": 74.33333333333333,
"y": 62.689655172413794
"x": 79.66666666666667,
"y": 62.32311977715877
},
{
"x": 53,
"y": 49.44827586206897
"y": 47.61559888579387
}
],
"isCurve": true,
@ -241,55 +241,55 @@
"route": [
{
"x": 53,
"y": 19.849624060150376
},
{
"x": 85,
"y": 3.969924812030074
},
{
"x": 95,
"y": 0
},
{
"x": 98,
"y": 0
"y": 22.890173410404625
},
{
"x": 101,
"y": 4.578034682080926
},
{
"x": 116,
"y": 0
},
{
"x": 105,
"x": 120.5,
"y": 0
},
{
"x": 125,
"y": 0
},
{
"x": 131,
"y": 6.6000000000000005
},
{
"x": 108,
"x": 135.5,
"y": 16.5
},
{
"x": 111,
"x": 140,
"y": 26.400000000000002
},
{
"x": 111,
"x": 140,
"y": 39.6
},
{
"x": 108,
"x": 135.5,
"y": 49.5
},
{
"x": 105,
"x": 131,
"y": 59.400000000000006
},
{
"x": 85,
"y": 62.03007518796993
"x": 101,
"y": 61.421965317919074
},
{
"x": 53,
"y": 46.150375939849624
"y": 43.10982658959537
}
],
"isCurve": true,
@ -333,12 +333,12 @@
"y": 106
},
{
"x": 36.35,
"y": 126.72196721311475
"x": 40.35,
"y": 127.94337662337662
},
{
"x": 75.75,
"y": 169.60983606557377
"x": 95.75,
"y": 175.7168831168831
}
],
"isCurve": true,
@ -374,20 +374,20 @@
"labelPercentage": 0,
"route": [
{
"x": 179,
"x": 219,
"y": 66
},
{
"x": 179,
"x": 219,
"y": 106
},
{
"x": 169.2,
"y": 126.6
"x": 205.2,
"y": 128
},
{
"x": 130,
"y": 169
"x": 150,
"y": 176
}
],
"isCurve": true,
@ -423,56 +423,56 @@
"labelPercentage": 0,
"route": [
{
"x": 205,
"y": 19.523560209424083
"x": 245,
"y": 19.52356020942409
},
{
"x": 235.13333333333333,
"y": 3.9047120418848156
"x": 275.1333333333333,
"y": 3.9047120418848174
},
{
"x": 244.54999999999998,
"x": 284.55,
"y": 0
},
{
"x": 247.375,
"x": 287.375,
"y": 0
},
{
"x": 250.20000000000002,
"x": 290.2,
"y": 0
},
{
"x": 253.96666666666667,
"x": 293.96666666666664,
"y": 6.6000000000000005
},
{
"x": 256.7916666666667,
"x": 296.79166666666663,
"y": 16.5
},
{
"x": 259.6166666666667,
"x": 299.6166666666667,
"y": 26.400000000000002
},
{
"x": 259.6166666666667,
"x": 299.6166666666667,
"y": 39.6
},
{
"x": 256.7916666666667,
"x": 296.79166666666663,
"y": 49.5
},
{
"x": 253.96666666666667,
"x": 293.96666666666664,
"y": 59.400000000000006
},
{
"x": 235.13333333333333,
"y": 62.095287958115186
"x": 275.1333333333333,
"y": 62.09528795811518
},
{
"x": 205,
"y": 46.47643979057592
"x": 245,
"y": 46.47643979057591
}
],
"isCurve": true,

View file

@ -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.3.0-HEAD" preserveAspectRatio="xMinYMin meet" viewBox="0 0 277 234"><svg id="d2-svg" class="d2-2215587268" width="277" height="234" viewBox="-1 -1 277 234"><rect x="-1.000000" y="-1.000000" width="277.000000" height="234.000000" rx="0.000000" class=" fill-N7" stroke-width="0" /><style type="text/css"><![CDATA[
.d2-2215587268 .text-bold {
font-family: "d2-2215587268-font-bold";
<?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.3.0-HEAD" preserveAspectRatio="xMinYMin meet" viewBox="0 0 317 234"><svg id="d2-svg" class="d2-4144856773" width="317" height="234" viewBox="-1 -1 317 234"><rect x="-1.000000" y="-1.000000" width="317.000000" height="234.000000" rx="0.000000" class=" fill-N7" stroke-width="0" /><style type="text/css"><![CDATA[
.d2-4144856773 .text-bold {
font-family: "d2-4144856773-font-bold";
}
@font-face {
font-family: d2-2215587268-font-bold;
font-family: d2-4144856773-font-bold;
src: url("data:application/font-woff;base64,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");
}
.d2-2215587268 .text-italic {
font-family: "d2-2215587268-font-italic";
.d2-4144856773 .text-italic {
font-family: "d2-4144856773-font-italic";
}
@font-face {
font-family: d2-2215587268-font-italic;
font-family: d2-4144856773-font-italic;
src: url("data:application/font-woff;base64,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");
}]]></style><style type="text/css"><![CDATA[.shape {
shape-rendering: geometricPrecision;
@ -25,78 +25,78 @@
opacity: 0.5;
}
.d2-2215587268 .fill-N1{fill:#0A0F25;}
.d2-2215587268 .fill-N2{fill:#676C7E;}
.d2-2215587268 .fill-N3{fill:#9499AB;}
.d2-2215587268 .fill-N4{fill:#CFD2DD;}
.d2-2215587268 .fill-N5{fill:#DEE1EB;}
.d2-2215587268 .fill-N6{fill:#EEF1F8;}
.d2-2215587268 .fill-N7{fill:#FFFFFF;}
.d2-2215587268 .fill-B1{fill:#0D32B2;}
.d2-2215587268 .fill-B2{fill:#0D32B2;}
.d2-2215587268 .fill-B3{fill:#E3E9FD;}
.d2-2215587268 .fill-B4{fill:#E3E9FD;}
.d2-2215587268 .fill-B5{fill:#EDF0FD;}
.d2-2215587268 .fill-B6{fill:#F7F8FE;}
.d2-2215587268 .fill-AA2{fill:#4A6FF3;}
.d2-2215587268 .fill-AA4{fill:#EDF0FD;}
.d2-2215587268 .fill-AA5{fill:#F7F8FE;}
.d2-2215587268 .fill-AB4{fill:#EDF0FD;}
.d2-2215587268 .fill-AB5{fill:#F7F8FE;}
.d2-2215587268 .stroke-N1{stroke:#0A0F25;}
.d2-2215587268 .stroke-N2{stroke:#676C7E;}
.d2-2215587268 .stroke-N3{stroke:#9499AB;}
.d2-2215587268 .stroke-N4{stroke:#CFD2DD;}
.d2-2215587268 .stroke-N5{stroke:#DEE1EB;}
.d2-2215587268 .stroke-N6{stroke:#EEF1F8;}
.d2-2215587268 .stroke-N7{stroke:#FFFFFF;}
.d2-2215587268 .stroke-B1{stroke:#0D32B2;}
.d2-2215587268 .stroke-B2{stroke:#0D32B2;}
.d2-2215587268 .stroke-B3{stroke:#E3E9FD;}
.d2-2215587268 .stroke-B4{stroke:#E3E9FD;}
.d2-2215587268 .stroke-B5{stroke:#EDF0FD;}
.d2-2215587268 .stroke-B6{stroke:#F7F8FE;}
.d2-2215587268 .stroke-AA2{stroke:#4A6FF3;}
.d2-2215587268 .stroke-AA4{stroke:#EDF0FD;}
.d2-2215587268 .stroke-AA5{stroke:#F7F8FE;}
.d2-2215587268 .stroke-AB4{stroke:#EDF0FD;}
.d2-2215587268 .stroke-AB5{stroke:#F7F8FE;}
.d2-2215587268 .background-color-N1{background-color:#0A0F25;}
.d2-2215587268 .background-color-N2{background-color:#676C7E;}
.d2-2215587268 .background-color-N3{background-color:#9499AB;}
.d2-2215587268 .background-color-N4{background-color:#CFD2DD;}
.d2-2215587268 .background-color-N5{background-color:#DEE1EB;}
.d2-2215587268 .background-color-N6{background-color:#EEF1F8;}
.d2-2215587268 .background-color-N7{background-color:#FFFFFF;}
.d2-2215587268 .background-color-B1{background-color:#0D32B2;}
.d2-2215587268 .background-color-B2{background-color:#0D32B2;}
.d2-2215587268 .background-color-B3{background-color:#E3E9FD;}
.d2-2215587268 .background-color-B4{background-color:#E3E9FD;}
.d2-2215587268 .background-color-B5{background-color:#EDF0FD;}
.d2-2215587268 .background-color-B6{background-color:#F7F8FE;}
.d2-2215587268 .background-color-AA2{background-color:#4A6FF3;}
.d2-2215587268 .background-color-AA4{background-color:#EDF0FD;}
.d2-2215587268 .background-color-AA5{background-color:#F7F8FE;}
.d2-2215587268 .background-color-AB4{background-color:#EDF0FD;}
.d2-2215587268 .background-color-AB5{background-color:#F7F8FE;}
.d2-2215587268 .color-N1{color:#0A0F25;}
.d2-2215587268 .color-N2{color:#676C7E;}
.d2-2215587268 .color-N3{color:#9499AB;}
.d2-2215587268 .color-N4{color:#CFD2DD;}
.d2-2215587268 .color-N5{color:#DEE1EB;}
.d2-2215587268 .color-N6{color:#EEF1F8;}
.d2-2215587268 .color-N7{color:#FFFFFF;}
.d2-2215587268 .color-B1{color:#0D32B2;}
.d2-2215587268 .color-B2{color:#0D32B2;}
.d2-2215587268 .color-B3{color:#E3E9FD;}
.d2-2215587268 .color-B4{color:#E3E9FD;}
.d2-2215587268 .color-B5{color:#EDF0FD;}
.d2-2215587268 .color-B6{color:#F7F8FE;}
.d2-2215587268 .color-AA2{color:#4A6FF3;}
.d2-2215587268 .color-AA4{color:#EDF0FD;}
.d2-2215587268 .color-AA5{color:#F7F8FE;}
.d2-2215587268 .color-AB4{color:#EDF0FD;}
.d2-2215587268 .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><g id="x"><g class="shape" ><rect x="0.000000" y="0.000000" width="53.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="26.500000" y="38.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">x</text></g><g id="y"><g class="shape" ><rect x="76.000000" y="166.000000" width="54.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="103.000000" y="204.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">y</text></g><g id="z"><g class="shape" ><rect x="153.000000" y="0.000000" width="52.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="179.000000" y="38.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">z</text></g><g id="(x -&gt; x)[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 54.699280 15.496998 C 74.333333 3.310345 81.000000 0.000000 83.000000 0.000000 C 85.000000 0.000000 87.666667 6.600000 89.666667 16.500000 C 91.666667 26.400000 91.666667 39.600000 89.666667 49.500000 C 87.666667 59.400000 74.333333 62.689655 56.398561 51.557727" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-2215587268)" /></g><g id="(x -&gt; x)[1]"><path d="M 54.791540 18.960589 C 85.000000 3.969925 95.000000 0.000000 98.000000 0.000000 C 101.000000 0.000000 105.000000 6.600000 108.000000 16.500000 C 111.000000 26.400000 111.000000 39.600000 108.000000 49.500000 C 105.000000 59.400000 85.000000 62.030075 56.583081 47.928446" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-2215587268)" /></g><g id="(x -&gt; y)[0]"><path d="M 26.500000 68.000000 C 26.500000 106.000000 36.350000 126.721967 73.043889 166.664168" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-2215587268)" /></g><g id="(z -&gt; y)[0]"><path d="M 179.000000 68.000000 C 179.000000 106.000000 169.200000 126.600000 132.715421 166.062912" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-2215587268)" /></g><g id="(z -&gt; z)[0]"><path d="M 206.775650 18.603197 C 235.133333 3.904712 244.550000 0.000000 247.375000 0.000000 C 250.200000 0.000000 253.966667 6.600000 256.791667 16.500000 C 259.616667 26.400000 259.616667 39.600000 256.791667 49.500000 C 253.966667 59.400000 235.133333 62.095288 208.551299 48.317166" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-2215587268)" /><text x="259.500000" y="36.000000" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">hello</text></g><mask id="d2-2215587268" maskUnits="userSpaceOnUse" x="-1" y="-1" width="277" height="234">
<rect x="-1" y="-1" width="277" height="234" fill="white"></rect>
<rect x="243.000000" y="20.000000" width="33" height="21" fill="black"></rect>
.d2-4144856773 .fill-N1{fill:#0A0F25;}
.d2-4144856773 .fill-N2{fill:#676C7E;}
.d2-4144856773 .fill-N3{fill:#9499AB;}
.d2-4144856773 .fill-N4{fill:#CFD2DD;}
.d2-4144856773 .fill-N5{fill:#DEE1EB;}
.d2-4144856773 .fill-N6{fill:#EEF1F8;}
.d2-4144856773 .fill-N7{fill:#FFFFFF;}
.d2-4144856773 .fill-B1{fill:#0D32B2;}
.d2-4144856773 .fill-B2{fill:#0D32B2;}
.d2-4144856773 .fill-B3{fill:#E3E9FD;}
.d2-4144856773 .fill-B4{fill:#E3E9FD;}
.d2-4144856773 .fill-B5{fill:#EDF0FD;}
.d2-4144856773 .fill-B6{fill:#F7F8FE;}
.d2-4144856773 .fill-AA2{fill:#4A6FF3;}
.d2-4144856773 .fill-AA4{fill:#EDF0FD;}
.d2-4144856773 .fill-AA5{fill:#F7F8FE;}
.d2-4144856773 .fill-AB4{fill:#EDF0FD;}
.d2-4144856773 .fill-AB5{fill:#F7F8FE;}
.d2-4144856773 .stroke-N1{stroke:#0A0F25;}
.d2-4144856773 .stroke-N2{stroke:#676C7E;}
.d2-4144856773 .stroke-N3{stroke:#9499AB;}
.d2-4144856773 .stroke-N4{stroke:#CFD2DD;}
.d2-4144856773 .stroke-N5{stroke:#DEE1EB;}
.d2-4144856773 .stroke-N6{stroke:#EEF1F8;}
.d2-4144856773 .stroke-N7{stroke:#FFFFFF;}
.d2-4144856773 .stroke-B1{stroke:#0D32B2;}
.d2-4144856773 .stroke-B2{stroke:#0D32B2;}
.d2-4144856773 .stroke-B3{stroke:#E3E9FD;}
.d2-4144856773 .stroke-B4{stroke:#E3E9FD;}
.d2-4144856773 .stroke-B5{stroke:#EDF0FD;}
.d2-4144856773 .stroke-B6{stroke:#F7F8FE;}
.d2-4144856773 .stroke-AA2{stroke:#4A6FF3;}
.d2-4144856773 .stroke-AA4{stroke:#EDF0FD;}
.d2-4144856773 .stroke-AA5{stroke:#F7F8FE;}
.d2-4144856773 .stroke-AB4{stroke:#EDF0FD;}
.d2-4144856773 .stroke-AB5{stroke:#F7F8FE;}
.d2-4144856773 .background-color-N1{background-color:#0A0F25;}
.d2-4144856773 .background-color-N2{background-color:#676C7E;}
.d2-4144856773 .background-color-N3{background-color:#9499AB;}
.d2-4144856773 .background-color-N4{background-color:#CFD2DD;}
.d2-4144856773 .background-color-N5{background-color:#DEE1EB;}
.d2-4144856773 .background-color-N6{background-color:#EEF1F8;}
.d2-4144856773 .background-color-N7{background-color:#FFFFFF;}
.d2-4144856773 .background-color-B1{background-color:#0D32B2;}
.d2-4144856773 .background-color-B2{background-color:#0D32B2;}
.d2-4144856773 .background-color-B3{background-color:#E3E9FD;}
.d2-4144856773 .background-color-B4{background-color:#E3E9FD;}
.d2-4144856773 .background-color-B5{background-color:#EDF0FD;}
.d2-4144856773 .background-color-B6{background-color:#F7F8FE;}
.d2-4144856773 .background-color-AA2{background-color:#4A6FF3;}
.d2-4144856773 .background-color-AA4{background-color:#EDF0FD;}
.d2-4144856773 .background-color-AA5{background-color:#F7F8FE;}
.d2-4144856773 .background-color-AB4{background-color:#EDF0FD;}
.d2-4144856773 .background-color-AB5{background-color:#F7F8FE;}
.d2-4144856773 .color-N1{color:#0A0F25;}
.d2-4144856773 .color-N2{color:#676C7E;}
.d2-4144856773 .color-N3{color:#9499AB;}
.d2-4144856773 .color-N4{color:#CFD2DD;}
.d2-4144856773 .color-N5{color:#DEE1EB;}
.d2-4144856773 .color-N6{color:#EEF1F8;}
.d2-4144856773 .color-N7{color:#FFFFFF;}
.d2-4144856773 .color-B1{color:#0D32B2;}
.d2-4144856773 .color-B2{color:#0D32B2;}
.d2-4144856773 .color-B3{color:#E3E9FD;}
.d2-4144856773 .color-B4{color:#E3E9FD;}
.d2-4144856773 .color-B5{color:#EDF0FD;}
.d2-4144856773 .color-B6{color:#F7F8FE;}
.d2-4144856773 .color-AA2{color:#4A6FF3;}
.d2-4144856773 .color-AA4{color:#EDF0FD;}
.d2-4144856773 .color-AA5{color:#F7F8FE;}
.d2-4144856773 .color-AB4{color:#EDF0FD;}
.d2-4144856773 .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><g id="x"><g class="shape" ><rect x="0.000000" y="0.000000" width="53.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="26.500000" y="38.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">x</text></g><g id="y"><g class="shape" ><rect x="96.000000" y="166.000000" width="54.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="123.000000" y="204.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">y</text></g><g id="z"><g class="shape" ><rect x="193.000000" y="0.000000" width="52.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="219.000000" y="38.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">z</text></g><g id="(x -&gt; x)[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 54.751298 17.418504 C 79.666667 3.676880 88.000000 0.000000 90.500000 0.000000 C 93.000000 0.000000 96.333333 6.600000 98.833333 16.500000 C 101.333333 26.400000 101.333333 39.600000 98.833333 49.500000 C 96.333333 59.400000 79.666667 62.323120 56.502595 49.547392" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-4144856773)" /></g><g id="(x -&gt; x)[1]"><path d="M 54.868633 22.177285 C 101.000000 4.578035 116.000000 0.000000 120.500000 0.000000 C 125.000000 0.000000 131.000000 6.600000 135.500000 16.500000 C 140.000000 26.400000 140.000000 39.600000 135.500000 49.500000 C 131.000000 59.400000 101.000000 61.421965 56.737266 44.535604" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-4144856773)" /></g><g id="(x -&gt; y)[0]"><path d="M 26.500000 68.000000 C 26.500000 106.000000 40.350000 127.943377 92.720763 173.104658" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-4144856773)" /></g><g id="(z -&gt; y)[0]"><path d="M 219.000000 68.000000 C 219.000000 106.000000 205.200000 128.000000 153.018422 173.375285" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-4144856773)" /></g><g id="(z -&gt; z)[0]"><path d="M 246.775650 18.603197 C 275.133333 3.904712 284.550000 0.000000 287.375000 0.000000 C 290.200000 0.000000 293.966667 6.600000 296.791667 16.500000 C 299.616667 26.400000 299.616667 39.600000 296.791667 49.500000 C 293.966667 59.400000 275.133333 62.095288 248.551299 48.317166" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-4144856773)" /><text x="299.500000" y="36.000000" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">hello</text></g><mask id="d2-4144856773" maskUnits="userSpaceOnUse" x="-1" y="-1" width="317" height="234">
<rect x="-1" y="-1" width="317" height="234" fill="white"></rect>
<rect x="283.000000" y="20.000000" width="33" height="21" fill="black"></rect>
</mask></svg></svg>

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 46 KiB

1576
e2etests/testdata/stable/teleport_grid/elk/board.exp.json generated vendored Normal file

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 46 KiB

View file

@ -10,7 +10,7 @@
"x": 0,
"y": 275
},
"width": 351,
"width": 399,
"height": 1225,
"opacity": 1,
"strokeDash": 0,
@ -52,7 +52,7 @@
"x": 95,
"y": 340
},
"width": 237,
"width": 284,
"height": 317,
"opacity": 1,
"strokeDash": 0,
@ -91,7 +91,7 @@
"id": "network.cell tower.satellites",
"type": "stored_data",
"pos": {
"x": 161,
"x": 185,
"y": 372
},
"width": 104,
@ -133,7 +133,7 @@
"id": "network.cell tower.transmitter",
"type": "rectangle",
"pos": {
"x": 161,
"x": 185,
"y": 559
},
"width": 104,
@ -259,7 +259,7 @@
"id": "network.data processor",
"type": "rectangle",
"pos": {
"x": 121,
"x": 145,
"y": 814
},
"width": 184,
@ -301,7 +301,7 @@
"id": "network.data processor.storage",
"type": "cylinder",
"pos": {
"x": 161,
"x": 185,
"y": 846
},
"width": 104,
@ -343,7 +343,7 @@
"id": "user",
"type": "person",
"pos": {
"x": 66,
"x": 80,
"y": 0
},
"width": 130,
@ -385,7 +385,7 @@
"id": "api server",
"type": "rectangle",
"pos": {
"x": 392,
"x": 439,
"y": 1076
},
"width": 153,
@ -427,7 +427,7 @@
"id": "logs",
"type": "page",
"pos": {
"x": 426,
"x": 474,
"y": 1313
},
"width": 84,
@ -493,19 +493,19 @@
"labelPercentage": 0,
"route": [
{
"x": 194,
"x": 211,
"y": 439
},
{
"x": 166,
"x": 173.4,
"y": 487
},
{
"x": 166,
"x": 173.4,
"y": 511.2
},
{
"x": 194,
"x": 211,
"y": 560
}
],
@ -541,19 +541,19 @@
"labelPercentage": 0,
"route": [
{
"x": 213,
"x": 237,
"y": 439
},
{
"x": 213.2,
"x": 237,
"y": 487
},
{
"x": 213.25,
"x": 237,
"y": 511.2
},
{
"x": 213.25,
"x": 237,
"y": 560
}
],
@ -589,19 +589,19 @@
"labelPercentage": 0,
"route": [
{
"x": 233,
"x": 263,
"y": 439
},
{
"x": 260.6,
"x": 300.6,
"y": 487
},
{
"x": 260.5,
"x": 300.6,
"y": 511.2
},
{
"x": 232.5,
"x": 263,
"y": 560
}
],
@ -637,31 +637,31 @@
"labelPercentage": 0,
"route": [
{
"x": 213.25,
"x": 237,
"y": 625.5
},
{
"x": 213.25,
"x": 237,
"y": 651.1
},
{
"x": 213.25,
"x": 237,
"y": 669.6
},
{
"x": 213.25,
"x": 237,
"y": 687.75
},
{
"x": 213.25,
"x": 237,
"y": 705.9
},
{
"x": 213.2,
"x": 237,
"y": 792.2
},
{
"x": 213,
"x": 237,
"y": 847
}
],
@ -697,19 +697,19 @@
"labelPercentage": 0,
"route": [
{
"x": 152,
"x": 169,
"y": 87
},
{
"x": 201,
"x": 223.4,
"y": 156.2
},
{
"x": 213.25,
"x": 237,
"y": 248.2
},
{
"x": 213.25,
"x": 237,
"y": 305
}
],
@ -745,11 +745,11 @@
"labelPercentage": 0,
"route": [
{
"x": 116,
"x": 126,
"y": 87
},
{
"x": 83,
"x": 85,
"y": 156.2
},
{
@ -949,12 +949,12 @@
"labelPercentage": 0,
"route": [
{
"x": 391.75,
"y": 1129.4949856733524
"x": 439.25,
"y": 1127.0397225725094
},
{
"x": 173.75,
"y": 1187.8989971346705
"x": 183.25,
"y": 1187.4079445145019
},
{
"x": 116,
@ -997,19 +997,19 @@
"labelPercentage": 0,
"route": [
{
"x": 468.25,
"x": 515.75,
"y": 1142
},
{
"x": 468.25,
"x": 515.75,
"y": 1190.4
},
{
"x": 468.2,
"x": 515.8,
"y": 1273
},
{
"x": 468,
"x": 516,
"y": 1313
}
],
@ -1045,20 +1045,20 @@
"labelPercentage": 0,
"route": [
{
"x": 213.25,
"x": 237,
"y": 996.5
},
{
"x": 213.25,
"x": 237,
"y": 1020.1
},
{
"x": 248.95,
"y": 1037.62
"x": 277.4,
"y": 1038
},
{
"x": 391.75,
"y": 1084.1
"x": 439,
"y": 1086
}
],
"isCurve": true,

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 455 KiB

After

Width:  |  Height:  |  Size: 455 KiB

View file

@ -10,7 +10,7 @@
"x": 0,
"y": 438
},
"width": 480,
"width": 499,
"height": 1565,
"opacity": 1,
"strokeDash": 0,
@ -52,7 +52,7 @@
"x": 96,
"y": 503
},
"width": 364,
"width": 383,
"height": 657,
"opacity": 1,
"strokeDash": 0,
@ -91,7 +91,7 @@
"id": "network.cell tower.satellites",
"type": "stored_data",
"pos": {
"x": 136,
"x": 140,
"y": 705
},
"width": 161,
@ -132,7 +132,7 @@
"id": "network.cell tower.transmitter",
"type": "rectangle",
"pos": {
"x": 238,
"x": 241,
"y": 1062
},
"width": 151,
@ -256,7 +256,7 @@
"id": "network.data processor",
"type": "rectangle",
"pos": {
"x": 218,
"x": 220,
"y": 1317
},
"width": 192,
@ -298,7 +298,7 @@
"id": "network.data processor.storage",
"type": "cylinder",
"pos": {
"x": 258,
"x": 260,
"y": 1349
},
"width": 112,
@ -339,7 +339,7 @@
"id": "user",
"type": "person",
"pos": {
"x": 82,
"x": 85,
"y": 82
},
"width": 130,
@ -380,7 +380,7 @@
"id": "api server",
"type": "rectangle",
"pos": {
"x": 521,
"x": 540,
"y": 1579
},
"width": 142,
@ -421,7 +421,7 @@
"id": "logs",
"type": "page",
"pos": {
"x": 551,
"x": 570,
"y": 1816
},
"width": 82,
@ -462,7 +462,7 @@
"id": "users",
"type": "sql_table",
"pos": {
"x": 272,
"x": 286,
"y": 30
},
"width": 262,
@ -646,7 +646,7 @@
"id": "products",
"type": "class",
"pos": {
"x": 594,
"x": 608,
"y": 0
},
"width": 242,
@ -710,7 +710,7 @@
"id": "markdown",
"type": "text",
"pos": {
"x": 896,
"x": 910,
"y": 79
},
"width": 128,
@ -750,7 +750,7 @@
"id": "code",
"type": "code",
"pos": {
"x": 526,
"x": 540,
"y": 497
},
"width": 868,
@ -790,7 +790,7 @@
"id": "ex",
"type": "text",
"pos": {
"x": 758,
"x": 772,
"y": 1031
},
"width": 404,
@ -854,19 +854,19 @@
"labelPercentage": 0,
"route": [
{
"x": 211,
"x": 215,
"y": 772
},
{
"x": 181,
"x": 185.8,
"y": 956
},
{
"x": 191.7,
"x": 196.3,
"y": 1014.2
},
{
"x": 264.5,
"x": 267.5,
"y": 1063
}
],
@ -902,19 +902,19 @@
"labelPercentage": 0,
"route": [
{
"x": 220,
"x": 225,
"y": 772
},
{
"x": 238.6,
"x": 250.2,
"y": 956
},
{
"x": 252.25,
"x": 264.3,
"y": 1014.2
},
{
"x": 288.25,
"x": 295.5,
"y": 1063
}
],
@ -950,19 +950,19 @@
"labelPercentage": 0,
"route": [
{
"x": 238,
"x": 243,
"y": 772
},
{
"x": 356.2,
"x": 366.4,
"y": 956
},
{
"x": 376.35,
"x": 386.65,
"y": 1014.2
},
{
"x": 338.75,
"x": 344.25,
"y": 1063
}
],
@ -998,31 +998,31 @@
"labelPercentage": 0,
"route": [
{
"x": 313.5,
"x": 316,
"y": 1128.5
},
{
"x": 313.5,
"x": 316,
"y": 1154.1
},
{
"x": 313.5,
"x": 316,
"y": 1172.6
},
{
"x": 313.5,
"x": 316,
"y": 1190.75
},
{
"x": 313.5,
"x": 316,
"y": 1208.9
},
{
"x": 313.6,
"x": 316,
"y": 1295.2
},
{
"x": 314,
"x": 316,
"y": 1350
}
],
@ -1058,19 +1058,19 @@
"labelPercentage": 0,
"route": [
{
"x": 157,
"x": 161,
"y": 169
},
{
"x": 204.8,
"x": 208.2,
"y": 303
},
{
"x": 216.75,
"x": 220,
"y": 411.2
},
{
"x": 216.75,
"x": 220,
"y": 468
}
],
@ -1106,11 +1106,11 @@
"labelPercentage": 0,
"route": [
{
"x": 136,
"x": 138,
"y": 169
},
{
"x": 88.19999999999999,
"x": 88.6,
"y": 303
},
{
@ -1310,12 +1310,12 @@
"labelPercentage": 0,
"route": [
{
"x": 520.5,
"y": 1626.4080303852415
"x": 539.5,
"y": 1625.8374153204795
},
{
"x": 208.7,
"y": 1689.6816060770484
"x": 212.5,
"y": 1689.567483064096
},
{
"x": 127.4,
@ -1358,19 +1358,19 @@
"labelPercentage": 0,
"route": [
{
"x": 591.5,
"x": 610.5,
"y": 1645
},
{
"x": 591.5,
"x": 610.5,
"y": 1693.4
},
{
"x": 591.6,
"x": 610.6,
"y": 1776
},
{
"x": 592,
"x": 611,
"y": 1816
}
],
@ -1406,20 +1406,20 @@
"labelPercentage": 0,
"route": [
{
"x": 313.5,
"x": 316,
"y": 1499.5
},
{
"x": 313.5,
"x": 316,
"y": 1523.1
},
{
"x": 354.9,
"y": 1541.3604316546762
"x": 360.7,
"y": 1541.5979626485569
},
{
"x": 520.5,
"y": 1590.8021582733813
"x": 539.5,
"y": 1591.9898132427843
}
],
"isCurve": true,
@ -1454,31 +1454,31 @@
"labelPercentage": 0,
"route": [
{
"x": 959.5,
"x": 973.5,
"y": 198.5
},
{
"x": 959.5,
"x": 973.5,
"y": 308.9
},
{
"x": 959.5,
"x": 973.5,
"y": 348.6
},
{
"x": 959.5,
"x": 973.5,
"y": 366.75
},
{
"x": 959.5,
"x": 973.5,
"y": 384.9
},
{
"x": 959.5,
"x": 973.5,
"y": 457
},
{
"x": 959.5,
"x": 973.5,
"y": 497
}
],
@ -1514,19 +1514,19 @@
"labelPercentage": 0,
"route": [
{
"x": 959.5,
"x": 973.5,
"y": 903
},
{
"x": 959.5,
"x": 973.5,
"y": 951.4
},
{
"x": 959.5,
"x": 973.5,
"y": 977.1
},
{
"x": 959.5,
"x": 973.5,
"y": 1031.5
}
],

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 99 KiB

After

Width:  |  Height:  |  Size: 100 KiB

View file

@ -10,7 +10,7 @@
"x": 0,
"y": 275
},
"width": 410,
"width": 436,
"height": 1225,
"opacity": 1,
"strokeDash": 0,
@ -52,7 +52,7 @@
"x": 96,
"y": 340
},
"width": 294,
"width": 320,
"height": 317,
"opacity": 1,
"strokeDash": 0,
@ -91,7 +91,7 @@
"id": "network.cell tower.satellites",
"type": "stored_data",
"pos": {
"x": 163,
"x": 176,
"y": 372
},
"width": 161,
@ -132,7 +132,7 @@
"id": "network.cell tower.transmitter",
"type": "rectangle",
"pos": {
"x": 168,
"x": 181,
"y": 559
},
"width": 151,
@ -176,7 +176,7 @@
"x": 20,
"y": 1319
},
"width": 157,
"width": 154,
"height": 151,
"opacity": 1,
"strokeDash": 0,
@ -215,7 +215,7 @@
"id": "network.online portal.ui",
"type": "hexagon",
"pos": {
"x": 71,
"x": 69,
"y": 1360
},
"width": 65,
@ -256,7 +256,7 @@
"id": "network.data processor",
"type": "rectangle",
"pos": {
"x": 147,
"x": 161,
"y": 814
},
"width": 192,
@ -298,7 +298,7 @@
"id": "network.data processor.storage",
"type": "cylinder",
"pos": {
"x": 187,
"x": 201,
"y": 846
},
"width": 112,
@ -339,7 +339,7 @@
"id": "user",
"type": "person",
"pos": {
"x": 82,
"x": 85,
"y": 0
},
"width": 130,
@ -380,7 +380,7 @@
"id": "api server",
"type": "rectangle",
"pos": {
"x": 450,
"x": 477,
"y": 1076
},
"width": 142,
@ -421,7 +421,7 @@
"id": "logs",
"type": "page",
"pos": {
"x": 480,
"x": 507,
"y": 1313
},
"width": 82,
@ -486,19 +486,19 @@
"labelPercentage": 0,
"route": [
{
"x": 218,
"x": 229,
"y": 439
},
{
"x": 182.4,
"x": 188.6,
"y": 487
},
{
"x": 182.5,
"x": 188.5,
"y": 511.2
},
{
"x": 218.5,
"x": 228.5,
"y": 560
}
],
@ -534,19 +534,19 @@
"labelPercentage": 0,
"route": [
{
"x": 243,
"x": 256,
"y": 439
},
{
"x": 243.2,
"x": 256.4,
"y": 487
},
{
"x": 243.25,
"x": 256.5,
"y": 511.2
},
{
"x": 243.25,
"x": 256.5,
"y": 560
}
],
@ -582,19 +582,19 @@
"labelPercentage": 0,
"route": [
{
"x": 268,
"x": 284,
"y": 439
},
{
"x": 304,
"x": 324.4,
"y": 487
},
{
"x": 304,
"x": 324.5,
"y": 511.2
},
{
"x": 268,
"x": 284.5,
"y": 560
}
],
@ -630,31 +630,31 @@
"labelPercentage": 0,
"route": [
{
"x": 243.25,
"x": 256.5,
"y": 625.5
},
{
"x": 243.25,
"x": 256.5,
"y": 651.1
},
{
"x": 243.25,
"x": 256.5,
"y": 669.6
},
{
"x": 243.25,
"x": 256.5,
"y": 687.75
},
{
"x": 243.25,
"x": 256.5,
"y": 705.9
},
{
"x": 243.2,
"x": 256.6,
"y": 792.2
},
{
"x": 243,
"x": 257,
"y": 847
}
],
@ -690,19 +690,19 @@
"labelPercentage": 0,
"route": [
{
"x": 172,
"x": 178,
"y": 87
},
{
"x": 229,
"x": 240.8,
"y": 156.2
},
{
"x": 243.25,
"x": 256.5,
"y": 248.2
},
{
"x": 243.25,
"x": 256.5,
"y": 305
}
],
@ -738,11 +738,11 @@
"labelPercentage": 0,
"route": [
{
"x": 128,
"x": 131,
"y": 87
},
{
"x": 86.6,
"x": 87.19999999999999,
"y": 156.2
},
{
@ -902,11 +902,11 @@
"y": 1183.8
},
{
"x": 79.6,
"x": 79.4,
"y": 1282.6
},
{
"x": 93,
"x": 92,
"y": 1361
}
],
@ -942,19 +942,19 @@
"labelPercentage": 0,
"route": [
{
"x": 450.25,
"y": 1126
"x": 476.75,
"y": 1124.9196642685852
},
{
"x": 194.64999999999998,
"y": 1187.2
"x": 199.95,
"y": 1186.983932853717
},
{
"x": 127.4,
"x": 127,
"y": 1282.6
},
{
"x": 114,
"x": 112,
"y": 1361
}
],
@ -990,19 +990,19 @@
"labelPercentage": 0,
"route": [
{
"x": 521.25,
"x": 547.75,
"y": 1142
},
{
"x": 521.25,
"x": 547.75,
"y": 1190.4
},
{
"x": 521.2,
"x": 547.8,
"y": 1273
},
{
"x": 521,
"x": 548,
"y": 1313
}
],
@ -1038,20 +1038,20 @@
"labelPercentage": 0,
"route": [
{
"x": 243.25,
"x": 256.5,
"y": 996.5
},
{
"x": 243.25,
"x": 256.5,
"y": 1020.1
},
{
"x": 284.65,
"y": 1038.4
"x": 300.55,
"y": 1038.5533047210301
},
{
"x": 450.25,
"y": 1088
"x": 476.75,
"y": 1088.7665236051503
}
],
"isCurve": true,

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 28 KiB

180
testdata/d2compiler/TestCompile/grid.exp.json generated vendored Normal file
View file

@ -0,0 +1,180 @@
{
"graph": {
"name": "",
"isFolderOnly": false,
"ast": {
"range": "d2/testdata/d2compiler/TestCompile/grid.d2,0:0:0-4:0:44",
"nodes": [
{
"map_key": {
"range": "d2/testdata/d2compiler/TestCompile/grid.d2,0:0:0-3:1:43",
"key": {
"range": "d2/testdata/d2compiler/TestCompile/grid.d2,0:0:0-0:3:3",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2compiler/TestCompile/grid.d2,0:0:0-0:3:3",
"value": [
{
"string": "hey",
"raw_string": "hey"
}
]
}
}
]
},
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/grid.d2,0:5:5-3:0:42",
"nodes": [
{
"map_key": {
"range": "d2/testdata/d2compiler/TestCompile/grid.d2,1:1:8-1:15:22",
"key": {
"range": "d2/testdata/d2compiler/TestCompile/grid.d2,1:1:8-1:10:17",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2compiler/TestCompile/grid.d2,1:1:8-1:10:17",
"value": [
{
"string": "grid-rows",
"raw_string": "grid-rows"
}
]
}
}
]
},
"primary": {},
"value": {
"number": {
"range": "d2/testdata/d2compiler/TestCompile/grid.d2,1:12:19-1:15:22",
"raw": "200",
"value": "200"
}
}
}
},
{
"map_key": {
"range": "d2/testdata/d2compiler/TestCompile/grid.d2,2:1:24-2:18:41",
"key": {
"range": "d2/testdata/d2compiler/TestCompile/grid.d2,2:1:24-2:13:36",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2compiler/TestCompile/grid.d2,2:1:24-2:13:36",
"value": [
{
"string": "grid-columns",
"raw_string": "grid-columns"
}
]
}
}
]
},
"primary": {},
"value": {
"number": {
"range": "d2/testdata/d2compiler/TestCompile/grid.d2,2:15:38-2:18:41",
"raw": "230",
"value": "230"
}
}
}
}
]
}
}
}
}
]
},
"root": {
"id": "",
"id_val": "",
"label_dimensions": {
"width": 0,
"height": 0
},
"attributes": {
"label": {
"value": ""
},
"style": {},
"near_key": null,
"shape": {
"value": ""
},
"direction": {
"value": ""
},
"constraint": {
"value": ""
}
},
"zIndex": 0
},
"edges": null,
"objects": [
{
"id": "hey",
"id_val": "hey",
"label_dimensions": {
"width": 0,
"height": 0
},
"references": [
{
"key": {
"range": "d2/testdata/d2compiler/TestCompile/grid.d2,0:0:0-0:3:3",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2compiler/TestCompile/grid.d2,0:0:0-0:3:3",
"value": [
{
"string": "hey",
"raw_string": "hey"
}
]
}
}
]
},
"key_path_index": 0,
"map_key_edge_index": -1
}
],
"attributes": {
"label": {
"value": "hey"
},
"style": {},
"near_key": null,
"shape": {
"value": "rectangle"
},
"direction": {
"value": ""
},
"constraint": {
"value": ""
},
"gridRows": {
"value": "200"
},
"gridColumns": {
"value": "230"
}
},
"zIndex": 0
}
]
},
"err": null
}

20
testdata/d2compiler/TestCompile/grid_edge.exp.json generated vendored Normal file
View file

@ -0,0 +1,20 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/grid_edge.d2,2:1:22-2:7:28",
"errmsg": "d2/testdata/d2compiler/TestCompile/grid_edge.d2:3:2: edges in grid diagrams are not supported yet"
},
{
"range": "d2/testdata/d2compiler/TestCompile/grid_edge.d2,4:1:32-4:11:42",
"errmsg": "d2/testdata/d2compiler/TestCompile/grid_edge.d2:5:2: edges in grid diagrams are not supported yet"
},
{
"range": "d2/testdata/d2compiler/TestCompile/grid_edge.d2,5:1:44-5:11:54",
"errmsg": "d2/testdata/d2compiler/TestCompile/grid_edge.d2:6:2: edges in grid diagrams are not supported yet"
}
]
}
}

12
testdata/d2compiler/TestCompile/grid_negative.exp.json generated vendored Normal file
View file

@ -0,0 +1,12 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/grid_negative.d2,2:15:38-2:19:42",
"errmsg": "d2/testdata/d2compiler/TestCompile/grid_negative.d2:3:16: grid-columns must be a positive integer: \"-200\""
}
]
}
}

16
testdata/d2compiler/TestCompile/grid_nested.exp.json generated vendored Normal file
View file

@ -0,0 +1,16 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/grid_nested.d2,1:1:8-1:15:22",
"errmsg": "d2/testdata/d2compiler/TestCompile/grid_nested.d2:2:2: \"grid-rows\" can only be used on containers with one level of nesting right now. (\"hey.d\" has nested \"invalid descendant\")"
},
{
"range": "d2/testdata/d2compiler/TestCompile/grid_nested.d2,2:1:24-2:18:41",
"errmsg": "d2/testdata/d2compiler/TestCompile/grid_nested.d2:3:2: \"grid-columns\" can only be used on containers with one level of nesting right now. (\"hey.d\" has nested \"invalid descendant\")"
}
]
}
}