diff --git a/internal/web/templates/layout.html b/internal/web/templates/layout.html
index 61eeca0..80cf025 100644
--- a/internal/web/templates/layout.html
+++ b/internal/web/templates/layout.html
@@ -1,5 +1,6 @@
{{define "head"}}
+
{{ pageTitle . }} ยท Palette
diff --git a/internal/web/web.go b/internal/web/web.go
index 049817d..36f7692 100644
--- a/internal/web/web.go
+++ b/internal/web/web.go
@@ -74,6 +74,7 @@ func New() (*UI, error) {
"humanSize": humanSize,
"version": func() string { return Version }, // #93: topbar version label
"defaultDark": func() bool { return DefaultDark }, // #127: server-configured default
+ "pageTitle": pageTitle, // page labels
}
t, err := template.New("").Funcs(funcs).ParseFS(tmplFS, "templates/*.html")
if err != nil {
@@ -82,6 +83,38 @@ func New() (*UI, error) {
return &UI{tmpl: t}, nil
}
+// pageTitle returns the label for the rendered page. Page data is
+// always a map with a "Page" key set by the handlers.
+func pageTitle(data any) string {
+ m, _ := data.(map[string]any)
+ page, _ := m["Page"].(string)
+ id, _ := m["ID"].(string)
+ title, _ := m["Title"].(string)
+ switch page {
+ case "new":
+ return "New paste"
+ case "public":
+ return "Public pastes"
+ case "saved":
+ return "Saved"
+ case "settings":
+ return "Settings"
+ case "paste":
+ if title != "" {
+ return title
+ }
+ return "Paste " + id
+ case "unlock":
+ return "Unlock " + id
+ case "can":
+ return "Can " + id
+ case "notfound":
+ return "Not found"
+ default:
+ return "Palette"
+ }
+}
+
func humanSize(n int) string {
if n < 1024 {
return fmt.Sprintf("%d B", n)