Add list styles: Podium, Spotlight, Grid, List

- Each list picks a style in List settings (new lists default to Podium);
  existing lists keep Grid or List
- Podium: top 3 on medal-colored steps (#1 center and raised), the rest
  behind a native <details> "Show N more"; stacks #1 over #2/#3 on phones
- Spotlight: #1 as a feature card (art, why-note or description, play
  button), the rest as a numbered list
- Visitors can switch styles on a list page (?style=), preserved across
  pages; later pages fall back to a plain list since they don't start at #1
- Entries' detail data now lives on a wrapper per list, so featured and
  collapsed entries all open the detail view

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
cdnutterandClaude Opus 5.5 committed 2026-09-25 11:18:44 -07:00
1 parent b09533cc00
commit ddf2157e63
15 files changed
+286 -65

No files matched your search

+7
View File
@@ -143,6 +143,9 @@ const listPageSize = 100
type listPage struct {
List store.List
Category store.Category
Style string // style being shown: the list's, or the visitor's pick
Styles []store.ListStyle // for the style switcher
PageQS string // extra query for pager links, e.g. "&style=grid"
Items []ItemView
Hero *ItemView
Page int
@@ -180,6 +183,10 @@ func (s *Server) handleList(w http.ResponseWriter, r *http.Request) {
site := s.site(ctx)
p := listPage{List: l, Page: 1}
p.Category = listCategory(l)
p.Style, p.Styles = l.Layout, store.ListStyles
if st, ok := store.StyleByKey(r.URL.Query().Get("style")); ok && st.Key != l.Layout {
p.Style, p.PageQS = st.Key, "&style="+st.Key
}
p.Pages = max(1, (l.ItemCount+listPageSize-1)/listPageSize)
if n, err := strconv.Atoi(r.URL.Query().Get("page")); err == nil && n > 1 {
p.Page = min(n, p.Pages)