diff --git a/d2renderers/d2svg/class.go b/d2renderers/d2svg/class.go
index befe5c47e..af71ac1af 100644
--- a/d2renderers/d2svg/class.go
+++ b/d2renderers/d2svg/class.go
@@ -97,8 +97,8 @@ func visibilityToken(visibility string) string {
}
func drawClass(writer io.Writer, targetShape d2target.Shape) {
- fmt.Fprintf(writer, ``,
- targetShape.Pos.X, targetShape.Pos.Y, targetShape.Width, targetShape.Height)
+ fmt.Fprintf(writer, ``,
+ targetShape.Pos.X, targetShape.Pos.Y, targetShape.Width, targetShape.Height, shapeStyle(targetShape))
box := geo.NewBox(
geo.NewPoint(float64(targetShape.Pos.X), float64(targetShape.Pos.Y)),
diff --git a/d2renderers/d2svg/d2svg.go b/d2renderers/d2svg/d2svg.go
index d8f1bb2d0..4dd6cebe8 100644
--- a/d2renderers/d2svg/d2svg.go
+++ b/d2renderers/d2svg/d2svg.go
@@ -37,6 +37,9 @@ const (
var multipleOffset = geo.NewVector(10, -10)
+//go:embed style.css
+var styleCSS string
+
//go:embed github-markdown.css
var mdCSS string
@@ -446,12 +449,12 @@ func drawConnection(writer io.Writer, connection d2target.Connection, markers ma
}
}
-func renderOval(tl *geo.Point, width, height float64) string {
+func renderOval(tl *geo.Point, width, height float64, style string) string {
rx := width / 2
ry := height / 2
cx := tl.X + rx
cy := tl.Y + ry
- return fmt.Sprintf(``, cx, cy, rx, ry)
+ return fmt.Sprintf(``, cx, cy, rx, ry, style)
}
func defineShadowFilter(writer io.Writer) {
@@ -487,7 +490,7 @@ func drawShape(writer io.Writer, targetShape d2target.Shape) error {
}
}
- fmt.Fprintf(writer, ``, style, shadowAttr)
+ fmt.Fprintf(writer, ``, shadowAttr)
var multipleTL *geo.Point
if targetShape.Multiple {
@@ -503,14 +506,14 @@ func drawShape(writer io.Writer, targetShape d2target.Shape) error {
return nil
case d2target.ShapeOval:
if targetShape.Multiple {
- fmt.Fprint(writer, renderOval(multipleTL, width, height))
+ fmt.Fprint(writer, renderOval(multipleTL, width, height, style))
}
- fmt.Fprint(writer, renderOval(tl, width, height))
+ fmt.Fprint(writer, renderOval(tl, width, height, style))
case d2target.ShapeImage:
- fmt.Fprintf(writer, ``,
+ fmt.Fprintf(writer, ``,
targetShape.Icon.String(),
- targetShape.Pos.X, targetShape.Pos.Y, targetShape.Width, targetShape.Height)
+ targetShape.Pos.X, targetShape.Pos.Y, targetShape.Width, targetShape.Height, style)
// TODO should standardize "" to rectangle
case d2target.ShapeRectangle, "":
@@ -550,11 +553,11 @@ func drawShape(writer io.Writer, targetShape d2target.Shape) error {
strings.Join(rightPolygonPoints, ""), darkerColor)
}
if targetShape.Multiple {
- fmt.Fprintf(writer, ``,
- targetShape.Pos.X+10, targetShape.Pos.Y-10, targetShape.Width, targetShape.Height)
+ fmt.Fprintf(writer, ``,
+ targetShape.Pos.X+10, targetShape.Pos.Y-10, targetShape.Width, targetShape.Height, style)
}
- fmt.Fprintf(writer, ``,
- targetShape.Pos.X, targetShape.Pos.Y, targetShape.Width, targetShape.Height)
+ fmt.Fprintf(writer, ``,
+ targetShape.Pos.X, targetShape.Pos.Y, targetShape.Width, targetShape.Height, style)
case d2target.ShapeText, d2target.ShapeCode:
default:
@@ -566,7 +569,7 @@ func drawShape(writer io.Writer, targetShape d2target.Shape) error {
}
for _, pathData := range s.GetSVGPathData() {
- fmt.Fprintf(writer, ``, pathData)
+ fmt.Fprintf(writer, ``, pathData, style)
}
}
@@ -837,18 +840,11 @@ func Render(diagram *d2target.Diagram) ([]byte, error) {
buf := &bytes.Buffer{}
_, _ = setViewbox(buf, diagram)
- buf.WriteString(``)
+`, styleCSS))
hasMarkdown := false
for _, s := range diagram.Shapes {
diff --git a/d2renderers/d2svg/style.css b/d2renderers/d2svg/style.css
new file mode 100644
index 000000000..f5cffa9cc
--- /dev/null
+++ b/d2renderers/d2svg/style.css
@@ -0,0 +1,8 @@
+.shape {
+ shape-rendering: geometricPrecision;
+ stroke-linejoin: round;
+}
+.connection {
+ stroke-linecap: round;
+ stroke-linejoin: round;
+}
diff --git a/d2renderers/d2svg/table.go b/d2renderers/d2svg/table.go
index de378793e..ce9e79536 100644
--- a/d2renderers/d2svg/table.go
+++ b/d2renderers/d2svg/table.go
@@ -98,8 +98,8 @@ func constraintAbbr(constraint string) string {
}
func drawTable(writer io.Writer, targetShape d2target.Shape) {
- fmt.Fprintf(writer, ``,
- targetShape.Pos.X, targetShape.Pos.Y, targetShape.Width, targetShape.Height)
+ fmt.Fprintf(writer, ``,
+ targetShape.Pos.X, targetShape.Pos.Y, targetShape.Width, targetShape.Height, shapeStyle(targetShape))
box := geo.NewBox(
geo.NewPoint(float64(targetShape.Pos.X), float64(targetShape.Pos.Y)),