diff --git a/ci/release/changelogs/next.md b/ci/release/changelogs/next.md
index 75ccfabe5..bcfad37ae 100644
--- a/ci/release/changelogs/next.md
+++ b/ci/release/changelogs/next.md
@@ -4,6 +4,7 @@
- `--animate-interval` can be passed as a flag to animate multi-board diagrams. See [docs](https://d2lang.com/todo). [#1088](https://github.com/terrastruct/d2/pull/1088)
- `paper` is available as a `fill-pattern` option [#1070](https://github.com/terrastruct/d2/pull/1070)
- fonts are now subsetted to reduce svg file size [#1089](https://github.com/terrastruct/d2/pull/1089)
+- New theme: Origami [#1110](https://github.com/terrastruct/d2/pull/1110)
#### Improvements 🧹
diff --git a/d2exporter/export.go b/d2exporter/export.go
index 16ba3787b..bbcac39f2 100644
--- a/d2exporter/export.go
+++ b/d2exporter/export.go
@@ -62,6 +62,10 @@ func applyTheme(shape *d2target.Shape, obj *d2graph.Object, theme *d2themes.Them
if len(obj.ChildrenArray) > 0 {
shape.FillPattern = "dots"
}
+ } else if theme.SpecialRules.ContainerPaper {
+ if len(obj.ChildrenArray) > 0 {
+ shape.FillPattern = "paper"
+ }
}
if theme.SpecialRules.Mono {
shape.FontFamily = "mono"
diff --git a/d2themes/d2themes.go b/d2themes/d2themes.go
index 7b6e1c267..12556a8f2 100644
--- a/d2themes/d2themes.go
+++ b/d2themes/d2themes.go
@@ -18,6 +18,8 @@ type SpecialRules struct {
OuterContainerDoubleBorder bool `json:"outerContainerDoubleBorder"`
ContainerDots bool `json:"containerDots"`
CapsLock bool `json:"capsLock"`
+
+ ContainerPaper bool `json:"containerPaper"`
}
func (t *Theme) IsDark() bool {
diff --git a/d2themes/d2themescatalog/catalog.go b/d2themes/d2themescatalog/catalog.go
index ee86ac751..32075173c 100644
--- a/d2themes/d2themescatalog/catalog.go
+++ b/d2themes/d2themescatalog/catalog.go
@@ -24,6 +24,7 @@ var LightCatalog = []d2themes.Theme{
ButteredToast,
Terminal,
TerminalGrayscale,
+ Origami,
}
var DarkCatalog = []d2themes.Theme{
diff --git a/d2themes/d2themescatalog/origami.go b/d2themes/d2themescatalog/origami.go
new file mode 100644
index 000000000..7b9f33d0d
--- /dev/null
+++ b/d2themes/d2themescatalog/origami.go
@@ -0,0 +1,40 @@
+package d2themescatalog
+
+import "oss.terrastruct.com/d2/d2themes"
+
+var Origami = d2themes.Theme{
+ ID: 302,
+ Name: "Origami",
+ Colors: d2themes.ColorPalette{
+ Neutrals: OrigamiNeutral,
+
+ B1: "#170206",
+ B2: "#A62543",
+ B3: "#E07088",
+ B4: "#F3E0D2",
+ B5: "#FAF1E6",
+ B6: "#FFFBF8",
+
+ AA2: "#0A4EA6",
+ AA4: "#3182CD",
+ AA5: "#68A8E4",
+
+ AB4: "#E07088",
+ AB5: "#F19CAE",
+ },
+ SpecialRules: d2themes.SpecialRules{
+ NoCornerRadius: true,
+ OuterContainerDoubleBorder: true,
+ ContainerPaper: true,
+ },
+}
+
+var OrigamiNeutral = d2themes.Neutral{
+ N1: "#170206",
+ N2: "#6F0019",
+ N3: "#FFFFFF",
+ N4: "#E07088",
+ N5: "#D2B098",
+ N6: "#FFFFFF",
+ N7: "#FFFFFF",
+}
diff --git a/e2etests/testdata/themes/origami/dagre/board.exp.json b/e2etests/testdata/themes/origami/dagre/board.exp.json
new file mode 100644
index 000000000..e6a846264
--- /dev/null
+++ b/e2etests/testdata/themes/origami/dagre/board.exp.json
@@ -0,0 +1,1104 @@
+{
+ "name": "",
+ "isFolderOnly": false,
+ "fontFamily": "SourceSansPro",
+ "shapes": [
+ {
+ "id": "network",
+ "type": "rectangle",
+ "pos": {
+ "x": 0,
+ "y": 275
+ },
+ "width": 351,
+ "height": 1225,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "B4",
+ "fillPattern": "paper",
+ "stroke": "B1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": true,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "通信網",
+ "fontSize": 28,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 104,
+ "labelHeight": 36,
+ "labelPosition": "OUTSIDE_TOP_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "network.cell tower",
+ "type": "rectangle",
+ "pos": {
+ "x": 95,
+ "y": 340
+ },
+ "width": 237,
+ "height": 317,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "B5",
+ "fillPattern": "paper",
+ "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": "cell tower",
+ "fontSize": 24,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 99,
+ "labelHeight": 31,
+ "labelPosition": "OUTSIDE_TOP_CENTER",
+ "zIndex": 0,
+ "level": 2
+ },
+ {
+ "id": "network.cell tower.satellites",
+ "type": "stored_data",
+ "pos": {
+ "x": 161,
+ "y": 372
+ },
+ "width": 104,
+ "height": 66,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "AA5",
+ "stroke": "B1",
+ "shadow": false,
+ "3d": false,
+ "multiple": true,
+ "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": 39,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 3
+ },
+ {
+ "id": "network.cell tower.transmitter",
+ "type": "rectangle",
+ "pos": {
+ "x": 161,
+ "y": 559
+ },
+ "width": 104,
+ "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": "送信機",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 59,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 3
+ },
+ {
+ "id": "network.online portal",
+ "type": "rectangle",
+ "pos": {
+ "x": 20,
+ "y": 1319
+ },
+ "width": 144,
+ "height": 151,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "B5",
+ "fillPattern": "paper",
+ "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": "オンラインポータル",
+ "fontSize": 24,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 271,
+ "labelHeight": 31,
+ "labelPosition": "OUTSIDE_TOP_CENTER",
+ "zIndex": 0,
+ "level": 2
+ },
+ {
+ "id": "network.online portal.ui",
+ "type": "hexagon",
+ "pos": {
+ "x": 65,
+ "y": 1360
+ },
+ "width": 59,
+ "height": 69,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "N5",
+ "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": "ui",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 14,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 3
+ },
+ {
+ "id": "network.data processor",
+ "type": "rectangle",
+ "pos": {
+ "x": 121,
+ "y": 814
+ },
+ "width": 184,
+ "height": 182,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "B5",
+ "fillPattern": "paper",
+ "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": "データプロセッサ",
+ "fontSize": 24,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 241,
+ "labelHeight": 31,
+ "labelPosition": "OUTSIDE_TOP_CENTER",
+ "zIndex": 0,
+ "level": 2
+ },
+ {
+ "id": "network.data processor.storage",
+ "type": "cylinder",
+ "pos": {
+ "x": 161,
+ "y": 846
+ },
+ "width": 104,
+ "height": 118,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "AA5",
+ "stroke": "B1",
+ "shadow": false,
+ "3d": false,
+ "multiple": true,
+ "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": 59,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 3
+ },
+ {
+ "id": "user",
+ "type": "person",
+ "pos": {
+ "x": 66,
+ "y": 0
+ },
+ "width": 130,
+ "height": 87,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "B3",
+ "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": "ユーザー",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 79,
+ "labelHeight": 21,
+ "labelPosition": "OUTSIDE_BOTTOM_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "api server",
+ "type": "rectangle",
+ "pos": {
+ "x": 392,
+ "y": 1076
+ },
+ "width": 153,
+ "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": "API サーバー",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 108,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "logs",
+ "type": "page",
+ "pos": {
+ "x": 426,
+ "y": 1313
+ },
+ "width": 84,
+ "height": 87,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "AB4",
+ "stroke": "B1",
+ "shadow": false,
+ "3d": false,
+ "multiple": true,
+ "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": 39,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 1
+ }
+ ],
+ "connections": [
+ {
+ "id": "network.cell tower.(satellites -> transmitter)[0]",
+ "src": "network.cell tower.satellites",
+ "srcArrow": "none",
+ "srcLabel": "",
+ "dst": "network.cell tower.transmitter",
+ "dstArrow": "triangle",
+ "dstLabel": "",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "B1",
+ "label": "send",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 33,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 194,
+ "y": 439
+ },
+ {
+ "x": 166,
+ "y": 487
+ },
+ {
+ "x": 166,
+ "y": 511.2
+ },
+ {
+ "x": 194,
+ "y": 560
+ }
+ ],
+ "isCurve": true,
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "network.cell tower.(satellites -> transmitter)[1]",
+ "src": "network.cell tower.satellites",
+ "srcArrow": "none",
+ "srcLabel": "",
+ "dst": "network.cell tower.transmitter",
+ "dstArrow": "triangle",
+ "dstLabel": "",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "B1",
+ "label": "send",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 33,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 213,
+ "y": 439
+ },
+ {
+ "x": 213.2,
+ "y": 487
+ },
+ {
+ "x": 213.25,
+ "y": 511.2
+ },
+ {
+ "x": 213.25,
+ "y": 560
+ }
+ ],
+ "isCurve": true,
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "network.cell tower.(satellites -> transmitter)[2]",
+ "src": "network.cell tower.satellites",
+ "srcArrow": "none",
+ "srcLabel": "",
+ "dst": "network.cell tower.transmitter",
+ "dstArrow": "triangle",
+ "dstLabel": "",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "B1",
+ "label": "send",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 33,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 233,
+ "y": 439
+ },
+ {
+ "x": 260.6,
+ "y": 487
+ },
+ {
+ "x": 260.5,
+ "y": 511.2
+ },
+ {
+ "x": 232.5,
+ "y": 560
+ }
+ ],
+ "isCurve": true,
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "network.(cell tower.transmitter -> data processor.storage)[0]",
+ "src": "network.cell tower.transmitter",
+ "srcArrow": "none",
+ "srcLabel": "",
+ "dst": "network.data processor.storage",
+ "dstArrow": "triangle",
+ "dstLabel": "",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "B1",
+ "label": "電話ログ",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 77,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 213.25,
+ "y": 625.5
+ },
+ {
+ "x": 213.25,
+ "y": 651.1
+ },
+ {
+ "x": 213.25,
+ "y": 669.6
+ },
+ {
+ "x": 213.25,
+ "y": 687.75
+ },
+ {
+ "x": 213.25,
+ "y": 705.9
+ },
+ {
+ "x": 213.2,
+ "y": 792.2
+ },
+ {
+ "x": 213,
+ "y": 847
+ }
+ ],
+ "isCurve": true,
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "(user -> network.cell tower)[0]",
+ "src": "user",
+ "srcArrow": "none",
+ "srcLabel": "",
+ "dst": "network.cell tower",
+ "dstArrow": "triangle",
+ "dstLabel": "",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "B1",
+ "label": "電話をかける",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 116,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 152,
+ "y": 87
+ },
+ {
+ "x": 201,
+ "y": 156.2
+ },
+ {
+ "x": 213.25,
+ "y": 248.2
+ },
+ {
+ "x": 213.25,
+ "y": 305
+ }
+ ],
+ "isCurve": true,
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "(user -> network.online portal.ui)[0]",
+ "src": "user",
+ "srcArrow": "none",
+ "srcLabel": "",
+ "dst": "network.online portal.ui",
+ "dstArrow": "triangle",
+ "dstLabel": "",
+ "opacity": 1,
+ "strokeDash": 3,
+ "strokeWidth": 2,
+ "stroke": "B2",
+ "label": "アクセス",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 77,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 116,
+ "y": 87
+ },
+ {
+ "x": 83,
+ "y": 156.2
+ },
+ {
+ "x": 74.75,
+ "y": 185.6
+ },
+ {
+ "x": 74.75,
+ "y": 203.75
+ },
+ {
+ "x": 74.75,
+ "y": 221.9
+ },
+ {
+ "x": 74.75,
+ "y": 244
+ },
+ {
+ "x": 74.75,
+ "y": 259
+ },
+ {
+ "x": 74.75,
+ "y": 274
+ },
+ {
+ "x": 74.75,
+ "y": 300.6
+ },
+ {
+ "x": 74.75,
+ "y": 325.5
+ },
+ {
+ "x": 74.75,
+ "y": 350.4
+ },
+ {
+ "x": 74.75,
+ "y": 385.7
+ },
+ {
+ "x": 74.75,
+ "y": 413.75
+ },
+ {
+ "x": 74.75,
+ "y": 441.8
+ },
+ {
+ "x": 74.75,
+ "y": 479.2
+ },
+ {
+ "x": 74.75,
+ "y": 507.25
+ },
+ {
+ "x": 74.75,
+ "y": 535.3
+ },
+ {
+ "x": 74.75,
+ "y": 570.6
+ },
+ {
+ "x": 74.75,
+ "y": 595.5
+ },
+ {
+ "x": 74.75,
+ "y": 620.4
+ },
+ {
+ "x": 74.75,
+ "y": 649.1
+ },
+ {
+ "x": 74.75,
+ "y": 667.25
+ },
+ {
+ "x": 74.75,
+ "y": 685.4
+ },
+ {
+ "x": 74.75,
+ "y": 709.6
+ },
+ {
+ "x": 74.75,
+ "y": 727.75
+ },
+ {
+ "x": 74.75,
+ "y": 745.9
+ },
+ {
+ "x": 74.75,
+ "y": 779.8
+ },
+ {
+ "x": 74.75,
+ "y": 812.5
+ },
+ {
+ "x": 74.75,
+ "y": 845.2
+ },
+ {
+ "x": 74.75,
+ "y": 888.8
+ },
+ {
+ "x": 74.75,
+ "y": 921.5
+ },
+ {
+ "x": 74.75,
+ "y": 954.2
+ },
+ {
+ "x": 74.75,
+ "y": 986
+ },
+ {
+ "x": 74.75,
+ "y": 1001
+ },
+ {
+ "x": 74.75,
+ "y": 1016
+ },
+ {
+ "x": 74.75,
+ "y": 1042.6
+ },
+ {
+ "x": 74.75,
+ "y": 1067.5
+ },
+ {
+ "x": 74.75,
+ "y": 1092.4
+ },
+ {
+ "x": 74.75,
+ "y": 1127.7
+ },
+ {
+ "x": 74.75,
+ "y": 1155.75
+ },
+ {
+ "x": 74.75,
+ "y": 1183.8
+ },
+ {
+ "x": 77.2,
+ "y": 1282.6
+ },
+ {
+ "x": 87,
+ "y": 1361
+ }
+ ],
+ "isCurve": true,
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "(api server -> network.online portal.ui)[0]",
+ "src": "api server",
+ "srcArrow": "none",
+ "srcLabel": "",
+ "dst": "network.online portal.ui",
+ "dstArrow": "triangle",
+ "dstLabel": "",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "B1",
+ "label": "画面",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 39,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 391.75,
+ "y": 1129.4949856733524
+ },
+ {
+ "x": 173.75,
+ "y": 1187.8989971346705
+ },
+ {
+ "x": 116,
+ "y": 1282.6
+ },
+ {
+ "x": 103,
+ "y": 1361
+ }
+ ],
+ "isCurve": true,
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "(api server -> logs)[0]",
+ "src": "api server",
+ "srcArrow": "none",
+ "srcLabel": "",
+ "dst": "logs",
+ "dstArrow": "triangle",
+ "dstLabel": "",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "B1",
+ "label": "持続する",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 77,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 468.25,
+ "y": 1142
+ },
+ {
+ "x": 468.25,
+ "y": 1190.4
+ },
+ {
+ "x": 468.2,
+ "y": 1273
+ },
+ {
+ "x": 468,
+ "y": 1313
+ }
+ ],
+ "isCurve": true,
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "(network.data processor -> api server)[0]",
+ "src": "network.data processor",
+ "srcArrow": "none",
+ "srcLabel": "",
+ "dst": "api server",
+ "dstArrow": "triangle",
+ "dstLabel": "",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "B1",
+ "label": "",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 213.25,
+ "y": 996.5
+ },
+ {
+ "x": 213.25,
+ "y": 1020.1
+ },
+ {
+ "x": 248.95,
+ "y": 1037.62
+ },
+ {
+ "x": 391.75,
+ "y": 1084.1
+ }
+ ],
+ "isCurve": true,
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ }
+ ],
+ "root": {
+ "id": "",
+ "type": "",
+ "pos": {
+ "x": 0,
+ "y": 0
+ },
+ "width": 0,
+ "height": 0,
+ "opacity": 0,
+ "strokeDash": 0,
+ "strokeWidth": 0,
+ "borderRadius": 0,
+ "fill": "N7",
+ "stroke": "",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "",
+ "fontSize": 0,
+ "fontFamily": "",
+ "language": "",
+ "color": "",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "zIndex": 0,
+ "level": 0
+ }
+}
diff --git a/e2etests/testdata/themes/origami/dagre/sketch.exp.svg b/e2etests/testdata/themes/origami/dagre/sketch.exp.svg
new file mode 100644
index 000000000..dafe452ab
--- /dev/null
+++ b/e2etests/testdata/themes/origami/dagre/sketch.exp.svg
@@ -0,0 +1,1180 @@
+
\ No newline at end of file
diff --git a/e2etests/testdata/themes/origami/elk/board.exp.json b/e2etests/testdata/themes/origami/elk/board.exp.json
new file mode 100644
index 000000000..155236329
--- /dev/null
+++ b/e2etests/testdata/themes/origami/elk/board.exp.json
@@ -0,0 +1,895 @@
+{
+ "name": "",
+ "isFolderOnly": false,
+ "fontFamily": "SourceSansPro",
+ "shapes": [
+ {
+ "id": "network",
+ "type": "rectangle",
+ "pos": {
+ "x": 12,
+ "y": 311
+ },
+ "width": 690,
+ "height": 902,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "B4",
+ "fillPattern": "paper",
+ "stroke": "B1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": true,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "通信網",
+ "fontSize": 28,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 104,
+ "labelHeight": 36,
+ "labelPosition": "INSIDE_TOP_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "network.cell tower",
+ "type": "rectangle",
+ "pos": {
+ "x": 94,
+ "y": 361
+ },
+ "width": 222,
+ "height": 413,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "B5",
+ "fillPattern": "paper",
+ "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": "cell tower",
+ "fontSize": 24,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 99,
+ "labelHeight": 31,
+ "labelPosition": "INSIDE_TOP_CENTER",
+ "zIndex": 0,
+ "level": 2
+ },
+ {
+ "id": "network.cell tower.satellites",
+ "type": "stored_data",
+ "pos": {
+ "x": 145,
+ "y": 411
+ },
+ "width": 120,
+ "height": 66,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "AA5",
+ "stroke": "B1",
+ "shadow": false,
+ "3d": false,
+ "multiple": true,
+ "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": 39,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 3
+ },
+ {
+ "id": "network.cell tower.transmitter",
+ "type": "rectangle",
+ "pos": {
+ "x": 145,
+ "y": 658
+ },
+ "width": 120,
+ "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": "送信機",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 59,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 3
+ },
+ {
+ "id": "network.online portal",
+ "type": "rectangle",
+ "pos": {
+ "x": 336,
+ "y": 366
+ },
+ "width": 316,
+ "height": 169,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "B5",
+ "fillPattern": "paper",
+ "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": "オンラインポータル",
+ "fontSize": 24,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 271,
+ "labelHeight": 31,
+ "labelPosition": "INSIDE_TOP_CENTER",
+ "zIndex": 0,
+ "level": 2
+ },
+ {
+ "id": "network.online portal.ui",
+ "type": "hexagon",
+ "pos": {
+ "x": 454,
+ "y": 416
+ },
+ "width": 80,
+ "height": 69,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "N5",
+ "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": "ui",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 14,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 3
+ },
+ {
+ "id": "network.data processor",
+ "type": "rectangle",
+ "pos": {
+ "x": 62,
+ "y": 945
+ },
+ "width": 286,
+ "height": 218,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "B5",
+ "fillPattern": "paper",
+ "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": "データプロセッサ",
+ "fontSize": 24,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 241,
+ "labelHeight": 31,
+ "labelPosition": "INSIDE_TOP_CENTER",
+ "zIndex": 0,
+ "level": 2
+ },
+ {
+ "id": "network.data processor.storage",
+ "type": "cylinder",
+ "pos": {
+ "x": 153,
+ "y": 995
+ },
+ "width": 104,
+ "height": 118,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "AA5",
+ "stroke": "B1",
+ "shadow": false,
+ "3d": false,
+ "multiple": true,
+ "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": 59,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 3
+ },
+ {
+ "id": "user",
+ "type": "person",
+ "pos": {
+ "x": 341,
+ "y": 12
+ },
+ "width": 130,
+ "height": 87,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "B3",
+ "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": "ユーザー",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 79,
+ "labelHeight": 21,
+ "labelPosition": "OUTSIDE_BOTTOM_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "api server",
+ "type": "rectangle",
+ "pos": {
+ "x": 666,
+ "y": 59
+ },
+ "width": 153,
+ "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": "API サーバー",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N1",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 108,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "logs",
+ "type": "page",
+ "pos": {
+ "x": 782,
+ "y": 311
+ },
+ "width": 84,
+ "height": 87,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "AB4",
+ "stroke": "B1",
+ "shadow": false,
+ "3d": false,
+ "multiple": true,
+ "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": 39,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "zIndex": 0,
+ "level": 1
+ }
+ ],
+ "connections": [
+ {
+ "id": "network.cell tower.(satellites -> transmitter)[0]",
+ "src": "network.cell tower.satellites",
+ "srcArrow": "none",
+ "srcLabel": "",
+ "dst": "network.cell tower.transmitter",
+ "dstArrow": "triangle",
+ "dstLabel": "",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "B1",
+ "label": "send",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 33,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 161,
+ "y": 477
+ },
+ {
+ "x": 161,
+ "y": 658
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "network.cell tower.(satellites -> transmitter)[1]",
+ "src": "network.cell tower.satellites",
+ "srcArrow": "none",
+ "srcLabel": "",
+ "dst": "network.cell tower.transmitter",
+ "dstArrow": "triangle",
+ "dstLabel": "",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "B1",
+ "label": "send",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 33,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 205,
+ "y": 477
+ },
+ {
+ "x": 205,
+ "y": 658
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "network.cell tower.(satellites -> transmitter)[2]",
+ "src": "network.cell tower.satellites",
+ "srcArrow": "none",
+ "srcLabel": "",
+ "dst": "network.cell tower.transmitter",
+ "dstArrow": "triangle",
+ "dstLabel": "",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "B1",
+ "label": "send",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 33,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 249,
+ "y": 477
+ },
+ {
+ "x": 249,
+ "y": 658
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "network.(cell tower.transmitter -> data processor.storage)[0]",
+ "src": "network.cell tower.transmitter",
+ "srcArrow": "none",
+ "srcLabel": "",
+ "dst": "network.data processor.storage",
+ "dstArrow": "triangle",
+ "dstLabel": "",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "B1",
+ "label": "電話ログ",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 77,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 205,
+ "y": 724
+ },
+ {
+ "x": 205,
+ "y": 995
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "(user -> network.cell tower)[0]",
+ "src": "user",
+ "srcArrow": "none",
+ "srcLabel": "",
+ "dst": "network.cell tower",
+ "dstArrow": "triangle",
+ "dstLabel": "",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "B1",
+ "label": "電話をかける",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 116,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 385,
+ "y": 99
+ },
+ {
+ "x": 384.5833333333333,
+ "y": 165
+ },
+ {
+ "x": 259.3333333333333,
+ "y": 165
+ },
+ {
+ "x": 259.3333333333333,
+ "y": 361
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "(user -> network.online portal.ui)[0]",
+ "src": "user",
+ "srcArrow": "none",
+ "srcLabel": "",
+ "dst": "network.online portal.ui",
+ "dstArrow": "triangle",
+ "dstLabel": "",
+ "opacity": 1,
+ "strokeDash": 3,
+ "strokeWidth": 2,
+ "stroke": "B2",
+ "label": "アクセス",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 77,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 428,
+ "y": 99
+ },
+ {
+ "x": 427.91666666666663,
+ "y": 165
+ },
+ {
+ "x": 481.16666666666663,
+ "y": 165
+ },
+ {
+ "x": 481,
+ "y": 416
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "(api server -> network.online portal.ui)[0]",
+ "src": "api server",
+ "srcArrow": "none",
+ "srcLabel": "",
+ "dst": "network.online portal.ui",
+ "dstArrow": "triangle",
+ "dstLabel": "",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "B1",
+ "label": "画面",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 39,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 704.25,
+ "y": 125
+ },
+ {
+ "x": 704.25,
+ "y": 266
+ },
+ {
+ "x": 507.83333333333337,
+ "y": 266
+ },
+ {
+ "x": 508,
+ "y": 416
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "(api server -> logs)[0]",
+ "src": "api server",
+ "srcArrow": "none",
+ "srcLabel": "",
+ "dst": "logs",
+ "dstArrow": "triangle",
+ "dstLabel": "",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "B1",
+ "label": "持続する",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 77,
+ "labelHeight": 21,
+ "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 780.75,
+ "y": 125
+ },
+ {
+ "x": 780.75,
+ "y": 165
+ },
+ {
+ "x": 824.5,
+ "y": 165
+ },
+ {
+ "x": 825,
+ "y": 311
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "(network.data processor -> api server)[0]",
+ "src": "network.data processor",
+ "srcArrow": "none",
+ "srcLabel": "",
+ "dst": "api server",
+ "dstArrow": "triangle",
+ "dstLabel": "",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "B1",
+ "label": "",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 153,
+ "y": 1163
+ },
+ {
+ "x": 153,
+ "y": 1258
+ },
+ {
+ "x": 742.5,
+ "y": 1258
+ },
+ {
+ "x": 742.5,
+ "y": 125
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ }
+ ],
+ "root": {
+ "id": "",
+ "type": "",
+ "pos": {
+ "x": 0,
+ "y": 0
+ },
+ "width": 0,
+ "height": 0,
+ "opacity": 0,
+ "strokeDash": 0,
+ "strokeWidth": 0,
+ "borderRadius": 0,
+ "fill": "N7",
+ "stroke": "",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "",
+ "fontSize": 0,
+ "fontFamily": "",
+ "language": "",
+ "color": "",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "zIndex": 0,
+ "level": 0
+ }
+}
diff --git a/e2etests/testdata/themes/origami/elk/sketch.exp.svg b/e2etests/testdata/themes/origami/elk/sketch.exp.svg
new file mode 100644
index 000000000..0c0fefb82
--- /dev/null
+++ b/e2etests/testdata/themes/origami/elk/sketch.exp.svg
@@ -0,0 +1,1180 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+通信網ユーザーAPI サーバーログcell towerオンラインポータルデータプロセッサ衛星送信機ui保管所 sendsendsend電話ログ電話をかける アクセス画面持続する
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/e2etests/themes_test.go b/e2etests/themes_test.go
index d44bcf760..a7d60cc57 100644
--- a/e2etests/themes_test.go
+++ b/e2etests/themes_test.go
@@ -153,6 +153,56 @@ api server -> network.online portal.ui: display
api server -> logs: persist
logs: { shape: page; style.multiple: true }
+network.data processor -> api server
+`,
+ },
+ {
+ name: "origami",
+ themeID: d2themescatalog.Origami.ID,
+ script: `
+network: 通信網 {
+ cell tower: {
+ satellites: 衛星 {
+ shape: stored_data
+ style.multiple: true
+ }
+
+ transmitter: 送信機
+
+ satellites -> transmitter: send
+ satellites -> transmitter: send
+ satellites -> transmitter: send
+ }
+
+ online portal: オンラインポータル {
+ ui: { shape: hexagon }
+ }
+
+ data processor: データプロセッサ {
+ storage: 保管所 {
+ shape: cylinder
+ style.multiple: true
+ }
+ }
+
+ cell tower.transmitter -> data processor.storage: 電話ログ
+}
+
+user: ユーザー {
+ shape: person
+ width: 130
+}
+
+user -> network.cell tower: 電話をかける
+user -> network.online portal.ui: アクセス {
+ style.stroke-dash: 3
+}
+
+api server: API サーバー
+api server -> network.online portal.ui: 画面
+api server -> logs: 持続する
+logs: ログ { shape: page; style.multiple: true }
+
network.data processor -> api server
`,
},