fix elk self loop spacing

This commit is contained in:
Alexander Wang 2023-04-19 13:49:56 -07:00
parent 9df47054eb
commit 88e71c3088
No known key found for this signature in database
GPG key ID: D89FA31966BDBECE
16 changed files with 2783 additions and 313 deletions

View file

@ -2,6 +2,9 @@
#### Improvements 🧹 #### Improvements 🧹
- ELK self loops get distributed around the object instead of stacking [#1232](https://github.com/terrastruct/d2/pull/1232)
#### Bugfixes ⛑️ #### Bugfixes ⛑️
- Fixes an issue with markdown labels that are empty when rendered [#1223](https://github.com/terrastruct/d2/issues/1223) - Fixes an issue with markdown labels that are empty when rendered [#1223](https://github.com/terrastruct/d2/issues/1223)
- ELK self loops always have enough space for long labels [#1232](https://github.com/terrastruct/d2/pull/1232)

View file

@ -109,6 +109,8 @@ type elkOpts struct {
ForceNodeModelOrder bool `json:"elk.layered.crossingMinimization.forceNodeModelOrder,omitempty"` ForceNodeModelOrder bool `json:"elk.layered.crossingMinimization.forceNodeModelOrder,omitempty"`
ConsiderModelOrder string `json:"elk.layered.considerModelOrder.strategy,omitempty"` ConsiderModelOrder string `json:"elk.layered.considerModelOrder.strategy,omitempty"`
SelfLoopDistribution string `json:"elk.layered.edgeRouting.selfLoopDistribution,omitempty"`
NodeSizeConstraints string `json:"elk.nodeSize.constraints,omitempty"` NodeSizeConstraints string `json:"elk.nodeSize.constraints,omitempty"`
ContentAlignment string `json:"elk.contentAlignment,omitempty"` ContentAlignment string `json:"elk.contentAlignment,omitempty"`
NodeSizeMinimum string `json:"elk.nodeSize.minimum,omitempty"` NodeSizeMinimum string `json:"elk.nodeSize.minimum,omitempty"`
@ -159,6 +161,10 @@ func Layout(ctx context.Context, g *d2graph.Graph, opts *ConfigurableOpts) (err
}, },
}, },
} }
if elkGraph.LayoutOptions.ConfigurableOpts.SelfLoopSpacing == DefaultOpts.SelfLoopSpacing {
// +5 for a tiny bit of padding
elkGraph.LayoutOptions.ConfigurableOpts.SelfLoopSpacing = go2.Max(elkGraph.LayoutOptions.ConfigurableOpts.SelfLoopSpacing, childrenMaxSelfLoop(g.Root, g.Root.Direction.Value == "down" || g.Root.Direction.Value == "" || g.Root.Direction.Value == "up")/2+5)
}
switch g.Root.Direction.Value { switch g.Root.Direction.Value {
case "down": case "down":
elkGraph.LayoutOptions.Direction = "DOWN" elkGraph.LayoutOptions.Direction = "DOWN"
@ -239,6 +245,9 @@ func Layout(ctx context.Context, g *d2graph.Graph, opts *ConfigurableOpts) (err
Padding: opts.Padding, Padding: opts.Padding,
}, },
} }
if n.LayoutOptions.ConfigurableOpts.SelfLoopSpacing == DefaultOpts.SelfLoopSpacing {
n.LayoutOptions.ConfigurableOpts.SelfLoopSpacing = go2.Max(n.LayoutOptions.ConfigurableOpts.SelfLoopSpacing, childrenMaxSelfLoop(obj, g.Root.Direction.Value == "down" || g.Root.Direction.Value == "" || g.Root.Direction.Value == "up")/2+5)
}
switch elkGraph.LayoutOptions.Direction { switch elkGraph.LayoutOptions.Direction {
case "DOWN", "UP": case "DOWN", "UP":
@ -277,7 +286,7 @@ func Layout(ctx context.Context, g *d2graph.Graph, opts *ConfigurableOpts) (err
} }
} else { } else {
n.LayoutOptions = &elkOpts{ n.LayoutOptions = &elkOpts{
// Margins: "[top=100,left=100,bottom=100,right=100]", SelfLoopDistribution: "EQUALLY",
} }
} }
@ -725,3 +734,20 @@ func countEdgeIntersects(g *d2graph.Graph, sEdge *d2graph.Edge, s geo.Segment) (
} }
return crossingsCount, overlapsCount, closeOverlapsCount, touchingCount return crossingsCount, overlapsCount, closeOverlapsCount, touchingCount
} }
func childrenMaxSelfLoop(parent *d2graph.Object, isWidth bool) int {
max := 0
for _, ch := range parent.Children {
for _, e := range parent.Graph.Edges {
if e.Src == e.Dst && e.Src == ch && e.Label.Value != "" {
if isWidth {
max = go2.Max(max, e.LabelDimensions.Width)
} else {
max = go2.Max(max, e.LabelDimensions.Height)
}
}
}
}
return max
}

View file

@ -2593,6 +2593,7 @@ scenarios: {
loadFromFile(t, "grid_animated"), loadFromFile(t, "grid_animated"),
loadFromFile(t, "grid_gap"), loadFromFile(t, "grid_gap"),
loadFromFile(t, "ent2d2_basic"), loadFromFile(t, "ent2d2_basic"),
loadFromFile(t, "ent2d2_right"),
} }
runa(t, tcs) runa(t, tcs)

View file

@ -8,7 +8,7 @@ User <-> User: "spouse" {
shape: cf-one shape: cf-one
} }
} }
User <-> User: "children/parent" { User <-> User: "children/parent/ancestor" {
# o2m optional # o2m optional
source-arrowhead: { source-arrowhead: {
shape: cf-one-required shape: cf-one-required

99
e2etests/testdata/files/ent2d2_right.d2 vendored Normal file
View file

@ -0,0 +1,99 @@
direction: right
# Edges
User <-> User: "spouse\nspouse" {
# o2o optional
source-arrowhead: {
shape: cf-one-required
}
target-arrowhead: {
shape: cf-one
}
}
User <-> User: "children\nparent\nyo\nwhoa\nhey" {
# o2m optional
source-arrowhead: {
shape: cf-one-required
}
target-arrowhead: {
shape: cf-many
}
}
User <-> Pet: "pets/owner" {
# o2m optional
source-arrowhead: {
shape: cf-one-required
}
target-arrowhead: {
shape: cf-many
}
}
User <-> Card: "card/owner" {
# o2o optional
source-arrowhead: {
shape: cf-one-required
}
target-arrowhead: {
shape: cf-one
}
}
User <-> Post: "posts/author" {
# o2m optional
source-arrowhead: {
shape: cf-one-required
}
target-arrowhead: {
shape: cf-many
}
}
User <-> Metadata: "metadata/user" {
# o2m optional
source-arrowhead: {
shape: cf-one-required
}
target-arrowhead: {
shape: cf-many
}
}
User <-> Info: "info/user" {
# o2m optional
source-arrowhead: {
shape: cf-one-required
}
target-arrowhead: {
shape: cf-many
}
}
# Tables
Card: {
shape: sql_table
id: int {constraint: primary_key}
owner_id: int {constraint: foreign_key}
}
Info: {
shape: sql_table
id: int {constraint: primary_key}
content: json.RawMessage
}
Metadata: {
shape: sql_table
id: int {constraint: primary_key}
age: int
}
Pet: {
shape: sql_table
id: int {constraint: primary_key}
owner_id: int {constraint: foreign_key}
}
Post: {
shape: sql_table
id: int {constraint: primary_key}
text: string
author_id: int {constraint: foreign_key}
}
User: {
shape: sql_table
id: int {constraint: primary_key}
parent_id: int {constraint: foreign_key}
spouse_id: int {constraint: foreign_key}
}

View file

@ -755,7 +755,7 @@
"strokeWidth": 2, "strokeWidth": 2,
"stroke": "B1", "stroke": "B1",
"borderRadius": 10, "borderRadius": 10,
"label": "children/parent", "label": "children/parent/ancestor",
"fontSize": 16, "fontSize": 16,
"fontFamily": "DEFAULT", "fontFamily": "DEFAULT",
"language": "", "language": "",
@ -763,62 +763,62 @@
"italic": true, "italic": true,
"bold": false, "bold": false,
"underline": false, "underline": false,
"labelWidth": 104, "labelWidth": 167,
"labelHeight": 21, "labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER", "labelPosition": "INSIDE_MIDDLE_CENTER",
"labelPercentage": 0, "labelPercentage": 0,
"route": [ "route": [
{ {
"x": 770.5, "x": 770.5,
"y": 38.698727015558696 "y": 41.42337662337662
}, },
{ {
"x": 871.8333333333333, "x": 888.6333333333333,
"y": 7.739745403111737 "y": 8.28467532467532
}, },
{ {
"x": 903.5, "x": 925.55,
"y": 0 "y": 0
}, },
{ {
"x": 913, "x": 936.625,
"y": 0 "y": 0
}, },
{ {
"x": 922.5, "x": 947.7,
"y": 0 "y": 0
}, },
{ {
"x": 935.1666666666667, "x": 962.4666666666667,
"y": 14.4 "y": 14.4
}, },
{ {
"x": 944.6666666666667, "x": 973.5416666666667,
"y": 36 "y": 36
}, },
{ {
"x": 954.1666666666666, "x": 984.6166666666667,
"y": 57.6 "y": 57.6
}, },
{ {
"x": 954.1666666666666, "x": 984.6166666666667,
"y": 86.4 "y": 86.4
}, },
{ {
"x": 944.6666666666667, "x": 973.5416666666667,
"y": 108 "y": 108
}, },
{ {
"x": 935.1666666666667, "x": 962.4666666666667,
"y": 129.6 "y": 129.6
}, },
{ {
"x": 871.8333333333333, "x": 888.6333333333333,
"y": 136.26025459688827 "y": 135.71532467532467
}, },
{ {
"x": 770.5, "x": 770.5,
"y": 105.30127298444131 "y": 102.57662337662339
} }
], ],
"isCurve": true, "isCurve": true,

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 30 KiB

View file

@ -687,19 +687,19 @@
"route": [ "route": [
{ {
"x": 453.5, "x": 453.5,
"y": 69.6 "y": 60
}, },
{ {
"x": 403.5, "x": 365.5,
"y": 69.6 "y": 60
}, },
{ {
"x": 403.5, "x": 365.5,
"y": 98.4 "y": 108
}, },
{ {
"x": 453.5, "x": 453.5,
"y": 98.4 "y": 108
} }
], ],
"animated": false, "animated": false,
@ -718,7 +718,7 @@
"strokeWidth": 2, "strokeWidth": 2,
"stroke": "B1", "stroke": "B1",
"borderRadius": 10, "borderRadius": 10,
"label": "children/parent", "label": "children/parent/ancestor",
"fontSize": 16, "fontSize": 16,
"fontFamily": "DEFAULT", "fontFamily": "DEFAULT",
"language": "", "language": "",
@ -726,26 +726,26 @@
"italic": true, "italic": true,
"bold": false, "bold": false,
"underline": false, "underline": false,
"labelWidth": 104, "labelWidth": 167,
"labelHeight": 21, "labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER", "labelPosition": "INSIDE_MIDDLE_CENTER",
"labelPercentage": 0, "labelPercentage": 0,
"route": [ "route": [
{ {
"x": 453.5, "x": 733.5,
"y": 40.8 "y": 108
}, },
{ {
"x": 343.5, "x": 821.5,
"y": 40.8 "y": 108
}, },
{ {
"x": 343.5, "x": 821.5,
"y": 127.2 "y": 60
}, },
{ {
"x": 453.5, "x": 733.5,
"y": 127.2 "y": 60
} }
], ],
"animated": false, "animated": false,
@ -778,11 +778,11 @@
"labelPercentage": 0, "labelPercentage": 0,
"route": [ "route": [
{ {
"x": 500.16666666666663, "x": 500.1666666666667,
"y": 156 "y": 156
}, },
{ {
"x": 500.16666666666663, "x": 500.1666666666667,
"y": 196 "y": 196
}, },
{ {

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 30 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: 30 KiB

1019
e2etests/testdata/stable/ent2d2_right/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: 30 KiB

View file

@ -7,7 +7,7 @@
"id": "x", "id": "x",
"type": "rectangle", "type": "rectangle",
"pos": { "pos": {
"x": 72, "x": 62,
"y": 12 "y": 12
}, },
"width": 120, "width": 120,
@ -48,7 +48,7 @@
"id": "y", "id": "y",
"type": "rectangle", "type": "rectangle",
"pos": { "pos": {
"x": 194, "x": 209,
"y": 158 "y": 158
}, },
"width": 80, "width": 80,
@ -89,7 +89,7 @@
"id": "z", "id": "z",
"type": "rectangle", "type": "rectangle",
"pos": { "pos": {
"x": 297, "x": 337,
"y": 12 "y": 12
}, },
"width": 80, "width": 80,
@ -153,20 +153,20 @@
"labelPercentage": 0, "labelPercentage": 0,
"route": [ "route": [
{ {
"x": 72, "x": 62,
"y": 38.4 "y": 34
}, },
{ {
"x": 22, "x": 12,
"y": 38.4 "y": 34
}, },
{ {
"x": 22, "x": 12,
"y": 51.599999999999994 "y": 56
}, },
{ {
"x": 72, "x": 62,
"y": 51.599999999999994 "y": 56
} }
], ],
"animated": false, "animated": false,
@ -199,20 +199,20 @@
"labelPercentage": 0, "labelPercentage": 0,
"route": [ "route": [
{ {
"x": 72, "x": 182,
"y": 25.2 "y": 56
}, },
{ {
"x": 12, "x": 232,
"y": 25.2 "y": 56
}, },
{ {
"x": 12, "x": 232,
"y": 64.8 "y": 34
}, },
{ {
"x": 72, "x": 182,
"y": 64.8 "y": 34
} }
], ],
"animated": false, "animated": false,
@ -245,19 +245,19 @@
"labelPercentage": 0, "labelPercentage": 0,
"route": [ "route": [
{ {
"x": 132, "x": 122,
"y": 78 "y": 78
}, },
{ {
"x": 132, "x": 122,
"y": 118 "y": 118
}, },
{ {
"x": 221.16666666666663, "x": 236.16666666666663,
"y": 118 "y": 118
}, },
{ {
"x": 221.16666666666663, "x": 236.16666666666663,
"y": 158 "y": 158
} }
], ],
@ -291,19 +291,19 @@
"labelPercentage": 0, "labelPercentage": 0,
"route": [ "route": [
{ {
"x": 337, "x": 377,
"y": 78 "y": 78
}, },
{ {
"x": 337, "x": 377,
"y": 118 "y": 118
}, },
{ {
"x": 247.83333333333331, "x": 262.8333333333333,
"y": 118 "y": 118
}, },
{ {
"x": 247.83333333333331, "x": 262.8333333333333,
"y": 158 "y": 158
} }
], ],
@ -337,19 +337,19 @@
"labelPercentage": 0, "labelPercentage": 0,
"route": [ "route": [
{ {
"x": 297, "x": 337,
"y": 34 "y": 34
}, },
{ {
"x": 247, "x": 287,
"y": 34 "y": 34
}, },
{ {
"x": 247, "x": 287,
"y": 56 "y": 56
}, },
{ {
"x": 297, "x": 337,
"y": 56 "y": 56
} }
], ],

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.4.1-HEAD" preserveAspectRatio="xMinYMin meet" viewBox="0 0 367 214"><svg id="d2-svg" class="d2-1823189575" width="367" height="214" viewBox="11 11 367 214"><rect x="11.000000" y="11.000000" width="367.000000" height="214.000000" rx="0.000000" class=" fill-N7" stroke-width="0" /><style type="text/css"><![CDATA[ <?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.4.1-HEAD" preserveAspectRatio="xMinYMin meet" viewBox="0 0 407 214"><svg id="d2-svg" class="d2-127389242" width="407" height="214" viewBox="11 11 407 214"><rect x="11.000000" y="11.000000" width="407.000000" height="214.000000" rx="0.000000" class=" fill-N7" stroke-width="0" /><style type="text/css"><![CDATA[
.d2-1823189575 .text-bold { .d2-127389242 .text-bold {
font-family: "d2-1823189575-font-bold"; font-family: "d2-127389242-font-bold";
} }
@font-face { @font-face {
font-family: d2-1823189575-font-bold; font-family: d2-127389242-font-bold;
src: url("data:application/font-woff;base64,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"); src: url("data:application/font-woff;base64,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");
} }
.d2-1823189575 .text-italic { .d2-127389242 .text-italic {
font-family: "d2-1823189575-font-italic"; font-family: "d2-127389242-font-italic";
} }
@font-face { @font-face {
font-family: d2-1823189575-font-italic; font-family: d2-127389242-font-italic;
src: url("data:application/font-woff;base64,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"); src: url("data:application/font-woff;base64,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");
}]]></style><style type="text/css"><![CDATA[.shape { }]]></style><style type="text/css"><![CDATA[.shape {
shape-rendering: geometricPrecision; shape-rendering: geometricPrecision;
@ -25,78 +25,78 @@
opacity: 0.5; opacity: 0.5;
} }
.d2-1823189575 .fill-N1{fill:#0A0F25;} .d2-127389242 .fill-N1{fill:#0A0F25;}
.d2-1823189575 .fill-N2{fill:#676C7E;} .d2-127389242 .fill-N2{fill:#676C7E;}
.d2-1823189575 .fill-N3{fill:#9499AB;} .d2-127389242 .fill-N3{fill:#9499AB;}
.d2-1823189575 .fill-N4{fill:#CFD2DD;} .d2-127389242 .fill-N4{fill:#CFD2DD;}
.d2-1823189575 .fill-N5{fill:#DEE1EB;} .d2-127389242 .fill-N5{fill:#DEE1EB;}
.d2-1823189575 .fill-N6{fill:#EEF1F8;} .d2-127389242 .fill-N6{fill:#EEF1F8;}
.d2-1823189575 .fill-N7{fill:#FFFFFF;} .d2-127389242 .fill-N7{fill:#FFFFFF;}
.d2-1823189575 .fill-B1{fill:#0D32B2;} .d2-127389242 .fill-B1{fill:#0D32B2;}
.d2-1823189575 .fill-B2{fill:#0D32B2;} .d2-127389242 .fill-B2{fill:#0D32B2;}
.d2-1823189575 .fill-B3{fill:#E3E9FD;} .d2-127389242 .fill-B3{fill:#E3E9FD;}
.d2-1823189575 .fill-B4{fill:#E3E9FD;} .d2-127389242 .fill-B4{fill:#E3E9FD;}
.d2-1823189575 .fill-B5{fill:#EDF0FD;} .d2-127389242 .fill-B5{fill:#EDF0FD;}
.d2-1823189575 .fill-B6{fill:#F7F8FE;} .d2-127389242 .fill-B6{fill:#F7F8FE;}
.d2-1823189575 .fill-AA2{fill:#4A6FF3;} .d2-127389242 .fill-AA2{fill:#4A6FF3;}
.d2-1823189575 .fill-AA4{fill:#EDF0FD;} .d2-127389242 .fill-AA4{fill:#EDF0FD;}
.d2-1823189575 .fill-AA5{fill:#F7F8FE;} .d2-127389242 .fill-AA5{fill:#F7F8FE;}
.d2-1823189575 .fill-AB4{fill:#EDF0FD;} .d2-127389242 .fill-AB4{fill:#EDF0FD;}
.d2-1823189575 .fill-AB5{fill:#F7F8FE;} .d2-127389242 .fill-AB5{fill:#F7F8FE;}
.d2-1823189575 .stroke-N1{stroke:#0A0F25;} .d2-127389242 .stroke-N1{stroke:#0A0F25;}
.d2-1823189575 .stroke-N2{stroke:#676C7E;} .d2-127389242 .stroke-N2{stroke:#676C7E;}
.d2-1823189575 .stroke-N3{stroke:#9499AB;} .d2-127389242 .stroke-N3{stroke:#9499AB;}
.d2-1823189575 .stroke-N4{stroke:#CFD2DD;} .d2-127389242 .stroke-N4{stroke:#CFD2DD;}
.d2-1823189575 .stroke-N5{stroke:#DEE1EB;} .d2-127389242 .stroke-N5{stroke:#DEE1EB;}
.d2-1823189575 .stroke-N6{stroke:#EEF1F8;} .d2-127389242 .stroke-N6{stroke:#EEF1F8;}
.d2-1823189575 .stroke-N7{stroke:#FFFFFF;} .d2-127389242 .stroke-N7{stroke:#FFFFFF;}
.d2-1823189575 .stroke-B1{stroke:#0D32B2;} .d2-127389242 .stroke-B1{stroke:#0D32B2;}
.d2-1823189575 .stroke-B2{stroke:#0D32B2;} .d2-127389242 .stroke-B2{stroke:#0D32B2;}
.d2-1823189575 .stroke-B3{stroke:#E3E9FD;} .d2-127389242 .stroke-B3{stroke:#E3E9FD;}
.d2-1823189575 .stroke-B4{stroke:#E3E9FD;} .d2-127389242 .stroke-B4{stroke:#E3E9FD;}
.d2-1823189575 .stroke-B5{stroke:#EDF0FD;} .d2-127389242 .stroke-B5{stroke:#EDF0FD;}
.d2-1823189575 .stroke-B6{stroke:#F7F8FE;} .d2-127389242 .stroke-B6{stroke:#F7F8FE;}
.d2-1823189575 .stroke-AA2{stroke:#4A6FF3;} .d2-127389242 .stroke-AA2{stroke:#4A6FF3;}
.d2-1823189575 .stroke-AA4{stroke:#EDF0FD;} .d2-127389242 .stroke-AA4{stroke:#EDF0FD;}
.d2-1823189575 .stroke-AA5{stroke:#F7F8FE;} .d2-127389242 .stroke-AA5{stroke:#F7F8FE;}
.d2-1823189575 .stroke-AB4{stroke:#EDF0FD;} .d2-127389242 .stroke-AB4{stroke:#EDF0FD;}
.d2-1823189575 .stroke-AB5{stroke:#F7F8FE;} .d2-127389242 .stroke-AB5{stroke:#F7F8FE;}
.d2-1823189575 .background-color-N1{background-color:#0A0F25;} .d2-127389242 .background-color-N1{background-color:#0A0F25;}
.d2-1823189575 .background-color-N2{background-color:#676C7E;} .d2-127389242 .background-color-N2{background-color:#676C7E;}
.d2-1823189575 .background-color-N3{background-color:#9499AB;} .d2-127389242 .background-color-N3{background-color:#9499AB;}
.d2-1823189575 .background-color-N4{background-color:#CFD2DD;} .d2-127389242 .background-color-N4{background-color:#CFD2DD;}
.d2-1823189575 .background-color-N5{background-color:#DEE1EB;} .d2-127389242 .background-color-N5{background-color:#DEE1EB;}
.d2-1823189575 .background-color-N6{background-color:#EEF1F8;} .d2-127389242 .background-color-N6{background-color:#EEF1F8;}
.d2-1823189575 .background-color-N7{background-color:#FFFFFF;} .d2-127389242 .background-color-N7{background-color:#FFFFFF;}
.d2-1823189575 .background-color-B1{background-color:#0D32B2;} .d2-127389242 .background-color-B1{background-color:#0D32B2;}
.d2-1823189575 .background-color-B2{background-color:#0D32B2;} .d2-127389242 .background-color-B2{background-color:#0D32B2;}
.d2-1823189575 .background-color-B3{background-color:#E3E9FD;} .d2-127389242 .background-color-B3{background-color:#E3E9FD;}
.d2-1823189575 .background-color-B4{background-color:#E3E9FD;} .d2-127389242 .background-color-B4{background-color:#E3E9FD;}
.d2-1823189575 .background-color-B5{background-color:#EDF0FD;} .d2-127389242 .background-color-B5{background-color:#EDF0FD;}
.d2-1823189575 .background-color-B6{background-color:#F7F8FE;} .d2-127389242 .background-color-B6{background-color:#F7F8FE;}
.d2-1823189575 .background-color-AA2{background-color:#4A6FF3;} .d2-127389242 .background-color-AA2{background-color:#4A6FF3;}
.d2-1823189575 .background-color-AA4{background-color:#EDF0FD;} .d2-127389242 .background-color-AA4{background-color:#EDF0FD;}
.d2-1823189575 .background-color-AA5{background-color:#F7F8FE;} .d2-127389242 .background-color-AA5{background-color:#F7F8FE;}
.d2-1823189575 .background-color-AB4{background-color:#EDF0FD;} .d2-127389242 .background-color-AB4{background-color:#EDF0FD;}
.d2-1823189575 .background-color-AB5{background-color:#F7F8FE;} .d2-127389242 .background-color-AB5{background-color:#F7F8FE;}
.d2-1823189575 .color-N1{color:#0A0F25;} .d2-127389242 .color-N1{color:#0A0F25;}
.d2-1823189575 .color-N2{color:#676C7E;} .d2-127389242 .color-N2{color:#676C7E;}
.d2-1823189575 .color-N3{color:#9499AB;} .d2-127389242 .color-N3{color:#9499AB;}
.d2-1823189575 .color-N4{color:#CFD2DD;} .d2-127389242 .color-N4{color:#CFD2DD;}
.d2-1823189575 .color-N5{color:#DEE1EB;} .d2-127389242 .color-N5{color:#DEE1EB;}
.d2-1823189575 .color-N6{color:#EEF1F8;} .d2-127389242 .color-N6{color:#EEF1F8;}
.d2-1823189575 .color-N7{color:#FFFFFF;} .d2-127389242 .color-N7{color:#FFFFFF;}
.d2-1823189575 .color-B1{color:#0D32B2;} .d2-127389242 .color-B1{color:#0D32B2;}
.d2-1823189575 .color-B2{color:#0D32B2;} .d2-127389242 .color-B2{color:#0D32B2;}
.d2-1823189575 .color-B3{color:#E3E9FD;} .d2-127389242 .color-B3{color:#E3E9FD;}
.d2-1823189575 .color-B4{color:#E3E9FD;} .d2-127389242 .color-B4{color:#E3E9FD;}
.d2-1823189575 .color-B5{color:#EDF0FD;} .d2-127389242 .color-B5{color:#EDF0FD;}
.d2-1823189575 .color-B6{color:#F7F8FE;} .d2-127389242 .color-B6{color:#F7F8FE;}
.d2-1823189575 .color-AA2{color:#4A6FF3;} .d2-127389242 .color-AA2{color:#4A6FF3;}
.d2-1823189575 .color-AA4{color:#EDF0FD;} .d2-127389242 .color-AA4{color:#EDF0FD;}
.d2-1823189575 .color-AA5{color:#F7F8FE;} .d2-127389242 .color-AA5{color:#F7F8FE;}
.d2-1823189575 .color-AB4{color:#EDF0FD;} .d2-127389242 .color-AB4{color:#EDF0FD;}
.d2-1823189575 .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="72.000000" y="12.000000" width="120.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="132.000000" y="50.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">x</text></g><g id="y"><g class="shape" ><rect x="194.000000" y="158.000000" width="80.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="234.000000" y="196.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">y</text></g><g id="z"><g class="shape" ><rect x="297.000000" y="12.000000" width="80.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="337.000000" y="50.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 70.000000 38.400000 L 28.600000 38.400000 C 15.400000 38.400000 15.400000 51.600000 28.600000 51.600000 L 68.000000 51.600000" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-1823189575)" /></g><g id="(x -&gt; x)[1]"><path d="M 70.000000 25.200000 L 22.000000 25.200000 S 12.000000 25.200000 12.000000 35.200000 L 12.000000 54.800000 S 12.000000 64.800000 22.000000 64.800000 L 68.000000 64.800000" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-1823189575)" /></g><g id="(x -&gt; y)[0]"><path d="M 132.000000 80.000000 L 132.000000 108.000000 S 132.000000 118.000000 142.000000 118.000000 L 211.166667 118.000000 S 221.166667 118.000000 221.166667 128.000000 L 221.166667 154.000000" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-1823189575)" /></g><g id="(z -&gt; y)[0]"><path d="M 337.000000 80.000000 L 337.000000 108.000000 S 337.000000 118.000000 327.000000 118.000000 L 257.833333 118.000000 S 247.833333 118.000000 247.833333 128.000000 L 247.833333 154.000000" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-1823189575)" /></g><g id="(z -&gt; z)[0]"><path d="M 295.000000 34.000000 L 257.000000 34.000000 S 247.000000 34.000000 247.000000 44.000000 L 247.000000 46.000000 S 247.000000 56.000000 257.000000 56.000000 L 293.000000 56.000000" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-1823189575)" /><text x="247.500000" y="51.000000" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">hello</text></g><mask id="d2-1823189575" maskUnits="userSpaceOnUse" x="11" y="11" width="367" height="214"> .d2-127389242 .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="62.000000" y="12.000000" width="120.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="122.000000" y="50.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">x</text></g><g id="y"><g class="shape" ><rect x="209.000000" y="158.000000" width="80.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="249.000000" y="196.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">y</text></g><g id="z"><g class="shape" ><rect x="337.000000" y="12.000000" width="80.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="377.000000" y="50.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 60.000000 34.000000 L 22.000000 34.000000 S 12.000000 34.000000 12.000000 44.000000 L 12.000000 46.000000 S 12.000000 56.000000 22.000000 56.000000 L 58.000000 56.000000" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-127389242)" /></g><g id="(x -&gt; x)[1]"><path d="M 184.000000 56.000000 L 222.000000 56.000000 S 232.000000 56.000000 232.000000 46.000000 L 232.000000 44.000000 S 232.000000 34.000000 222.000000 34.000000 L 186.000000 34.000000" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-127389242)" /></g><g id="(x -&gt; y)[0]"><path d="M 122.000000 80.000000 L 122.000000 108.000000 S 122.000000 118.000000 132.000000 118.000000 L 226.166667 118.000000 S 236.166667 118.000000 236.166667 128.000000 L 236.166667 154.000000" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-127389242)" /></g><g id="(z -&gt; y)[0]"><path d="M 377.000000 80.000000 L 377.000000 108.000000 S 377.000000 118.000000 367.000000 118.000000 L 272.833333 118.000000 S 262.833333 118.000000 262.833333 128.000000 L 262.833333 154.000000" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-127389242)" /></g><g id="(z -&gt; z)[0]"><path d="M 335.000000 34.000000 L 297.000000 34.000000 S 287.000000 34.000000 287.000000 44.000000 L 287.000000 46.000000 S 287.000000 56.000000 297.000000 56.000000 L 333.000000 56.000000" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-127389242)" /><text x="287.500000" y="51.000000" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">hello</text></g><mask id="d2-127389242" maskUnits="userSpaceOnUse" x="11" y="11" width="407" height="214">
<rect x="11" y="11" width="367" height="214" fill="white"></rect> <rect x="11" y="11" width="407" height="214" fill="white"></rect>
<rect x="231.000000" y="35.000000" width="33" height="21" fill="black"></rect> <rect x="271.000000" y="35.000000" width="33" height="21" fill="black"></rect>
</mask></svg></svg> </mask></svg></svg>

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB