An album is a tag. Photos carry lowercase free-text tags in their .toml sidecar (`tags = [...]`), parallel to the existing day grouping — no database, all derived at build time. - albums.go: parseTags (lowercase/trim/dedupe, slug via sanitiseSlug), groupByTag mirroring groupByDay, and rendering for album pages, the index, and the JSON API. Slug collisions between distinct names are suffixed and logged. - Routes: /album/<slug>/ (paginated square grid per tag), /albums/ (index with counts), /tags.json (machine-readable tag list, served statically like feed.xml). - POST /upload gains a `tags` field written into the sidecar; the web upload form gains a tags input. - Tags shown on each photo page linking to their album; an Albums link in the timeline/grid header.
55 lines
1.8 KiB
HTML
55 lines
1.8 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="en">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
<title>Albums · Photo Gallery</title>
|
||
<link rel="stylesheet" href="{{.FontsURL}}">
|
||
<link rel="stylesheet" href="/static/style.css">
|
||
<link rel="icon" href="/static/favicon.ico" sizes="any">
|
||
<link rel="icon" type="image/png" href="/static/web-32.png" sizes="32x32">
|
||
<link rel="apple-touch-icon" href="/static/web-192.png">
|
||
<style>:root { --serif: '{{.SerifFamily}}', Georgia, serif; --mj: '{{.MlFamily}}', sans-serif; }</style>
|
||
<link rel="alternate" type="application/atom+xml" href="/feed.xml" title="Photo Feed">
|
||
</head>
|
||
<body>
|
||
<header class="profile-hdr">
|
||
<div class="profile-inner">
|
||
<div class="avatar-ring">
|
||
<span class="avatar-initials">{{.Initial}}</span>
|
||
</div>
|
||
<div class="pinfo">
|
||
<h1>{{.Author}}</h1>
|
||
<p class="handle">{{.Handle}}</p>
|
||
<p class="pcount"><strong>{{.Total}}</strong> posts</p>
|
||
<p class="pbio">{{.Bio}}{{if .BioAlt}}<br><span class="ml">{{.BioAlt}}</span>{{end}}</p>
|
||
<a href="/" class="rss-a">← Timeline</a>
|
||
</div>
|
||
</div>
|
||
</header>
|
||
|
||
<main>
|
||
<div class="grid-wrap">
|
||
<section class="tl-day">
|
||
<h2 class="tl-date">Albums<span class="tl-count">{{len .Albums}}</span></h2>
|
||
{{if .Albums}}
|
||
<div class="album-list">
|
||
{{range .Albums}}
|
||
<a href="/album/{{.Tag.Slug}}/" class="album-chip">
|
||
{{.Tag.Name}}<span class="album-chip-count">{{.Count}}</span>
|
||
</a>
|
||
{{end}}
|
||
</div>
|
||
{{else}}
|
||
<p class="album-empty">No albums yet — add tags to a photo to create one.</p>
|
||
{{end}}
|
||
</section>
|
||
</div>
|
||
</main>
|
||
|
||
<footer class="site-footer">
|
||
© 2000–{{.Year}} {{.Author}}. All rights reserved.
|
||
</footer>
|
||
</body>
|
||
</html>
|