about summary refs log tree commit diff stats
path: root/examples/simple/simple.go
blob: adc90947e28159e0a2dcb534e8473101684430a3 (plain)
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
package main

import (
	"fmt"
	"net/http"
	"time"

	g "github.com/maragudk/gomponents"
	"github.com/maragudk/gomponents/attr"
	"github.com/maragudk/gomponents/el"
)

func main() {
	_ = http.ListenAndServe("localhost:8080", handler())
}

func handler() http.HandlerFunc {
	return func(w http.ResponseWriter, r *http.Request) {
		props := pageProps{
			title: r.URL.Path,
			path:  r.URL.Path,
		}

		_ = g.Write(w, page(props))
	}
}

type pageProps struct {
	title string
	path  string
}

func page(props pageProps) g.Node {
	return el.Document(
		el.HTML(
			g.Attr("lang", "en"),
			el.Head(
				el.Title(props.title),
				el.Style(g.Attr("type", "text/css"), g.Raw(".is-active{font-weight: bold}")),
			),
			el.Body(
				navbar(navbarProps{path: props.path}),
				el.H1(props.title),
				el.P(g.Text(fmt.Sprintf("Welcome to the page at %v.", props.path))),
				el.P(g.Text(fmt.Sprintf("Rendered at %v", time.Now()))),
			),
		),
	)
}

type navbarProps struct {
	path string
}

func navbar(props navbarProps) g.Node {
	items := []struct {
		path string
		text string
	}{
		{"/", "Home"},
		{"/foo", "Foo"},
		{"/bar", "Bar"},
	}
	var lis []g.Node
	for _, item := range items {
		lis = append(lis, el.Li(
			el.A(item.path, attr.Classes(map[string]bool{"is-active": props.path == item.path}), g.Text(item.text))))
	}
	return el.Ul(lis...)
}