all repos — homestead @ 59ae179681edaabaabb8ed8d981374abd3d77cda

Code for my website

templates/layout.go (view raw)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
package templates

import (
	"go.alanpearce.eu/homestead/internal/config"

	g "go.alanpearce.eu/gomponents"
	. "go.alanpearce.eu/gomponents/html"
)

type SiteSettings struct {
	Title            string
	Language         string
	Menu             []config.MenuItem
	InjectLiveReload bool
}

type Attrs map[string]string

type PageSettings struct {
	Title      string
	TitleAttrs Attrs
	BodyAttrs  Attrs
}

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 g.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 {
	return Doctype(
		HTML(
			Lang(site.Language),
			Head(
				Meta(Charset("utf-8")),
				Meta(Name("viewport"), Content("width=device-width, initial-scale=1.0")),
				TitleEl(g.Text(page.Title)),
				Link(
					Rel("alternate"),
					Type("application/atom+xml"),
					Title(site.Title),
					Href("/atom.xml"),
				),
				StyleEl(g.Raw(CSS)),
			),
			Body(
				extendAttrs(page.BodyAttrs, nil),
				A(Class("skip"), Href("#main"), g.Text("Skip to main content")),
				Header(
					H2(
						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 {
							return A(
								Href(item.URL.String()),
								g.If(item.URL.IsAbs(), Target("_blank")),
								g.Text(item.Name),
							)
						}),
					),
				),
				Main(ID("main"), g.Group(children)),
				Footer(
					A(Href("https://git.alanpearce.eu/website"), g.Text("Content")),
					g.Text(" is "),
					A(
						Rel("license"),
						Href("http://creativecommons.org/licenses/by/4.0/"),
						g.Text("CC BY 4.0"),
					),
					g.Text(". "),
					A(Href("https://git.alanpearce.eu/homestead"), g.Text("Site source code")),
					g.Text(" is "),
					A(Href("https://opensource.org/licenses/MIT"), g.Text("MIT")),
				),
				g.If(site.InjectLiveReload,
					Script(Defer(), g.Raw(`
						new EventSource("/_/reload").onmessage = event => {
							console.log("got message", event)
							window.location.reload()
						};
					`)),
				),
			),
		))
}