diff --git a/d2layouts/d2dagrelayout/layout.go b/d2layouts/d2dagrelayout/layout.go
index b6dd281ad..3b6885bf8 100644
--- a/d2layouts/d2dagrelayout/layout.go
+++ b/d2layouts/d2dagrelayout/layout.go
@@ -150,7 +150,7 @@ func Layout(ctx context.Context, g *d2graph.Graph) (err error) {
if obj.LabelWidth != nil && obj.LabelHeight != nil {
if len(obj.ChildrenArray) > 0 {
obj.LabelPosition = go2.Pointer(string(label.InsideTopCenter))
- } else if obj.Attributes.Shape.Value == d2target.ShapeImage {
+ } else if obj.Attributes.Shape.Value == d2target.ShapeImage || obj.Attributes.Icon != nil {
obj.LabelPosition = go2.Pointer(string(label.OutsideTopCenter))
} else {
obj.LabelPosition = go2.Pointer(string(label.InsideMiddleCenter))
diff --git a/d2layouts/d2elklayout/layout.go b/d2layouts/d2elklayout/layout.go
index 94a0e7ebd..2449a9751 100644
--- a/d2layouts/d2elklayout/layout.go
+++ b/d2layouts/d2elklayout/layout.go
@@ -247,7 +247,7 @@ func Layout(ctx context.Context, g *d2graph.Graph) (err error) {
if obj.LabelWidth != nil && obj.LabelHeight != nil {
if len(obj.ChildrenArray) > 0 {
obj.LabelPosition = go2.Pointer(string(label.InsideTopCenter))
- } else if obj.Attributes.Shape.Value == d2target.ShapeImage {
+ } else if obj.Attributes.Shape.Value == d2target.ShapeImage || obj.Attributes.Icon != nil {
obj.LabelPosition = go2.Pointer(string(label.OutsideTopCenter))
} else {
obj.LabelPosition = go2.Pointer(string(label.InsideMiddleCenter))
diff --git a/e2etests/stable_test.go b/e2etests/stable_test.go
index 2b3451fb9..306838bd4 100644
--- a/e2etests/stable_test.go
+++ b/e2etests/stable_test.go
@@ -1222,7 +1222,7 @@ foo baz -> hello
script: `shape: sequence_diagram
a: "a label" {
- shape: callout
+ shape: callout
}
b: "b\nlabels" {
shape: circle
@@ -1233,7 +1233,7 @@ c: "a class" {
-private() int
}
d: "cloudyyyy" {
- shape: cloud
+ shape: cloud
}
e: |go
a := 5
@@ -1241,47 +1241,47 @@ e: |go
fmt.Printf("%d", b)
|
f: "cyl" {
- shape: cylinder
+ shape: cylinder
}
g: "dia" {
- shape: diamond
+ shape: diamond
}
h: "docs" {
- shape: document
+ shape: document
}
i: "six corners" {
- shape: hexagon
+ shape: hexagon
}
j: "a random icon" {
shape: image
icon: https://icons.terrastruct.com/essentials/004-picture.svg
}
k: "over" {
- shape: oval
+ shape: oval
}
l: "pack" {
- shape: package
+ shape: package
}
m: "docs page" {
- shape: page
+ shape: page
}
n: "too\nhard\to say" {
- shape: parallelogram
+ shape: parallelogram
}
o: "single\nperson" {
- shape: person
+ shape: person
}
p: "a queue" {
- shape: queue
+ shape: queue
}
q: "a square" {
- shape: square
+ shape: square
}
r: "a step at a time" {
- shape: step
+ shape: step
}
s: "data" {
- shape: stored_data
+ shape: stored_data
}
t: "users" {
@@ -1324,6 +1324,14 @@ s -> t`,
script: `x -> x -> x -> y
z -> y
z -> z: hello
+`,
+ },
+ {
+ name: "icon-label",
+ script: `ww: {
+ label: hello
+ icon: https://icons.terrastruct.com/essentials/time.svg
+}
`,
},
}
diff --git a/e2etests/testdata/stable/icon-label/dagre/board.exp.json b/e2etests/testdata/stable/icon-label/dagre/board.exp.json
new file mode 100644
index 000000000..904236370
--- /dev/null
+++ b/e2etests/testdata/stable/icon-label/dagre/board.exp.json
@@ -0,0 +1,56 @@
+{
+ "name": "",
+ "shapes": [
+ {
+ "id": "ww",
+ "type": "",
+ "pos": {
+ "x": 0,
+ "y": 0
+ },
+ "width": 140,
+ "height": 126,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "#F7F8FE",
+ "stroke": "#0D32B2",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "tooltip": "",
+ "link": "",
+ "icon": {
+ "Scheme": "https",
+ "Opaque": "",
+ "User": null,
+ "Host": "icons.terrastruct.com",
+ "Path": "/essentials/time.svg",
+ "RawPath": "",
+ "ForceQuery": false,
+ "RawQuery": "",
+ "Fragment": "",
+ "RawFragment": ""
+ },
+ "iconPosition": "INSIDE_MIDDLE_CENTER",
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "hello",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "#0A0F25",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 40,
+ "labelHeight": 26,
+ "labelPosition": "OUTSIDE_TOP_CENTER",
+ "zIndex": 0,
+ "level": 1
+ }
+ ],
+ "connections": []
+}
diff --git a/e2etests/testdata/stable/icon-label/dagre/sketch.exp.svg b/e2etests/testdata/stable/icon-label/dagre/sketch.exp.svg
new file mode 100644
index 000000000..8c106d59b
--- /dev/null
+++ b/e2etests/testdata/stable/icon-label/dagre/sketch.exp.svg
@@ -0,0 +1,24 @@
+
+
\ No newline at end of file
diff --git a/e2etests/testdata/stable/icon-label/elk/board.exp.json b/e2etests/testdata/stable/icon-label/elk/board.exp.json
new file mode 100644
index 000000000..69239466c
--- /dev/null
+++ b/e2etests/testdata/stable/icon-label/elk/board.exp.json
@@ -0,0 +1,56 @@
+{
+ "name": "",
+ "shapes": [
+ {
+ "id": "ww",
+ "type": "",
+ "pos": {
+ "x": 12,
+ "y": 12
+ },
+ "width": 140,
+ "height": 126,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "#F7F8FE",
+ "stroke": "#0D32B2",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "tooltip": "",
+ "link": "",
+ "icon": {
+ "Scheme": "https",
+ "Opaque": "",
+ "User": null,
+ "Host": "icons.terrastruct.com",
+ "Path": "/essentials/time.svg",
+ "RawPath": "",
+ "ForceQuery": false,
+ "RawQuery": "",
+ "Fragment": "",
+ "RawFragment": ""
+ },
+ "iconPosition": "INSIDE_MIDDLE_CENTER",
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "hello",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "#0A0F25",
+ "italic": false,
+ "bold": true,
+ "underline": false,
+ "labelWidth": 40,
+ "labelHeight": 26,
+ "labelPosition": "OUTSIDE_TOP_CENTER",
+ "zIndex": 0,
+ "level": 1
+ }
+ ],
+ "connections": []
+}
diff --git a/e2etests/testdata/stable/icon-label/elk/sketch.exp.svg b/e2etests/testdata/stable/icon-label/elk/sketch.exp.svg
new file mode 100644
index 000000000..666ab0135
--- /dev/null
+++ b/e2etests/testdata/stable/icon-label/elk/sketch.exp.svg
@@ -0,0 +1,24 @@
+
+
\ No newline at end of file
diff --git a/e2etests/testdata/stable/investigate/dagre/board.exp.json b/e2etests/testdata/stable/investigate/dagre/board.exp.json
index d175c156a..7867b18b2 100644
--- a/e2etests/testdata/stable/investigate/dagre/board.exp.json
+++ b/e2etests/testdata/stable/investigate/dagre/board.exp.json
@@ -476,7 +476,7 @@
"underline": false,
"labelWidth": 31,
"labelHeight": 26,
- "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "labelPosition": "OUTSIDE_TOP_CENTER",
"zIndex": 0,
"level": 1
},
@@ -565,7 +565,7 @@
"underline": false,
"labelWidth": 20,
"labelHeight": 26,
- "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "labelPosition": "OUTSIDE_TOP_CENTER",
"zIndex": 0,
"level": 2
},
diff --git a/e2etests/testdata/stable/investigate/dagre/sketch.exp.svg b/e2etests/testdata/stable/investigate/dagre/sketch.exp.svg
index 28f10d6c7..1fa552280 100644
--- a/e2etests/testdata/stable/investigate/dagre/sketch.exp.svg
+++ b/e2etests/testdata/stable/investigate/dagre/sketch.exp.svg
@@ -14,7 +14,7 @@ width="1011" height="4426" viewBox="-100 -100 1011 4426">aabbccddllffwwyyadnniijjkkssuurmeemmmmgghhzzooppqqrrttvvxxabac
+aabbccddllffwwyyadnniijjkkssuurmeemmmmgghhzzooppqqrrttvvxxabac
1
diff --git a/e2etests/testdata/stable/investigate/elk/board.exp.json b/e2etests/testdata/stable/investigate/elk/board.exp.json
index f01c5d9b1..a037d9fbe 100644
--- a/e2etests/testdata/stable/investigate/elk/board.exp.json
+++ b/e2etests/testdata/stable/investigate/elk/board.exp.json
@@ -476,7 +476,7 @@
"underline": false,
"labelWidth": 31,
"labelHeight": 26,
- "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "labelPosition": "OUTSIDE_TOP_CENTER",
"zIndex": 0,
"level": 1
},
@@ -565,7 +565,7 @@
"underline": false,
"labelWidth": 20,
"labelHeight": 26,
- "labelPosition": "INSIDE_MIDDLE_CENTER",
+ "labelPosition": "OUTSIDE_TOP_CENTER",
"zIndex": 0,
"level": 2
},
diff --git a/e2etests/testdata/stable/investigate/elk/sketch.exp.svg b/e2etests/testdata/stable/investigate/elk/sketch.exp.svg
index 828f96556..6bf6cda3a 100644
--- a/e2etests/testdata/stable/investigate/elk/sketch.exp.svg
+++ b/e2etests/testdata/stable/investigate/elk/sketch.exp.svg
@@ -14,7 +14,7 @@ width="860" height="4868" viewBox="-82 -88 860 4868">aabbccddllffwwyyadnniijjkkssuurmeemmmmgghhzzooppqqrrttvvxxabac
+aabbccddllffwwyyadnniijjkkssuurmeemmmmgghhzzooppqqrrttvvxxabac
1