fix attribute inheritance/extension
1 file changed, 36 insertions(+), 3 deletions(-)
changed files
M templates/layout.go → templates/layout.go
@@ -14,10 +14,37 @@ Menu []config.MenuItem InjectLiveReload bool } +type Attrs map[string]string + type PageSettings struct { Title string - TitleAttrs g.Node - BodyAttrs g.Node + TitleAttrs Attrs + BodyAttrs Attrs +} + +// Map a map of anything to a [Group] (which is just a slice of [Node]-s). +func MapMap[K comparable, T any](ts map[K]T, cb func(K, T) g.Node) g.Group { + nodes := make([]g.Node, 0, len(ts)) + for k, t := range ts { + nodes = append(nodes, cb(k, t)) + } + + return nodes +} + +func extendAttrs(base Attrs, attrs Attrs) g.Node { + m := base + for key, value := range attrs { + if v, found := base[key]; found { + m[key] = v + " " + value + } else { + m[key] = value + } + } + + return MapMap(m, func(k string, v string) g.Node { + return g.Attr(k, v) // can't inline this because it uses ...value, grr + }) } func Layout(site SiteSettings, page PageSettings, children ...g.Node) g.Node {@@ -37,10 +64,16 @@ ), StyleEl(g.Raw(CSS)), ), Body( + extendAttrs(page.BodyAttrs, nil), A(Class("skip"), Href("#main"), g.Text("Skip to main content")), Header( H2( - A(page.TitleAttrs, Class("title p-name"), Href("/"), g.Text(site.Title)), + A( + extendAttrs(Attrs{ + "class": "title p-name", + "href": "/", + }, page.TitleAttrs), + g.Text(site.Title)), ), Nav( g.Map(site.Menu, func(item config.MenuItem) g.Node {