thread inlineTheme

This commit is contained in:
Alexander Wang 2024-10-09 12:09:46 -06:00
parent 0e08d35f54
commit 00278b4a62
No known key found for this signature in database
GPG key ID: BE3937D0D52D8927
5 changed files with 125 additions and 118 deletions

View file

@ -95,7 +95,7 @@ func Rect(r *Runner, shape d2target.Shape) (string, error) {
return "", err return "", err
} }
output := "" output := ""
pathEl := d2themes.NewThemableElement("path") pathEl := d2themes.NewThemableElement("path", nil)
pathEl.SetTranslate(float64(shape.Pos.X), float64(shape.Pos.Y)) pathEl.SetTranslate(float64(shape.Pos.X), float64(shape.Pos.Y))
pathEl.Fill, pathEl.Stroke = d2themes.ShapeTheme(shape) pathEl.Fill, pathEl.Stroke = d2themes.ShapeTheme(shape)
pathEl.FillPattern = shape.FillPattern pathEl.FillPattern = shape.FillPattern
@ -106,7 +106,7 @@ func Rect(r *Runner, shape d2target.Shape) (string, error) {
output += pathEl.Render() output += pathEl.Render()
} }
sketchOEl := d2themes.NewThemableElement("rect") sketchOEl := d2themes.NewThemableElement("rect", nil)
sketchOEl.SetTranslate(float64(shape.Pos.X), float64(shape.Pos.Y)) sketchOEl.SetTranslate(float64(shape.Pos.X), float64(shape.Pos.Y))
sketchOEl.Width = float64(shape.Width) sketchOEl.Width = float64(shape.Width)
sketchOEl.Height = float64(shape.Height) sketchOEl.Height = float64(shape.Height)
@ -143,7 +143,7 @@ func DoubleRect(r *Runner, shape d2target.Shape) (string, error) {
output := "" output := ""
pathEl := d2themes.NewThemableElement("path") pathEl := d2themes.NewThemableElement("path", nil)
pathEl.SetTranslate(float64(shape.Pos.X), float64(shape.Pos.Y)) pathEl.SetTranslate(float64(shape.Pos.X), float64(shape.Pos.Y))
pathEl.Fill, pathEl.Stroke = d2themes.ShapeTheme(shape) pathEl.Fill, pathEl.Stroke = d2themes.ShapeTheme(shape)
pathEl.FillPattern = shape.FillPattern pathEl.FillPattern = shape.FillPattern
@ -154,7 +154,7 @@ func DoubleRect(r *Runner, shape d2target.Shape) (string, error) {
output += pathEl.Render() output += pathEl.Render()
} }
pathEl = d2themes.NewThemableElement("path") pathEl = d2themes.NewThemableElement("path", nil)
pathEl.SetTranslate(float64(shape.Pos.X+d2target.INNER_BORDER_OFFSET), float64(shape.Pos.Y+d2target.INNER_BORDER_OFFSET)) pathEl.SetTranslate(float64(shape.Pos.X+d2target.INNER_BORDER_OFFSET), float64(shape.Pos.Y+d2target.INNER_BORDER_OFFSET))
pathEl.Fill, pathEl.Stroke = d2themes.ShapeTheme(shape) pathEl.Fill, pathEl.Stroke = d2themes.ShapeTheme(shape)
// No need for inner to double paint // No need for inner to double paint
@ -166,7 +166,7 @@ func DoubleRect(r *Runner, shape d2target.Shape) (string, error) {
output += pathEl.Render() output += pathEl.Render()
} }
sketchOEl := d2themes.NewThemableElement("rect") sketchOEl := d2themes.NewThemableElement("rect", nil)
sketchOEl.SetTranslate(float64(shape.Pos.X), float64(shape.Pos.Y)) sketchOEl.SetTranslate(float64(shape.Pos.X), float64(shape.Pos.Y))
sketchOEl.Width = float64(shape.Width) sketchOEl.Width = float64(shape.Width)
sketchOEl.Height = float64(shape.Height) sketchOEl.Height = float64(shape.Height)
@ -191,7 +191,7 @@ func Oval(r *Runner, shape d2target.Shape) (string, error) {
return "", err return "", err
} }
output := "" output := ""
pathEl := d2themes.NewThemableElement("path") pathEl := d2themes.NewThemableElement("path", nil)
pathEl.SetTranslate(float64(shape.Pos.X), float64(shape.Pos.Y)) pathEl.SetTranslate(float64(shape.Pos.X), float64(shape.Pos.Y))
pathEl.Fill, pathEl.Stroke = d2themes.ShapeTheme(shape) pathEl.Fill, pathEl.Stroke = d2themes.ShapeTheme(shape)
pathEl.FillPattern = shape.FillPattern pathEl.FillPattern = shape.FillPattern
@ -202,7 +202,7 @@ func Oval(r *Runner, shape d2target.Shape) (string, error) {
output += pathEl.Render() output += pathEl.Render()
} }
soElement := d2themes.NewThemableElement("ellipse") soElement := d2themes.NewThemableElement("ellipse", nil)
soElement.SetTranslate(float64(shape.Pos.X+shape.Width/2), float64(shape.Pos.Y+shape.Height/2)) soElement.SetTranslate(float64(shape.Pos.X+shape.Width/2), float64(shape.Pos.Y+shape.Height/2))
soElement.Rx = float64(shape.Width / 2) soElement.Rx = float64(shape.Width / 2)
soElement.Ry = float64(shape.Height / 2) soElement.Ry = float64(shape.Height / 2)
@ -242,7 +242,7 @@ func DoubleOval(r *Runner, shape d2target.Shape) (string, error) {
output := "" output := ""
pathEl := d2themes.NewThemableElement("path") pathEl := d2themes.NewThemableElement("path", nil)
pathEl.SetTranslate(float64(shape.Pos.X), float64(shape.Pos.Y)) pathEl.SetTranslate(float64(shape.Pos.X), float64(shape.Pos.Y))
pathEl.Fill, pathEl.Stroke = d2themes.ShapeTheme(shape) pathEl.Fill, pathEl.Stroke = d2themes.ShapeTheme(shape)
pathEl.FillPattern = shape.FillPattern pathEl.FillPattern = shape.FillPattern
@ -253,7 +253,7 @@ func DoubleOval(r *Runner, shape d2target.Shape) (string, error) {
output += pathEl.Render() output += pathEl.Render()
} }
pathEl = d2themes.NewThemableElement("path") pathEl = d2themes.NewThemableElement("path", nil)
pathEl.SetTranslate(float64(shape.Pos.X), float64(shape.Pos.Y)) pathEl.SetTranslate(float64(shape.Pos.X), float64(shape.Pos.Y))
pathEl.Fill, pathEl.Stroke = d2themes.ShapeTheme(shape) pathEl.Fill, pathEl.Stroke = d2themes.ShapeTheme(shape)
// No need for inner to double paint // No need for inner to double paint
@ -264,7 +264,7 @@ func DoubleOval(r *Runner, shape d2target.Shape) (string, error) {
pathEl.D = p pathEl.D = p
output += pathEl.Render() output += pathEl.Render()
} }
soElement := d2themes.NewThemableElement("ellipse") soElement := d2themes.NewThemableElement("ellipse", nil)
soElement.SetTranslate(float64(shape.Pos.X+shape.Width/2), float64(shape.Pos.Y+shape.Height/2)) soElement.SetTranslate(float64(shape.Pos.X+shape.Width/2), float64(shape.Pos.Y+shape.Height/2))
soElement.Rx = float64(shape.Width / 2) soElement.Rx = float64(shape.Width / 2)
soElement.Ry = float64(shape.Height / 2) soElement.Ry = float64(shape.Height / 2)
@ -294,7 +294,7 @@ func Paths(r *Runner, shape d2target.Shape, paths []string) (string, error) {
if err != nil { if err != nil {
return "", err return "", err
} }
pathEl := d2themes.NewThemableElement("path") pathEl := d2themes.NewThemableElement("path", nil)
pathEl.Fill, pathEl.Stroke = d2themes.ShapeTheme(shape) pathEl.Fill, pathEl.Stroke = d2themes.ShapeTheme(shape)
pathEl.FillPattern = shape.FillPattern pathEl.FillPattern = shape.FillPattern
pathEl.ClassName = "shape" pathEl.ClassName = "shape"
@ -304,7 +304,7 @@ func Paths(r *Runner, shape d2target.Shape, paths []string) (string, error) {
output += pathEl.Render() output += pathEl.Render()
} }
soElement := d2themes.NewThemableElement("path") soElement := d2themes.NewThemableElement("path", nil)
for _, p := range sketchPaths { for _, p := range sketchPaths {
soElement.D = p soElement.D = p
renderedSO, err := d2themes.NewThemableSketchOverlay( renderedSO, err := d2themes.NewThemableSketchOverlay(
@ -336,7 +336,7 @@ func Connection(r *Runner, connection d2target.Connection, path, attrs string) (
return "", err return "", err
} }
pathEl1 := d2themes.NewThemableElement("path") pathEl1 := d2themes.NewThemableElement("path", nil)
pathEl1.D = path1 pathEl1.D = path1
pathEl1.Fill = color.None pathEl1.Fill = color.None
pathEl1.Stroke = connection.Stroke pathEl1.Stroke = connection.Stroke
@ -345,7 +345,7 @@ func Connection(r *Runner, connection d2target.Connection, path, attrs string) (
pathEl1.Style += "animation-direction: reverse;" pathEl1.Style += "animation-direction: reverse;"
pathEl1.Attributes = attrs pathEl1.Attributes = attrs
pathEl2 := d2themes.NewThemableElement("path") pathEl2 := d2themes.NewThemableElement("path", nil)
pathEl2.D = path2 pathEl2.D = path2
pathEl2.Fill = color.None pathEl2.Fill = color.None
pathEl2.Stroke = connection.Stroke pathEl2.Stroke = connection.Stroke
@ -354,7 +354,7 @@ func Connection(r *Runner, connection d2target.Connection, path, attrs string) (
pathEl2.Attributes = attrs pathEl2.Attributes = attrs
return pathEl1.Render() + " " + pathEl2.Render(), nil return pathEl1.Render() + " " + pathEl2.Render(), nil
} else { } else {
pathEl := d2themes.NewThemableElement("path") pathEl := d2themes.NewThemableElement("path", nil)
pathEl.D = path pathEl.D = path
pathEl.Fill = color.None pathEl.Fill = color.None
pathEl.Stroke = connection.Stroke pathEl.Stroke = connection.Stroke
@ -373,7 +373,7 @@ func Connection(r *Runner, connection d2target.Connection, path, attrs string) (
output := "" output := ""
pathEl := d2themes.NewThemableElement("path") pathEl := d2themes.NewThemableElement("path", nil)
pathEl.Fill = color.None pathEl.Fill = color.None
pathEl.Stroke = connection.Stroke pathEl.Stroke = connection.Stroke
pathEl.ClassName = fmt.Sprintf("connection%s", animatedClass) pathEl.ClassName = fmt.Sprintf("connection%s", animatedClass)
@ -400,7 +400,7 @@ func Table(r *Runner, shape d2target.Shape) (string, error) {
if err != nil { if err != nil {
return "", err return "", err
} }
pathEl := d2themes.NewThemableElement("path") pathEl := d2themes.NewThemableElement("path", nil)
pathEl.SetTranslate(float64(shape.Pos.X), float64(shape.Pos.Y)) pathEl.SetTranslate(float64(shape.Pos.X), float64(shape.Pos.Y))
pathEl.Fill, pathEl.Stroke = d2themes.ShapeTheme(shape) pathEl.Fill, pathEl.Stroke = d2themes.ShapeTheme(shape)
pathEl.FillPattern = shape.FillPattern pathEl.FillPattern = shape.FillPattern
@ -427,7 +427,7 @@ func Table(r *Runner, shape d2target.Shape) (string, error) {
if err != nil { if err != nil {
return "", err return "", err
} }
pathEl = d2themes.NewThemableElement("path") pathEl = d2themes.NewThemableElement("path", nil)
pathEl.SetTranslate(float64(shape.Pos.X), float64(shape.Pos.Y)) pathEl.SetTranslate(float64(shape.Pos.X), float64(shape.Pos.Y))
pathEl.Fill = shape.Fill pathEl.Fill = shape.Fill
pathEl.FillPattern = shape.FillPattern pathEl.FillPattern = shape.FillPattern
@ -445,7 +445,7 @@ func Table(r *Runner, shape d2target.Shape) (string, error) {
float64(shape.LabelHeight), float64(shape.LabelHeight),
) )
textEl := d2themes.NewThemableElement("text") textEl := d2themes.NewThemableElement("text", nil)
textEl.X = tl.X textEl.X = tl.X
textEl.Y = tl.Y + float64(shape.LabelHeight)*3/4 textEl.Y = tl.Y + float64(shape.LabelHeight)*3/4
textEl.Fill = shape.GetFontColor() textEl.Fill = shape.GetFontColor()
@ -478,7 +478,7 @@ func Table(r *Runner, shape d2target.Shape) (string, error) {
float64(shape.FontSize), float64(shape.FontSize),
) )
textEl := d2themes.NewThemableElement("text") textEl := d2themes.NewThemableElement("text", nil)
textEl.X = nameTL.X textEl.X = nameTL.X
textEl.Y = nameTL.Y + float64(shape.FontSize)*3/4 textEl.Y = nameTL.Y + float64(shape.FontSize)*3/4
textEl.Fill = shape.PrimaryAccentColor textEl.Fill = shape.PrimaryAccentColor
@ -508,7 +508,7 @@ func Table(r *Runner, shape d2target.Shape) (string, error) {
if err != nil { if err != nil {
return "", err return "", err
} }
pathEl := d2themes.NewThemableElement("path") pathEl := d2themes.NewThemableElement("path", nil)
pathEl.Fill = shape.Fill pathEl.Fill = shape.Fill
pathEl.FillPattern = shape.FillPattern pathEl.FillPattern = shape.FillPattern
for _, p := range paths { for _, p := range paths {
@ -517,7 +517,7 @@ func Table(r *Runner, shape d2target.Shape) (string, error) {
} }
} }
sketchOEl := d2themes.NewThemableElement("rect") sketchOEl := d2themes.NewThemableElement("rect", nil)
sketchOEl.SetTranslate(float64(shape.Pos.X), float64(shape.Pos.Y)) sketchOEl.SetTranslate(float64(shape.Pos.X), float64(shape.Pos.Y))
sketchOEl.Width = float64(shape.Width) sketchOEl.Width = float64(shape.Width)
sketchOEl.Height = float64(shape.Height) sketchOEl.Height = float64(shape.Height)
@ -542,7 +542,7 @@ func Class(r *Runner, shape d2target.Shape) (string, error) {
if err != nil { if err != nil {
return "", err return "", err
} }
pathEl := d2themes.NewThemableElement("path") pathEl := d2themes.NewThemableElement("path", nil)
pathEl.SetTranslate(float64(shape.Pos.X), float64(shape.Pos.Y)) pathEl.SetTranslate(float64(shape.Pos.X), float64(shape.Pos.Y))
pathEl.Fill, pathEl.Stroke = d2themes.ShapeTheme(shape) pathEl.Fill, pathEl.Stroke = d2themes.ShapeTheme(shape)
pathEl.FillPattern = shape.FillPattern pathEl.FillPattern = shape.FillPattern
@ -570,7 +570,7 @@ func Class(r *Runner, shape d2target.Shape) (string, error) {
if err != nil { if err != nil {
return "", err return "", err
} }
pathEl = d2themes.NewThemableElement("path") pathEl = d2themes.NewThemableElement("path", nil)
pathEl.SetTranslate(float64(shape.Pos.X), float64(shape.Pos.Y)) pathEl.SetTranslate(float64(shape.Pos.X), float64(shape.Pos.Y))
pathEl.Fill = shape.Fill pathEl.Fill = shape.Fill
pathEl.FillPattern = shape.FillPattern pathEl.FillPattern = shape.FillPattern
@ -580,7 +580,7 @@ func Class(r *Runner, shape d2target.Shape) (string, error) {
output += pathEl.Render() output += pathEl.Render()
} }
sketchOEl := d2themes.NewThemableElement("rect") sketchOEl := d2themes.NewThemableElement("rect", nil)
sketchOEl.SetTranslate(float64(shape.Pos.X), float64(shape.Pos.Y)) sketchOEl.SetTranslate(float64(shape.Pos.X), float64(shape.Pos.Y))
sketchOEl.Width = float64(shape.Width) sketchOEl.Width = float64(shape.Width)
sketchOEl.Height = headerBox.Height sketchOEl.Height = headerBox.Height
@ -598,7 +598,7 @@ func Class(r *Runner, shape d2target.Shape) (string, error) {
float64(shape.LabelHeight), float64(shape.LabelHeight),
) )
textEl := d2themes.NewThemableElement("text") textEl := d2themes.NewThemableElement("text", nil)
textEl.X = tl.X + float64(shape.LabelWidth)/2 textEl.X = tl.X + float64(shape.LabelWidth)/2
textEl.Y = tl.Y + float64(shape.LabelHeight)*3/4 textEl.Y = tl.Y + float64(shape.LabelHeight)*3/4
textEl.Fill = shape.GetFontColor() textEl.Fill = shape.GetFontColor()
@ -625,7 +625,7 @@ func Class(r *Runner, shape d2target.Shape) (string, error) {
if err != nil { if err != nil {
return "", err return "", err
} }
pathEl = d2themes.NewThemableElement("path") pathEl = d2themes.NewThemableElement("path", nil)
pathEl.Fill = shape.Fill pathEl.Fill = shape.Fill
pathEl.FillPattern = shape.FillPattern pathEl.FillPattern = shape.FillPattern
pathEl.ClassName = "class_header" pathEl.ClassName = "class_header"
@ -657,7 +657,7 @@ func classRow(shape d2target.Shape, box *geo.Box, prefix, nameText, typeText str
fontSize, fontSize,
) )
textEl := d2themes.NewThemableElement("text") textEl := d2themes.NewThemableElement("text", nil)
textEl.X = prefixTL.X textEl.X = prefixTL.X
textEl.Y = prefixTL.Y + fontSize*3/4 textEl.Y = prefixTL.Y + fontSize*3/4
textEl.Fill = shape.PrimaryAccentColor textEl.Fill = shape.PrimaryAccentColor
@ -883,7 +883,7 @@ func Arrowheads(r *Runner, connection d2target.Connection, srcAdj, dstAdj *geo.P
roughPaths = append(roughPaths, extraPaths...) roughPaths = append(roughPaths, extraPaths...)
} }
pathEl := d2themes.NewThemableElement("path") pathEl := d2themes.NewThemableElement("path", nil)
pathEl.ClassName = "connection" pathEl.ClassName = "connection"
pathEl.Attributes = transform pathEl.Attributes = transform
for _, rp := range roughPaths { for _, rp := range roughPaths {
@ -922,7 +922,7 @@ func Arrowheads(r *Runner, connection d2target.Connection, srcAdj, dstAdj *geo.P
roughPaths = append(roughPaths, extraPaths...) roughPaths = append(roughPaths, extraPaths...)
} }
pathEl := d2themes.NewThemableElement("path") pathEl := d2themes.NewThemableElement("path", nil)
pathEl.ClassName = "connection" pathEl.ClassName = "connection"
pathEl.Attributes = transform pathEl.Attributes = transform
for _, rp := range roughPaths { for _, rp := range roughPaths {

View file

@ -13,8 +13,8 @@ import (
"oss.terrastruct.com/d2/lib/svg" "oss.terrastruct.com/d2/lib/svg"
) )
func classHeader(diagramHash string, shape d2target.Shape, box *geo.Box, text string, textWidth, textHeight, fontSize float64) string { func classHeader(diagramHash string, shape d2target.Shape, box *geo.Box, text string, textWidth, textHeight, fontSize float64, inlineTheme *d2themes.Theme) string {
rectEl := d2themes.NewThemableElement("rect") rectEl := d2themes.NewThemableElement("rect", inlineTheme)
rectEl.X, rectEl.Y = box.TopLeft.X, box.TopLeft.Y rectEl.X, rectEl.Y = box.TopLeft.X, box.TopLeft.Y
rectEl.Width, rectEl.Height = box.Width, box.Height rectEl.Width, rectEl.Height = box.Width, box.Height
rectEl.Fill = shape.Fill rectEl.Fill = shape.Fill
@ -33,7 +33,7 @@ func classHeader(diagramHash string, shape d2target.Shape, box *geo.Box, text st
textHeight, textHeight,
) )
textEl := d2themes.NewThemableElement("text") textEl := d2themes.NewThemableElement("text", inlineTheme)
textEl.X = tl.X + textWidth/2 textEl.X = tl.X + textWidth/2
textEl.Y = tl.Y + fontSize textEl.Y = tl.Y + fontSize
textEl.Fill = shape.GetFontColor() textEl.Fill = shape.GetFontColor()
@ -47,7 +47,7 @@ func classHeader(diagramHash string, shape d2target.Shape, box *geo.Box, text st
return str return str
} }
func classRow(shape d2target.Shape, box *geo.Box, prefix, nameText, typeText string, fontSize float64) string { func classRow(shape d2target.Shape, box *geo.Box, prefix, nameText, typeText string, fontSize float64, inlineTheme *d2themes.Theme) string {
// Row is made up of prefix, name, and type // Row is made up of prefix, name, and type
// e.g. | + firstName string | // e.g. | + firstName string |
prefixTL := label.InsideMiddleLeft.GetPointOnBox( prefixTL := label.InsideMiddleLeft.GetPointOnBox(
@ -63,7 +63,7 @@ func classRow(shape d2target.Shape, box *geo.Box, prefix, nameText, typeText str
fontSize, fontSize,
) )
textEl := d2themes.NewThemableElement("text") textEl := d2themes.NewThemableElement("text", inlineTheme)
textEl.X = prefixTL.X textEl.X = prefixTL.X
textEl.Y = prefixTL.Y + fontSize*3/4 textEl.Y = prefixTL.Y + fontSize*3/4
textEl.Fill = shape.PrimaryAccentColor textEl.Fill = shape.PrimaryAccentColor
@ -87,8 +87,8 @@ func classRow(shape d2target.Shape, box *geo.Box, prefix, nameText, typeText str
return out return out
} }
func drawClass(writer io.Writer, diagramHash string, targetShape d2target.Shape) { func drawClass(writer io.Writer, diagramHash string, targetShape d2target.Shape, inlineTheme *d2themes.Theme) {
el := d2themes.NewThemableElement("rect") el := d2themes.NewThemableElement("rect", inlineTheme)
el.X = float64(targetShape.Pos.X) el.X = float64(targetShape.Pos.X)
el.Y = float64(targetShape.Pos.Y) el.Y = float64(targetShape.Pos.Y)
el.Width = float64(targetShape.Width) el.Width = float64(targetShape.Width)
@ -111,19 +111,19 @@ func drawClass(writer io.Writer, diagramHash string, targetShape d2target.Shape)
headerBox := geo.NewBox(box.TopLeft, box.Width, math.Max(2*rowHeight, float64(targetShape.LabelHeight)+2*label.PADDING)) headerBox := geo.NewBox(box.TopLeft, box.Width, math.Max(2*rowHeight, float64(targetShape.LabelHeight)+2*label.PADDING))
fmt.Fprint(writer, fmt.Fprint(writer,
classHeader(diagramHash, targetShape, headerBox, targetShape.Label, float64(targetShape.LabelWidth), float64(targetShape.LabelHeight), float64(targetShape.FontSize)), classHeader(diagramHash, targetShape, headerBox, targetShape.Label, float64(targetShape.LabelWidth), float64(targetShape.LabelHeight), float64(targetShape.FontSize), inlineTheme),
) )
rowBox := geo.NewBox(box.TopLeft.Copy(), box.Width, rowHeight) rowBox := geo.NewBox(box.TopLeft.Copy(), box.Width, rowHeight)
rowBox.TopLeft.Y += headerBox.Height rowBox.TopLeft.Y += headerBox.Height
for _, f := range targetShape.Fields { for _, f := range targetShape.Fields {
fmt.Fprint(writer, fmt.Fprint(writer,
classRow(targetShape, rowBox, f.VisibilityToken(), f.Name, f.Type, float64(targetShape.FontSize)), classRow(targetShape, rowBox, f.VisibilityToken(), f.Name, f.Type, float64(targetShape.FontSize), inlineTheme),
) )
rowBox.TopLeft.Y += rowHeight rowBox.TopLeft.Y += rowHeight
} }
lineEl := d2themes.NewThemableElement("line") lineEl := d2themes.NewThemableElement("line", inlineTheme)
if targetShape.BorderRadius != 0 && len(targetShape.Methods) == 0 { if targetShape.BorderRadius != 0 && len(targetShape.Methods) == 0 {
lineEl.X1, lineEl.Y1 = rowBox.TopLeft.X+float64(targetShape.BorderRadius), rowBox.TopLeft.Y lineEl.X1, lineEl.Y1 = rowBox.TopLeft.X+float64(targetShape.BorderRadius), rowBox.TopLeft.Y
@ -139,7 +139,7 @@ func drawClass(writer io.Writer, diagramHash string, targetShape d2target.Shape)
for _, m := range targetShape.Methods { for _, m := range targetShape.Methods {
fmt.Fprint(writer, fmt.Fprint(writer,
classRow(targetShape, rowBox, m.VisibilityToken(), m.Name, m.Return, float64(targetShape.FontSize)), classRow(targetShape, rowBox, m.VisibilityToken(), m.Name, m.Return, float64(targetShape.FontSize), inlineTheme),
) )
rowBox.TopLeft.Y += rowHeight rowBox.TopLeft.Y += rowHeight
} }

View file

@ -35,6 +35,7 @@ import (
"oss.terrastruct.com/d2/lib/svg" "oss.terrastruct.com/d2/lib/svg"
"oss.terrastruct.com/d2/lib/textmeasure" "oss.terrastruct.com/d2/lib/textmeasure"
"oss.terrastruct.com/d2/lib/version" "oss.terrastruct.com/d2/lib/version"
"oss.terrastruct.com/util-go/go2"
) )
const ( const (
@ -109,7 +110,7 @@ func arrowheadMarkerID(isTarget bool, connection d2target.Connection) string {
))) )))
} }
func arrowheadMarker(isTarget bool, id string, connection d2target.Connection) string { func arrowheadMarker(isTarget bool, id string, connection d2target.Connection, inlineTheme *d2themes.Theme) string {
arrowhead := connection.DstArrow arrowhead := connection.DstArrow
if !isTarget { if !isTarget {
arrowhead = connection.SrcArrow arrowhead = connection.SrcArrow
@ -120,7 +121,7 @@ func arrowheadMarker(isTarget bool, id string, connection d2target.Connection) s
var path string var path string
switch arrowhead { switch arrowhead {
case d2target.ArrowArrowhead: case d2target.ArrowArrowhead:
polygonEl := d2themes.NewThemableElement("polygon") polygonEl := d2themes.NewThemableElement("polygon", inlineTheme)
polygonEl.Fill = connection.Stroke polygonEl.Fill = connection.Stroke
polygonEl.ClassName = "connection" polygonEl.ClassName = "connection"
polygonEl.Attributes = fmt.Sprintf(`stroke-width="%d"`, connection.StrokeWidth) polygonEl.Attributes = fmt.Sprintf(`stroke-width="%d"`, connection.StrokeWidth)
@ -142,7 +143,7 @@ func arrowheadMarker(isTarget bool, id string, connection d2target.Connection) s
} }
path = polygonEl.Render() path = polygonEl.Render()
case d2target.UnfilledTriangleArrowhead: case d2target.UnfilledTriangleArrowhead:
polygonEl := d2themes.NewThemableElement("polygon") polygonEl := d2themes.NewThemableElement("polygon", inlineTheme)
polygonEl.Fill = d2target.BG_COLOR polygonEl.Fill = d2target.BG_COLOR
polygonEl.Stroke = connection.Stroke polygonEl.Stroke = connection.Stroke
polygonEl.ClassName = "connection" polygonEl.ClassName = "connection"
@ -165,7 +166,7 @@ func arrowheadMarker(isTarget bool, id string, connection d2target.Connection) s
path = polygonEl.Render() path = polygonEl.Render()
case d2target.TriangleArrowhead: case d2target.TriangleArrowhead:
polygonEl := d2themes.NewThemableElement("polygon") polygonEl := d2themes.NewThemableElement("polygon", inlineTheme)
polygonEl.Fill = connection.Stroke polygonEl.Fill = connection.Stroke
polygonEl.ClassName = "connection" polygonEl.ClassName = "connection"
polygonEl.Attributes = fmt.Sprintf(`stroke-width="%d"`, connection.StrokeWidth) polygonEl.Attributes = fmt.Sprintf(`stroke-width="%d"`, connection.StrokeWidth)
@ -185,7 +186,7 @@ func arrowheadMarker(isTarget bool, id string, connection d2target.Connection) s
} }
path = polygonEl.Render() path = polygonEl.Render()
case d2target.LineArrowhead: case d2target.LineArrowhead:
polylineEl := d2themes.NewThemableElement("polyline") polylineEl := d2themes.NewThemableElement("polyline", inlineTheme)
polylineEl.Fill = color.None polylineEl.Fill = color.None
polylineEl.ClassName = "connection" polylineEl.ClassName = "connection"
polylineEl.Stroke = connection.Stroke polylineEl.Stroke = connection.Stroke
@ -206,7 +207,7 @@ func arrowheadMarker(isTarget bool, id string, connection d2target.Connection) s
} }
path = polylineEl.Render() path = polylineEl.Render()
case d2target.FilledDiamondArrowhead: case d2target.FilledDiamondArrowhead:
polygonEl := d2themes.NewThemableElement("polygon") polygonEl := d2themes.NewThemableElement("polygon", inlineTheme)
polygonEl.ClassName = "connection" polygonEl.ClassName = "connection"
polygonEl.Fill = connection.Stroke polygonEl.Fill = connection.Stroke
polygonEl.Attributes = fmt.Sprintf(`stroke-width="%d"`, connection.StrokeWidth) polygonEl.Attributes = fmt.Sprintf(`stroke-width="%d"`, connection.StrokeWidth)
@ -228,7 +229,7 @@ func arrowheadMarker(isTarget bool, id string, connection d2target.Connection) s
} }
path = polygonEl.Render() path = polygonEl.Render()
case d2target.DiamondArrowhead: case d2target.DiamondArrowhead:
polygonEl := d2themes.NewThemableElement("polygon") polygonEl := d2themes.NewThemableElement("polygon", inlineTheme)
polygonEl.ClassName = "connection" polygonEl.ClassName = "connection"
polygonEl.Fill = d2target.BG_COLOR polygonEl.Fill = d2target.BG_COLOR
polygonEl.Stroke = connection.Stroke polygonEl.Stroke = connection.Stroke
@ -253,7 +254,7 @@ func arrowheadMarker(isTarget bool, id string, connection d2target.Connection) s
case d2target.FilledCircleArrowhead: case d2target.FilledCircleArrowhead:
radius := width / 2 radius := width / 2
circleEl := d2themes.NewThemableElement("circle") circleEl := d2themes.NewThemableElement("circle", inlineTheme)
circleEl.Cy = radius circleEl.Cy = radius
circleEl.R = radius - strokeWidth/2 circleEl.R = radius - strokeWidth/2
circleEl.Fill = connection.Stroke circleEl.Fill = connection.Stroke
@ -270,7 +271,7 @@ func arrowheadMarker(isTarget bool, id string, connection d2target.Connection) s
case d2target.CircleArrowhead: case d2target.CircleArrowhead:
radius := width / 2 radius := width / 2
circleEl := d2themes.NewThemableElement("circle") circleEl := d2themes.NewThemableElement("circle", inlineTheme)
circleEl.Cy = radius circleEl.Cy = radius
circleEl.R = radius - strokeWidth circleEl.R = radius - strokeWidth
circleEl.Fill = d2target.BG_COLOR circleEl.Fill = d2target.BG_COLOR
@ -289,7 +290,7 @@ func arrowheadMarker(isTarget bool, id string, connection d2target.Connection) s
var modifierEl *d2themes.ThemableElement var modifierEl *d2themes.ThemableElement
if arrowhead == d2target.CfOneRequired || arrowhead == d2target.CfManyRequired { if arrowhead == d2target.CfOneRequired || arrowhead == d2target.CfManyRequired {
modifierEl = d2themes.NewThemableElement("path") modifierEl = d2themes.NewThemableElement("path", inlineTheme)
modifierEl.D = fmt.Sprintf("M%f,%f %f,%f", modifierEl.D = fmt.Sprintf("M%f,%f %f,%f",
offset, 0., offset, 0.,
offset, height, offset, height,
@ -299,7 +300,7 @@ func arrowheadMarker(isTarget bool, id string, connection d2target.Connection) s
modifierEl.ClassName = "connection" modifierEl.ClassName = "connection"
modifierEl.Attributes = fmt.Sprintf(`stroke-width="%d"`, connection.StrokeWidth) modifierEl.Attributes = fmt.Sprintf(`stroke-width="%d"`, connection.StrokeWidth)
} else { } else {
modifierEl = d2themes.NewThemableElement("circle") modifierEl = d2themes.NewThemableElement("circle", inlineTheme)
modifierEl.Cx = offset/2.0 + 2.0 modifierEl.Cx = offset/2.0 + 2.0
modifierEl.Cy = height / 2.0 modifierEl.Cy = height / 2.0
modifierEl.R = offset / 2.0 modifierEl.R = offset / 2.0
@ -309,7 +310,7 @@ func arrowheadMarker(isTarget bool, id string, connection d2target.Connection) s
modifierEl.Attributes = fmt.Sprintf(`stroke-width="%d"`, connection.StrokeWidth) modifierEl.Attributes = fmt.Sprintf(`stroke-width="%d"`, connection.StrokeWidth)
} }
childPathEl := d2themes.NewThemableElement("path") childPathEl := d2themes.NewThemableElement("path", inlineTheme)
if arrowhead == d2target.CfMany || arrowhead == d2target.CfManyRequired { if arrowhead == d2target.CfMany || arrowhead == d2target.CfManyRequired {
childPathEl.D = fmt.Sprintf("M%f,%f %f,%f M%f,%f %f,%f M%f,%f %f,%f", childPathEl.D = fmt.Sprintf("M%f,%f %f,%f M%f,%f %f,%f M%f,%f %f,%f",
width-3.0, height/2.0, width-3.0, height/2.0,
@ -328,7 +329,7 @@ func arrowheadMarker(isTarget bool, id string, connection d2target.Connection) s
) )
} }
gEl := d2themes.NewThemableElement("g") gEl := d2themes.NewThemableElement("g", inlineTheme)
if !isTarget { if !isTarget {
gEl.Transform = fmt.Sprintf("scale(-1) translate(-%f, -%f)", width, height) gEl.Transform = fmt.Sprintf("scale(-1) translate(-%f, -%f)", width, height)
} }
@ -495,7 +496,7 @@ func makeLabelMask(labelTL *geo.Point, width, height int, opacity float64) strin
) )
} }
func drawConnection(writer io.Writer, labelMaskID string, connection d2target.Connection, markers map[string]struct{}, idToShape map[string]d2target.Shape, sketchRunner *d2sketch.Runner) (labelMask string, _ error) { func drawConnection(writer io.Writer, labelMaskID string, connection d2target.Connection, markers map[string]struct{}, idToShape map[string]d2target.Shape, sketchRunner *d2sketch.Runner, inlineTheme *d2themes.Theme) (labelMask string, _ error) {
opacityStyle := "" opacityStyle := ""
if connection.Opacity != 1.0 { if connection.Opacity != 1.0 {
opacityStyle = fmt.Sprintf(" style='opacity:%f'", connection.Opacity) opacityStyle = fmt.Sprintf(" style='opacity:%f'", connection.Opacity)
@ -510,7 +511,7 @@ func drawConnection(writer io.Writer, labelMaskID string, connection d2target.Co
if connection.SrcArrow != d2target.NoArrowhead { if connection.SrcArrow != d2target.NoArrowhead {
id := arrowheadMarkerID(false, connection) id := arrowheadMarkerID(false, connection)
if _, in := markers[id]; !in { if _, in := markers[id]; !in {
marker := arrowheadMarker(false, id, connection) marker := arrowheadMarker(false, id, connection, inlineTheme)
if marker == "" { if marker == "" {
panic(fmt.Sprintf("received empty arrow head marker for: %#v", connection)) panic(fmt.Sprintf("received empty arrow head marker for: %#v", connection))
} }
@ -524,7 +525,7 @@ func drawConnection(writer io.Writer, labelMaskID string, connection d2target.Co
if connection.DstArrow != d2target.NoArrowhead { if connection.DstArrow != d2target.NoArrowhead {
id := arrowheadMarkerID(true, connection) id := arrowheadMarkerID(true, connection)
if _, in := markers[id]; !in { if _, in := markers[id]; !in {
marker := arrowheadMarker(true, id, connection) marker := arrowheadMarker(true, id, connection, inlineTheme)
if marker == "" { if marker == "" {
panic(fmt.Sprintf("received empty arrow head marker for: %#v", connection)) panic(fmt.Sprintf("received empty arrow head marker for: %#v", connection))
} }
@ -579,7 +580,7 @@ func drawConnection(writer io.Writer, labelMaskID string, connection d2target.Co
return "", err return "", err
} }
pathEl1 := d2themes.NewThemableElement("path") pathEl1 := d2themes.NewThemableElement("path", inlineTheme)
pathEl1.D = path1 pathEl1.D = path1
pathEl1.Fill = color.None pathEl1.Fill = color.None
pathEl1.Stroke = connection.Stroke pathEl1.Stroke = connection.Stroke
@ -589,7 +590,7 @@ func drawConnection(writer io.Writer, labelMaskID string, connection d2target.Co
pathEl1.Attributes = fmt.Sprintf("%s%s", markerStart, mask) pathEl1.Attributes = fmt.Sprintf("%s%s", markerStart, mask)
fmt.Fprint(writer, pathEl1.Render()) fmt.Fprint(writer, pathEl1.Render())
pathEl2 := d2themes.NewThemableElement("path") pathEl2 := d2themes.NewThemableElement("path", inlineTheme)
pathEl2.D = path2 pathEl2.D = path2
pathEl2.Fill = color.None pathEl2.Fill = color.None
pathEl2.Stroke = connection.Stroke pathEl2.Stroke = connection.Stroke
@ -598,7 +599,7 @@ func drawConnection(writer io.Writer, labelMaskID string, connection d2target.Co
pathEl2.Attributes = fmt.Sprintf("%s%s", markerEnd, mask) pathEl2.Attributes = fmt.Sprintf("%s%s", markerEnd, mask)
fmt.Fprint(writer, pathEl2.Render()) fmt.Fprint(writer, pathEl2.Render())
} else { } else {
pathEl := d2themes.NewThemableElement("path") pathEl := d2themes.NewThemableElement("path", inlineTheme)
pathEl.D = path pathEl.D = path
pathEl.Fill = color.None pathEl.Fill = color.None
pathEl.Stroke = connection.Stroke pathEl.Stroke = connection.Stroke
@ -623,7 +624,7 @@ func drawConnection(writer io.Writer, labelMaskID string, connection d2target.Co
fontClass += " text-underline" fontClass += " text-underline"
} }
if connection.Fill != color.Empty { if connection.Fill != color.Empty {
rectEl := d2themes.NewThemableElement("rect") rectEl := d2themes.NewThemableElement("rect", inlineTheme)
rectEl.Rx = 10 rectEl.Rx = 10
rectEl.X, rectEl.Y = labelTL.X-4, labelTL.Y-3 rectEl.X, rectEl.Y = labelTL.X-4, labelTL.Y-3
rectEl.Width, rectEl.Height = float64(connection.LabelWidth)+8, float64(connection.LabelHeight)+6 rectEl.Width, rectEl.Height = float64(connection.LabelWidth)+8, float64(connection.LabelHeight)+6
@ -631,7 +632,7 @@ func drawConnection(writer io.Writer, labelMaskID string, connection d2target.Co
fmt.Fprint(writer, rectEl.Render()) fmt.Fprint(writer, rectEl.Render())
} }
textEl := d2themes.NewThemableElement("text") textEl := d2themes.NewThemableElement("text", inlineTheme)
textEl.X = labelTL.X + float64(connection.LabelWidth)/2 textEl.X = labelTL.X + float64(connection.LabelWidth)/2
textEl.Y = labelTL.Y + float64(connection.FontSize) textEl.Y = labelTL.Y + float64(connection.FontSize)
textEl.Fill = connection.GetFontColor() textEl.Fill = connection.GetFontColor()
@ -642,16 +643,16 @@ func drawConnection(writer io.Writer, labelMaskID string, connection d2target.Co
} }
if connection.SrcLabel != nil && connection.SrcLabel.Label != "" { if connection.SrcLabel != nil && connection.SrcLabel.Label != "" {
fmt.Fprint(writer, renderArrowheadLabel(connection, connection.SrcLabel.Label, false)) fmt.Fprint(writer, renderArrowheadLabel(connection, connection.SrcLabel.Label, false, inlineTheme))
} }
if connection.DstLabel != nil && connection.DstLabel.Label != "" { if connection.DstLabel != nil && connection.DstLabel.Label != "" {
fmt.Fprint(writer, renderArrowheadLabel(connection, connection.DstLabel.Label, true)) fmt.Fprint(writer, renderArrowheadLabel(connection, connection.DstLabel.Label, true, inlineTheme))
} }
fmt.Fprintf(writer, `</g>`) fmt.Fprintf(writer, `</g>`)
return return
} }
func renderArrowheadLabel(connection d2target.Connection, text string, isDst bool) string { func renderArrowheadLabel(connection d2target.Connection, text string, isDst bool, inlineTheme *d2themes.Theme) string {
var width, height float64 var width, height float64
if isDst { if isDst {
width = float64(connection.DstLabel.LabelWidth) width = float64(connection.DstLabel.LabelWidth)
@ -669,7 +670,7 @@ func renderArrowheadLabel(connection d2target.Connection, text string, isDst boo
Y: labelTL.Y + float64(connection.FontSize), Y: labelTL.Y + float64(connection.FontSize),
} }
textEl := d2themes.NewThemableElement("text") textEl := d2themes.NewThemableElement("text", inlineTheme)
textEl.X = baselineCenter.X textEl.X = baselineCenter.X
textEl.Y = baselineCenter.Y textEl.Y = baselineCenter.Y
textEl.Fill = d2target.FG_COLOR textEl.Fill = d2target.FG_COLOR
@ -688,8 +689,8 @@ func renderArrowheadLabel(connection d2target.Connection, text string, isDst boo
return textEl.Render() return textEl.Render()
} }
func renderOval(tl *geo.Point, width, height float64, fill, fillPattern, stroke, style string) string { func renderOval(tl *geo.Point, width, height float64, fill, fillPattern, stroke, style string, inlineTheme *d2themes.Theme) string {
el := d2themes.NewThemableElement("ellipse") el := d2themes.NewThemableElement("ellipse", inlineTheme)
el.Rx = width / 2 el.Rx = width / 2
el.Ry = height / 2 el.Ry = height / 2
el.Cx = tl.X + el.Rx el.Cx = tl.X + el.Rx
@ -701,9 +702,9 @@ func renderOval(tl *geo.Point, width, height float64, fill, fillPattern, stroke,
return el.Render() return el.Render()
} }
func renderDoubleOval(tl *geo.Point, width, height float64, fill, fillStroke, stroke, style string) string { func renderDoubleOval(tl *geo.Point, width, height float64, fill, fillStroke, stroke, style string, inlineTheme *d2themes.Theme) string {
var innerTL *geo.Point = tl.AddVector(geo.NewVector(d2target.INNER_BORDER_OFFSET, d2target.INNER_BORDER_OFFSET)) var innerTL *geo.Point = tl.AddVector(geo.NewVector(d2target.INNER_BORDER_OFFSET, d2target.INNER_BORDER_OFFSET))
return renderOval(tl, width, height, fill, fillStroke, stroke, style) + renderOval(innerTL, width-10, height-10, fill, "", stroke, style) return renderOval(tl, width, height, fill, fillStroke, stroke, style, inlineTheme) + renderOval(innerTL, width-10, height-10, fill, "", stroke, style, inlineTheme)
} }
func defineGradients(writer io.Writer, cssGradient string) { func defineGradients(writer io.Writer, cssGradient string) {
@ -723,7 +724,7 @@ func defineShadowFilter(writer io.Writer) {
</defs>`) </defs>`)
} }
func render3DRect(targetShape d2target.Shape) string { func render3DRect(targetShape d2target.Shape, inlineTheme *d2themes.Theme) string {
moveTo := func(p d2target.Point) string { moveTo := func(p d2target.Point) string {
return fmt.Sprintf("M%d,%d", p.X+targetShape.Pos.X, p.Y+targetShape.Pos.Y) return fmt.Sprintf("M%d,%d", p.X+targetShape.Pos.X, p.Y+targetShape.Pos.Y)
} }
@ -755,7 +756,7 @@ func render3DRect(targetShape d2target.Shape) string {
borderSegments = append(borderSegments, borderSegments = append(borderSegments,
lineTo(d2target.Point{X: targetShape.Width + d2target.THREE_DEE_OFFSET, Y: -d2target.THREE_DEE_OFFSET}), lineTo(d2target.Point{X: targetShape.Width + d2target.THREE_DEE_OFFSET, Y: -d2target.THREE_DEE_OFFSET}),
) )
border := d2themes.NewThemableElement("path") border := d2themes.NewThemableElement("path", inlineTheme)
border.D = strings.Join(borderSegments, " ") border.D = strings.Join(borderSegments, " ")
border.Fill = color.None border.Fill = color.None
_, borderStroke := d2themes.ShapeTheme(targetShape) _, borderStroke := d2themes.ShapeTheme(targetShape)
@ -778,7 +779,7 @@ func render3DRect(targetShape d2target.Shape) string {
}, "\n") }, "\n")
// render the main rectangle without stroke and the border mask // render the main rectangle without stroke and the border mask
mainShape := d2themes.NewThemableElement("rect") mainShape := d2themes.NewThemableElement("rect", inlineTheme)
mainShape.X = float64(targetShape.Pos.X) mainShape.X = float64(targetShape.Pos.X)
mainShape.Y = float64(targetShape.Pos.Y) mainShape.Y = float64(targetShape.Pos.Y)
mainShape.Width = float64(targetShape.Width) mainShape.Width = float64(targetShape.Width)
@ -809,7 +810,7 @@ func render3DRect(targetShape d2target.Shape) string {
if err != nil { if err != nil {
darkerColor = targetShape.Fill darkerColor = targetShape.Fill
} }
sideShape := d2themes.NewThemableElement("polygon") sideShape := d2themes.NewThemableElement("polygon", inlineTheme)
sideShape.Fill = darkerColor sideShape.Fill = darkerColor
sideShape.Points = strings.Join(sidePoints, " ") sideShape.Points = strings.Join(sidePoints, " ")
sideShape.SetMaskUrl(maskID) sideShape.SetMaskUrl(maskID)
@ -819,7 +820,7 @@ func render3DRect(targetShape d2target.Shape) string {
return borderMask + mainShapeRendered + renderedSides + renderedBorder return borderMask + mainShapeRendered + renderedSides + renderedBorder
} }
func render3DHexagon(targetShape d2target.Shape) string { func render3DHexagon(targetShape d2target.Shape, inlineTheme *d2themes.Theme) string {
moveTo := func(p d2target.Point) string { moveTo := func(p d2target.Point) string {
return fmt.Sprintf("M%d,%d", p.X+targetShape.Pos.X, p.Y+targetShape.Pos.Y) return fmt.Sprintf("M%d,%d", p.X+targetShape.Pos.X, p.Y+targetShape.Pos.Y)
} }
@ -864,7 +865,7 @@ func render3DHexagon(targetShape d2target.Shape) string {
d2target.Point{X: v.X + d2target.THREE_DEE_OFFSET, Y: v.Y - Y_OFFSET}, d2target.Point{X: v.X + d2target.THREE_DEE_OFFSET, Y: v.Y - Y_OFFSET},
)) ))
} }
border := d2themes.NewThemableElement("path") border := d2themes.NewThemableElement("path", inlineTheme)
border.D = strings.Join(borderSegments, " ") border.D = strings.Join(borderSegments, " ")
border.Fill = color.None border.Fill = color.None
_, borderStroke := d2themes.ShapeTheme(targetShape) _, borderStroke := d2themes.ShapeTheme(targetShape)
@ -901,7 +902,7 @@ func render3DHexagon(targetShape d2target.Shape) string {
strings.Join(borderSegments, ""), borderStyle), strings.Join(borderSegments, ""), borderStyle),
}, "\n") }, "\n")
// render the main hexagon without stroke and the border mask // render the main hexagon without stroke and the border mask
mainShape := d2themes.NewThemableElement("polygon") mainShape := d2themes.NewThemableElement("polygon", inlineTheme)
mainShape.X = float64(targetShape.Pos.X) mainShape.X = float64(targetShape.Pos.X)
mainShape.Y = float64(targetShape.Pos.Y) mainShape.Y = float64(targetShape.Pos.Y)
mainShape.Points = mainPointsPoly mainShape.Points = mainPointsPoly
@ -934,7 +935,7 @@ func render3DHexagon(targetShape d2target.Shape) string {
if err != nil { if err != nil {
darkerColor = targetShape.Fill darkerColor = targetShape.Fill
} }
sideShape := d2themes.NewThemableElement("polygon") sideShape := d2themes.NewThemableElement("polygon", inlineTheme)
sideShape.Fill = darkerColor sideShape.Fill = darkerColor
sideShape.Points = strings.Join(sidePoints, " ") sideShape.Points = strings.Join(sidePoints, " ")
sideShape.SetMaskUrl(maskID) sideShape.SetMaskUrl(maskID)
@ -944,7 +945,7 @@ func render3DHexagon(targetShape d2target.Shape) string {
return borderMask + mainShapeRendered + renderedSides + renderedBorder return borderMask + mainShapeRendered + renderedSides + renderedBorder
} }
func drawShape(writer, appendixWriter io.Writer, diagramHash string, targetShape d2target.Shape, sketchRunner *d2sketch.Runner) (labelMask string, err error) { func drawShape(writer, appendixWriter io.Writer, diagramHash string, targetShape d2target.Shape, sketchRunner *d2sketch.Runner, inlineTheme *d2themes.Theme) (labelMask string, err error) {
closingTag := "</g>" closingTag := "</g>"
if targetShape.Link != "" { if targetShape.Link != "" {
@ -1011,7 +1012,7 @@ func drawShape(writer, appendixWriter io.Writer, diagramHash string, targetShape
} }
fmt.Fprint(writer, out) fmt.Fprint(writer, out)
} else { } else {
drawClass(writer, diagramHash, targetShape) drawClass(writer, diagramHash, targetShape, inlineTheme)
} }
addAppendixItems(appendixWriter, targetShape, s) addAppendixItems(appendixWriter, targetShape, s)
fmt.Fprint(writer, `</g>`) fmt.Fprint(writer, `</g>`)
@ -1025,7 +1026,7 @@ func drawShape(writer, appendixWriter io.Writer, diagramHash string, targetShape
} }
fmt.Fprint(writer, out) fmt.Fprint(writer, out)
} else { } else {
drawTable(writer, diagramHash, targetShape) drawTable(writer, diagramHash, targetShape, inlineTheme)
} }
addAppendixItems(appendixWriter, targetShape, s) addAppendixItems(appendixWriter, targetShape, s)
fmt.Fprint(writer, `</g>`) fmt.Fprint(writer, `</g>`)
@ -1034,7 +1035,7 @@ func drawShape(writer, appendixWriter io.Writer, diagramHash string, targetShape
case d2target.ShapeOval: case d2target.ShapeOval:
if targetShape.DoubleBorder { if targetShape.DoubleBorder {
if targetShape.Multiple { if targetShape.Multiple {
fmt.Fprint(writer, renderDoubleOval(multipleTL, width, height, fill, "", stroke, style)) fmt.Fprint(writer, renderDoubleOval(multipleTL, width, height, fill, "", stroke, style, inlineTheme))
} }
if sketchRunner != nil { if sketchRunner != nil {
out, err := d2sketch.DoubleOval(sketchRunner, targetShape) out, err := d2sketch.DoubleOval(sketchRunner, targetShape)
@ -1043,11 +1044,11 @@ func drawShape(writer, appendixWriter io.Writer, diagramHash string, targetShape
} }
fmt.Fprint(writer, out) fmt.Fprint(writer, out)
} else { } else {
fmt.Fprint(writer, renderDoubleOval(tl, width, height, fill, targetShape.FillPattern, stroke, style)) fmt.Fprint(writer, renderDoubleOval(tl, width, height, fill, targetShape.FillPattern, stroke, style, inlineTheme))
} }
} else { } else {
if targetShape.Multiple { if targetShape.Multiple {
fmt.Fprint(writer, renderOval(multipleTL, width, height, fill, "", stroke, style)) fmt.Fprint(writer, renderOval(multipleTL, width, height, fill, "", stroke, style, inlineTheme))
} }
if sketchRunner != nil { if sketchRunner != nil {
out, err := d2sketch.Oval(sketchRunner, targetShape) out, err := d2sketch.Oval(sketchRunner, targetShape)
@ -1056,12 +1057,12 @@ func drawShape(writer, appendixWriter io.Writer, diagramHash string, targetShape
} }
fmt.Fprint(writer, out) fmt.Fprint(writer, out)
} else { } else {
fmt.Fprint(writer, renderOval(tl, width, height, fill, targetShape.FillPattern, stroke, style)) fmt.Fprint(writer, renderOval(tl, width, height, fill, targetShape.FillPattern, stroke, style, inlineTheme))
} }
} }
case d2target.ShapeImage: case d2target.ShapeImage:
el := d2themes.NewThemableElement("image") el := d2themes.NewThemableElement("image", inlineTheme)
el.X = float64(targetShape.Pos.X) el.X = float64(targetShape.Pos.X)
el.Y = float64(targetShape.Pos.Y) el.Y = float64(targetShape.Pos.Y)
el.Width = float64(targetShape.Width) el.Width = float64(targetShape.Width)
@ -1079,11 +1080,11 @@ func drawShape(writer, appendixWriter io.Writer, diagramHash string, targetShape
borderRadius = float64(targetShape.BorderRadius) borderRadius = float64(targetShape.BorderRadius)
} }
if targetShape.ThreeDee { if targetShape.ThreeDee {
fmt.Fprint(writer, render3DRect(targetShape)) fmt.Fprint(writer, render3DRect(targetShape, inlineTheme))
} else { } else {
if !targetShape.DoubleBorder { if !targetShape.DoubleBorder {
if targetShape.Multiple { if targetShape.Multiple {
el := d2themes.NewThemableElement("rect") el := d2themes.NewThemableElement("rect", inlineTheme)
el.X = float64(targetShape.Pos.X + 10) el.X = float64(targetShape.Pos.X + 10)
el.Y = float64(targetShape.Pos.Y - 10) el.Y = float64(targetShape.Pos.Y - 10)
el.Width = float64(targetShape.Width) el.Width = float64(targetShape.Width)
@ -1101,7 +1102,7 @@ func drawShape(writer, appendixWriter io.Writer, diagramHash string, targetShape
} }
fmt.Fprint(writer, out) fmt.Fprint(writer, out)
} else { } else {
el := d2themes.NewThemableElement("rect") el := d2themes.NewThemableElement("rect", inlineTheme)
el.X = float64(targetShape.Pos.X) el.X = float64(targetShape.Pos.X)
el.Y = float64(targetShape.Pos.Y) el.Y = float64(targetShape.Pos.Y)
el.Width = float64(targetShape.Width) el.Width = float64(targetShape.Width)
@ -1115,7 +1116,7 @@ func drawShape(writer, appendixWriter io.Writer, diagramHash string, targetShape
} }
} else { } else {
if targetShape.Multiple { if targetShape.Multiple {
el := d2themes.NewThemableElement("rect") el := d2themes.NewThemableElement("rect", inlineTheme)
el.X = float64(targetShape.Pos.X + 10) el.X = float64(targetShape.Pos.X + 10)
el.Y = float64(targetShape.Pos.Y - 10) el.Y = float64(targetShape.Pos.Y - 10)
el.Width = float64(targetShape.Width) el.Width = float64(targetShape.Width)
@ -1127,7 +1128,7 @@ func drawShape(writer, appendixWriter io.Writer, diagramHash string, targetShape
el.Rx = borderRadius el.Rx = borderRadius
fmt.Fprint(writer, el.Render()) fmt.Fprint(writer, el.Render())
el = d2themes.NewThemableElement("rect") el = d2themes.NewThemableElement("rect", inlineTheme)
el.X = float64(targetShape.Pos.X + 10 + d2target.INNER_BORDER_OFFSET) el.X = float64(targetShape.Pos.X + 10 + d2target.INNER_BORDER_OFFSET)
el.Y = float64(targetShape.Pos.Y - 10 + d2target.INNER_BORDER_OFFSET) el.Y = float64(targetShape.Pos.Y - 10 + d2target.INNER_BORDER_OFFSET)
el.Width = float64(targetShape.Width - 2*d2target.INNER_BORDER_OFFSET) el.Width = float64(targetShape.Width - 2*d2target.INNER_BORDER_OFFSET)
@ -1145,7 +1146,7 @@ func drawShape(writer, appendixWriter io.Writer, diagramHash string, targetShape
} }
fmt.Fprint(writer, out) fmt.Fprint(writer, out)
} else { } else {
el := d2themes.NewThemableElement("rect") el := d2themes.NewThemableElement("rect", inlineTheme)
el.X = float64(targetShape.Pos.X) el.X = float64(targetShape.Pos.X)
el.Y = float64(targetShape.Pos.Y) el.Y = float64(targetShape.Pos.Y)
el.Width = float64(targetShape.Width) el.Width = float64(targetShape.Width)
@ -1157,7 +1158,7 @@ func drawShape(writer, appendixWriter io.Writer, diagramHash string, targetShape
el.Rx = borderRadius el.Rx = borderRadius
fmt.Fprint(writer, el.Render()) fmt.Fprint(writer, el.Render())
el = d2themes.NewThemableElement("rect") el = d2themes.NewThemableElement("rect", inlineTheme)
el.X = float64(targetShape.Pos.X + d2target.INNER_BORDER_OFFSET) el.X = float64(targetShape.Pos.X + d2target.INNER_BORDER_OFFSET)
el.Y = float64(targetShape.Pos.Y + d2target.INNER_BORDER_OFFSET) el.Y = float64(targetShape.Pos.Y + d2target.INNER_BORDER_OFFSET)
el.Width = float64(targetShape.Width - 2*d2target.INNER_BORDER_OFFSET) el.Width = float64(targetShape.Width - 2*d2target.INNER_BORDER_OFFSET)
@ -1172,11 +1173,11 @@ func drawShape(writer, appendixWriter io.Writer, diagramHash string, targetShape
} }
case d2target.ShapeHexagon: case d2target.ShapeHexagon:
if targetShape.ThreeDee { if targetShape.ThreeDee {
fmt.Fprint(writer, render3DHexagon(targetShape)) fmt.Fprint(writer, render3DHexagon(targetShape, inlineTheme))
} else { } else {
if targetShape.Multiple { if targetShape.Multiple {
multiplePathData := shape.NewShape(shapeType, geo.NewBox(multipleTL, width, height)).GetSVGPathData() multiplePathData := shape.NewShape(shapeType, geo.NewBox(multipleTL, width, height)).GetSVGPathData()
el := d2themes.NewThemableElement("path") el := d2themes.NewThemableElement("path", inlineTheme)
el.Fill = fill el.Fill = fill
el.Stroke = stroke el.Stroke = stroke
el.Style = style el.Style = style
@ -1193,7 +1194,7 @@ func drawShape(writer, appendixWriter io.Writer, diagramHash string, targetShape
} }
fmt.Fprint(writer, out) fmt.Fprint(writer, out)
} else { } else {
el := d2themes.NewThemableElement("path") el := d2themes.NewThemableElement("path", inlineTheme)
el.Fill = fill el.Fill = fill
el.FillPattern = targetShape.FillPattern el.FillPattern = targetShape.FillPattern
el.Stroke = stroke el.Stroke = stroke
@ -1208,7 +1209,7 @@ func drawShape(writer, appendixWriter io.Writer, diagramHash string, targetShape
default: default:
if targetShape.Multiple { if targetShape.Multiple {
multiplePathData := shape.NewShape(shapeType, geo.NewBox(multipleTL, width, height)).GetSVGPathData() multiplePathData := shape.NewShape(shapeType, geo.NewBox(multipleTL, width, height)).GetSVGPathData()
el := d2themes.NewThemableElement("path") el := d2themes.NewThemableElement("path", inlineTheme)
el.Fill = fill el.Fill = fill
el.Stroke = stroke el.Stroke = stroke
el.Style = style el.Style = style
@ -1225,7 +1226,7 @@ func drawShape(writer, appendixWriter io.Writer, diagramHash string, targetShape
} }
fmt.Fprint(writer, out) fmt.Fprint(writer, out)
} else { } else {
el := d2themes.NewThemableElement("path") el := d2themes.NewThemableElement("path", inlineTheme)
el.Fill = fill el.Fill = fill
el.FillPattern = targetShape.FillPattern el.FillPattern = targetShape.FillPattern
el.Stroke = stroke el.Stroke = stroke
@ -1239,7 +1240,7 @@ func drawShape(writer, appendixWriter io.Writer, diagramHash string, targetShape
// // to examine shape's innerBox // // to examine shape's innerBox
// innerBox := s.GetInnerBox() // innerBox := s.GetInnerBox()
// el := d2themes.NewThemableElement("rect") // el := d2themes.NewThemableElement("rect", inlineTheme)
// el.X = float64(innerBox.TopLeft.X) // el.X = float64(innerBox.TopLeft.X)
// el.Y = float64(innerBox.TopLeft.Y) // el.Y = float64(innerBox.TopLeft.Y)
// el.Width = float64(innerBox.Width) // el.Width = float64(innerBox.Width)
@ -1347,7 +1348,7 @@ func drawShape(writer, appendixWriter io.Writer, diagramHash string, targetShape
fmt.Fprintf(writer, `<g transform="translate(%f %f)" class="%s"%s>`, fmt.Fprintf(writer, `<g transform="translate(%f %f)" class="%s"%s>`,
box.TopLeft.X, box.TopLeft.Y, class, fontSize, box.TopLeft.X, box.TopLeft.Y, class, fontSize,
) )
rectEl := d2themes.NewThemableElement("rect") rectEl := d2themes.NewThemableElement("rect", inlineTheme)
rectEl.Width = float64(targetShape.Width) rectEl.Width = float64(targetShape.Width)
rectEl.Height = float64(targetShape.Height) rectEl.Height = float64(targetShape.Height)
rectEl.Stroke = targetShape.Stroke rectEl.Stroke = targetShape.Stroke
@ -1381,7 +1382,7 @@ func drawShape(writer, appendixWriter io.Writer, diagramHash string, targetShape
if err != nil { if err != nil {
return labelMask, err return labelMask, err
} }
gEl := d2themes.NewThemableElement("g") gEl := d2themes.NewThemableElement("g", inlineTheme)
gEl.SetTranslate(float64(box.TopLeft.X), float64(box.TopLeft.Y)) gEl.SetTranslate(float64(box.TopLeft.X), float64(box.TopLeft.Y))
gEl.Color = targetShape.Stroke gEl.Color = targetShape.Stroke
gEl.Content = render gEl.Content = render
@ -1397,7 +1398,7 @@ func drawShape(writer, appendixWriter io.Writer, diagramHash string, targetShape
// we need the self closing form in this svg/xhtml context // we need the self closing form in this svg/xhtml context
render = strings.ReplaceAll(render, "<hr>", "<hr />") render = strings.ReplaceAll(render, "<hr>", "<hr />")
mdEl := d2themes.NewThemableElement("div") mdEl := d2themes.NewThemableElement("div", inlineTheme)
mdEl.ClassName = "md" mdEl.ClassName = "md"
mdEl.Content = render mdEl.Content = render
@ -1420,7 +1421,7 @@ func drawShape(writer, appendixWriter io.Writer, diagramHash string, targetShape
fmt.Fprint(writer, `</foreignObject></g>`) fmt.Fprint(writer, `</foreignObject></g>`)
} else { } else {
if targetShape.LabelFill != "" { if targetShape.LabelFill != "" {
rectEl := d2themes.NewThemableElement("rect") rectEl := d2themes.NewThemableElement("rect", inlineTheme)
rectEl.X = labelTL.X rectEl.X = labelTL.X
rectEl.Y = labelTL.Y rectEl.Y = labelTL.Y
rectEl.Width = float64(targetShape.LabelWidth) rectEl.Width = float64(targetShape.LabelWidth)
@ -1428,7 +1429,7 @@ func drawShape(writer, appendixWriter io.Writer, diagramHash string, targetShape
rectEl.Fill = targetShape.LabelFill rectEl.Fill = targetShape.LabelFill
fmt.Fprint(writer, rectEl.Render()) fmt.Fprint(writer, rectEl.Render())
} }
textEl := d2themes.NewThemableElement("text") textEl := d2themes.NewThemableElement("text", inlineTheme)
textEl.X = labelTL.X + float64(targetShape.LabelWidth)/2 textEl.X = labelTL.X + float64(targetShape.LabelWidth)/2
// text is vertically positioned at its baseline which is at labelTL+FontSize // text is vertically positioned at its baseline which is at labelTL+FontSize
textEl.Y = labelTL.Y + float64(targetShape.FontSize) textEl.Y = labelTL.Y + float64(targetShape.FontSize)
@ -1881,9 +1882,15 @@ func Render(diagram *d2target.Diagram, opts *RenderOpts) ([]byte, error) {
var labelMasks []string var labelMasks []string
markers := map[string]struct{}{} markers := map[string]struct{}{}
// We only want to inline when no dark theme is specified, otherwise the inline style will override the CSS
var inlineTheme *d2themes.Theme
if darkThemeID != nil {
inlineTheme = go2.Pointer(d2themescatalog.Find(themeID))
inlineTheme.ApplyOverrides(opts.ThemeOverrides)
}
for _, obj := range allObjects { for _, obj := range allObjects {
if c, is := obj.(d2target.Connection); is { if c, is := obj.(d2target.Connection); is {
labelMask, err := drawConnection(buf, isolatedDiagramHash, c, markers, idToShape, sketchRunner) labelMask, err := drawConnection(buf, isolatedDiagramHash, c, markers, idToShape, sketchRunner, inlineTheme)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -1891,7 +1898,7 @@ func Render(diagram *d2target.Diagram, opts *RenderOpts) ([]byte, error) {
labelMasks = append(labelMasks, labelMask) labelMasks = append(labelMasks, labelMask)
} }
} else if s, is := obj.(d2target.Shape); is { } else if s, is := obj.(d2target.Shape); is {
labelMask, err := drawShape(buf, appendixItemBuf, diagramHash, s, sketchRunner) labelMask, err := drawShape(buf, appendixItemBuf, diagramHash, s, sketchRunner, inlineTheme)
if err != nil { if err != nil {
return nil, err return nil, err
} else if labelMask != "" { } else if labelMask != "" {
@ -1955,7 +1962,7 @@ func Render(diagram *d2target.Diagram, opts *RenderOpts) ([]byte, error) {
top -= int(math.Ceil(float64(diagram.Root.StrokeWidth) / 2.)) top -= int(math.Ceil(float64(diagram.Root.StrokeWidth) / 2.))
w += int(math.Ceil(float64(diagram.Root.StrokeWidth)/2.) * 2.) w += int(math.Ceil(float64(diagram.Root.StrokeWidth)/2.) * 2.)
h += int(math.Ceil(float64(diagram.Root.StrokeWidth)/2.) * 2.) h += int(math.Ceil(float64(diagram.Root.StrokeWidth)/2.) * 2.)
backgroundEl := d2themes.NewThemableElement("rect") backgroundEl := d2themes.NewThemableElement("rect", inlineTheme)
// We don't want to change the document viewbox, only the background el // We don't want to change the document viewbox, only the background el
backgroundEl.X = float64(left) backgroundEl.X = float64(left)
backgroundEl.Y = float64(top) backgroundEl.Y = float64(top)

View file

@ -41,8 +41,8 @@ func clipPathForBorderRadius(diagramHash string, shape d2target.Shape) string {
return out + `fill="none" /> </clipPath>` return out + `fill="none" /> </clipPath>`
} }
func tableHeader(diagramHash string, shape d2target.Shape, box *geo.Box, text string, textWidth, textHeight, fontSize float64) string { func tableHeader(diagramHash string, shape d2target.Shape, box *geo.Box, text string, textWidth, textHeight, fontSize float64, inlineTheme *d2themes.Theme) string {
rectEl := d2themes.NewThemableElement("rect") rectEl := d2themes.NewThemableElement("rect", inlineTheme)
rectEl.X, rectEl.Y = box.TopLeft.X, box.TopLeft.Y rectEl.X, rectEl.Y = box.TopLeft.X, box.TopLeft.Y
rectEl.Width, rectEl.Height = box.Width, box.Height rectEl.Width, rectEl.Height = box.Width, box.Height
rectEl.Fill = shape.Fill rectEl.Fill = shape.Fill
@ -61,7 +61,7 @@ func tableHeader(diagramHash string, shape d2target.Shape, box *geo.Box, text st
textHeight, textHeight,
) )
textEl := d2themes.NewThemableElement("text") textEl := d2themes.NewThemableElement("text", inlineTheme)
textEl.X = tl.X textEl.X = tl.X
textEl.Y = tl.Y + textHeight*3/4 textEl.Y = tl.Y + textHeight*3/4
textEl.Fill = shape.GetFontColor() textEl.Fill = shape.GetFontColor()
@ -75,7 +75,7 @@ func tableHeader(diagramHash string, shape d2target.Shape, box *geo.Box, text st
return str return str
} }
func tableRow(shape d2target.Shape, box *geo.Box, nameText, typeText, constraintText string, fontSize, longestNameWidth, longestTypeWidth float64) string { func tableRow(shape d2target.Shape, box *geo.Box, nameText, typeText, constraintText string, fontSize, longestNameWidth, longestTypeWidth float64, inlineTheme *d2themes.Theme) string {
// Row is made up of name, type, and constraint // Row is made up of name, type, and constraint
// e.g. | diagram int FK | // e.g. | diagram int FK |
nameTL := label.InsideMiddleLeft.GetPointOnBox( nameTL := label.InsideMiddleLeft.GetPointOnBox(
@ -85,7 +85,7 @@ func tableRow(shape d2target.Shape, box *geo.Box, nameText, typeText, constraint
fontSize, fontSize,
) )
textEl := d2themes.NewThemableElement("text") textEl := d2themes.NewThemableElement("text", inlineTheme)
textEl.X = nameTL.X textEl.X = nameTL.X
textEl.Y = nameTL.Y + fontSize*3/4 textEl.Y = nameTL.Y + fontSize*3/4
textEl.Fill = shape.PrimaryAccentColor textEl.Fill = shape.PrimaryAccentColor
@ -108,8 +108,8 @@ func tableRow(shape d2target.Shape, box *geo.Box, nameText, typeText, constraint
return out return out
} }
func drawTable(writer io.Writer, diagramHash string, targetShape d2target.Shape) { func drawTable(writer io.Writer, diagramHash string, targetShape d2target.Shape, inlineTheme *d2themes.Theme) {
rectEl := d2themes.NewThemableElement("rect") rectEl := d2themes.NewThemableElement("rect", inlineTheme)
rectEl.X = float64(targetShape.Pos.X) rectEl.X = float64(targetShape.Pos.X)
rectEl.Y = float64(targetShape.Pos.Y) rectEl.Y = float64(targetShape.Pos.Y)
rectEl.Width = float64(targetShape.Width) rectEl.Width = float64(targetShape.Width)
@ -134,7 +134,7 @@ func drawTable(writer io.Writer, diagramHash string, targetShape d2target.Shape)
fmt.Fprint(writer, fmt.Fprint(writer,
tableHeader(diagramHash, targetShape, headerBox, targetShape.Label, tableHeader(diagramHash, targetShape, headerBox, targetShape.Label,
float64(targetShape.LabelWidth), float64(targetShape.LabelHeight), float64(targetShape.FontSize)), float64(targetShape.LabelWidth), float64(targetShape.LabelHeight), float64(targetShape.FontSize), inlineTheme),
) )
var longestNameWidth int var longestNameWidth int
@ -148,11 +148,11 @@ func drawTable(writer io.Writer, diagramHash string, targetShape d2target.Shape)
rowBox.TopLeft.Y += headerBox.Height rowBox.TopLeft.Y += headerBox.Height
for idx, f := range targetShape.Columns { for idx, f := range targetShape.Columns {
fmt.Fprint(writer, fmt.Fprint(writer,
tableRow(targetShape, rowBox, f.Name.Label, f.Type.Label, f.ConstraintAbbr(), float64(targetShape.FontSize), float64(longestNameWidth), float64(longestTypeWidth)), tableRow(targetShape, rowBox, f.Name.Label, f.Type.Label, f.ConstraintAbbr(), float64(targetShape.FontSize), float64(longestNameWidth), float64(longestTypeWidth), inlineTheme),
) )
rowBox.TopLeft.Y += rowHeight rowBox.TopLeft.Y += rowHeight
lineEl := d2themes.NewThemableElement("line") lineEl := d2themes.NewThemableElement("line", inlineTheme)
if idx == len(targetShape.Columns)-1 && targetShape.BorderRadius != 0 { if idx == len(targetShape.Columns)-1 && targetShape.BorderRadius != 0 {
lineEl.X1, lineEl.Y1 = rowBox.TopLeft.X+float64(targetShape.BorderRadius), rowBox.TopLeft.Y lineEl.X1, lineEl.Y1 = rowBox.TopLeft.X+float64(targetShape.BorderRadius), rowBox.TopLeft.Y
lineEl.X2, lineEl.Y2 = rowBox.TopLeft.X+rowBox.Width-float64(targetShape.BorderRadius), rowBox.TopLeft.Y lineEl.X2, lineEl.Y2 = rowBox.TopLeft.X+rowBox.Width-float64(targetShape.BorderRadius), rowBox.TopLeft.Y

View file

@ -51,7 +51,7 @@ type ThemableElement struct {
FillPattern string FillPattern string
} }
func NewThemableElement(tag string) *ThemableElement { func NewThemableElement(tag string, inlineTheme *Theme) *ThemableElement {
xmlns := "" xmlns := ""
if tag == "div" { if tag == "div" {
xmlns = "http://www.w3.org/1999/xhtml" xmlns = "http://www.w3.org/1999/xhtml"