diff --git a/d2graph/seqdiagram.go b/d2graph/seqdiagram.go
index 3cd2cf171a..472a1d3ed3 100644
--- a/d2graph/seqdiagram.go
+++ b/d2graph/seqdiagram.go
@@ -1,6 +1,8 @@
package d2graph
-import "oss.terrastruct.com/d2/d2target"
+import (
+ "oss.terrastruct.com/d2/d2target"
+)
func (obj *Object) IsSequenceDiagram() bool {
return obj != nil && obj.Shape.Value == d2target.ShapeSequenceDiagram
diff --git a/d2layouts/d2sequence/sequence_diagram.go b/d2layouts/d2sequence/sequence_diagram.go
index e5ec4d4d72..4b85cbe131 100644
--- a/d2layouts/d2sequence/sequence_diagram.go
+++ b/d2layouts/d2sequence/sequence_diagram.go
@@ -1,9 +1,11 @@
package d2sequence
import (
+ "cmp"
"errors"
"fmt"
"math"
+ "slices"
"sort"
"strconv"
"strings"
@@ -76,6 +78,13 @@ func newSequenceDiagram(objects []*d2graph.Object, messages []*d2graph.Edge) (*s
var actors []*d2graph.Object
var groups []*d2graph.Object
+ slices.SortFunc(objects, func(a, b *d2graph.Object) int {
+ return cmp.Compare(getObjEarliestLineNum(a), getObjEarliestLineNum(b))
+ })
+ slices.SortFunc(messages, func(a, b *d2graph.Edge) int {
+ return cmp.Compare(getEdgeEarliestLineNum(a), getEdgeEarliestLineNum(b))
+ })
+
for _, obj := range objects {
if obj.IsSequenceDiagramGroup() {
queue := []*d2graph.Object{obj}
diff --git a/e2etests-cli/main_test.go b/e2etests-cli/main_test.go
index d586299121..273112a7fc 100644
--- a/e2etests-cli/main_test.go
+++ b/e2etests-cli/main_test.go
@@ -94,6 +94,30 @@ func TestCLI_E2E(t *testing.T) {
assert.TestdataDir(t, filepath.Join(dir, "layer-link"))
},
},
+ {
+ name: "sequence-layer",
+ run: func(t *testing.T, ctx context.Context, dir string, env *xos.Env) {
+ writeFile(t, dir, "index.d2", `k; layers: { seq: @seq.d2 }`)
+ writeFile(t, dir, "seq.d2", `shape: sequence_diagram
+a: me
+b: github.com/terrastruct/d2
+
+a -> b: issue about a bug
+a."some note about the bug"
+
+if i'm right: {
+ a <- b: fix
+}
+
+if i'm wrong: {
+ a <- b: nah, intended
+}`)
+ err := runTestMain(t, ctx, dir, env, "index.d2")
+ assert.Success(t, err)
+
+ assert.TestdataDir(t, filepath.Join(dir, "index"))
+ },
+ },
{
// Skip the empty base board so the animation doesn't show blank for 1400ms
name: "empty-base",
diff --git a/e2etests-cli/testdata/TestCLI_E2E/sequence-layer/index.exp.svg b/e2etests-cli/testdata/TestCLI_E2E/sequence-layer/index.exp.svg
new file mode 100644
index 0000000000..29a8a55da6
--- /dev/null
+++ b/e2etests-cli/testdata/TestCLI_E2E/sequence-layer/index.exp.svg
@@ -0,0 +1,95 @@
+
diff --git a/e2etests-cli/testdata/TestCLI_E2E/sequence-layer/seq.exp.svg b/e2etests-cli/testdata/TestCLI_E2E/sequence-layer/seq.exp.svg
new file mode 100644
index 0000000000..f8f8b973d1
--- /dev/null
+++ b/e2etests-cli/testdata/TestCLI_E2E/sequence-layer/seq.exp.svg
@@ -0,0 +1,109 @@
+megithub.com/terrastruct/d2if i'm rightif i'm wrong fixnah, intended issue about a bugsome note about the bug
+
+
+
+
+
+
+
+
+
+