aboutsummaryrefslogtreecommitdiffstats
path: root/internal/web/layout.go
diff options
context:
space:
mode:
authorgrm <grm@eyesin.space>2026-09-16 00:20:06 +0300
committergrm <grm@eyesin.space>2026-09-16 00:20:06 +0300
commit5119018feeaa22c47c0e91e15d3b9414dd6e0772 (patch)
treedf5c5813c3c92e21b1230516f849de811adf212e /internal/web/layout.go
parent839343a3108734a15e331b542a20ed9c77ef582b (diff)
downloadblogspace-5119018feeaa22c47c0e91e15d3b9414dd6e0772.tar.gz
blogspace-5119018feeaa22c47c0e91e15d3b9414dd6e0772.tar.bz2
blogspace-5119018feeaa22c47c0e91e15d3b9414dd6e0772.zip
Put the header search box in the menu row, and stop saying "Search"
The header search was a band of its own under the menu; now it floats at the right end of the menu row and only gets a thin bar when the header has no menu. The forms are a single input — Enter and the phone keyboard's search key submit a one-field form everywhere — with the placeholder as the label, side boxes start without a heading, and the results page shows a box only when no module does, so a page no longer reads "Search" a dozen times. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Sd8UPWrvyYCLj97JexNw3A
Diffstat (limited to 'internal/web/layout.go')
-rw-r--r--internal/web/layout.go16
1 files changed, 16 insertions, 0 deletions
diff --git a/internal/web/layout.go b/internal/web/layout.go
index 0d51068..6f5c84f 100644
--- a/internal/web/layout.go
+++ b/internal/web/layout.go
@@ -124,6 +124,9 @@ type Layout struct {
// A column is laid out when it has something to show — or always, when
// the theme keeps the columns' space.
HasLeft, HasRight bool
+ // A header search box sits in the menu row when there is one, so the two
+ // header modules need to know about each other.
+ HeaderMenu, HeaderSearch bool
}
// buildLayout groups modules by area, dropping areas the theme has switched off.
@@ -136,6 +139,8 @@ func buildLayout(t Theme, mods []store.Module) Layout {
switch m.Area {
case "header":
l.Header = append(l.Header, m)
+ l.HeaderMenu = l.HeaderMenu || m.Kind == "menu"
+ l.HeaderSearch = l.HeaderSearch || m.Kind == "search"
case "left":
l.Left = append(l.Left, m)
case "right":
@@ -181,6 +186,17 @@ func (l Layout) NeedsTags() bool {
return false
}
+// HasSearch says whether a visible module offers a search box (the search
+// page shows its own only when none does).
+func (l Layout) HasSearch() bool {
+ for _, m := range l.all() {
+ if m.Kind == "search" {
+ return true
+ }
+ }
+ return false
+}
+
// MaxRecent is the longest "recent posts" list any visible module wants (0 = none).
func (l Layout) MaxRecent() int {
n := 0