examples/simple/simple.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 | 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...)
}
|