Content - 100 new plates under content/posts/02/ — one recurring red-haired model across 10 editorial registers (Haute Couture, Film Noir, Boudoir, Avant-Garde, Minimalism, Baroque, Street Style, Surrealism, Monochrome, Nocturne), generated with flux-1.1-pro, face-swapped to a consistent identity (FaceFusion), and upscaled (Upscayl + Remacri, 3328x4992). - content/issues/02/_index.md; issue 01 -> status archived; hugo.toml params (issueIds newest-first, issueNumber/Name/Season/Blurb). Structure - Plate bundles grouped by issue: content/posts/<issue>/<slug>/, with build.render:never stubs so /posts/<issue>/ isn't emitted. nginx 301s the legacy flat /posts/<slug>/ URLs to /posts/01/<slug>/. The /posts/ archive uses .RegularPagesRecursive. Image pipeline (scripts/, data/ gitignored) - generate-images.py — Replicate flux-1.1-pro, 960x1440, idempotent. - faceswap-images.py — FaceFusion batch-run, one consistent face. - upscale-images.py — Upscayl + remacri-4x, long edge clamped to 4992. - build-issue.py — prompts JSON -> content/posts/<issue>/*/index.md. Build - CSS now compiled by Hugo's css.TailwindCSS (partials/css.html + templates.Defer); dropped the standalone Tailwind CLI step, concurrently, and the gitignored static/css/main.css. Requires Hugo >= 0.161; Dockerfile collapsed to a single hugomods/hugo:debian-node build stage. pnpm-workspace.yaml: preferSymlinkedExecutables + allowBuilds. Front end - Pagination 8 per page. - Lightbox: brand mark and category link out; robust SPA back/forward (fetch before startViewTransition, single-flight guard, swallow the transition abort rejection, popstate re-renders / reopens the viewer). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DZPmxGywFnAhmYJB1eh9fm
82 lines
4.4 KiB
HTML
82 lines
4.4 KiB
HTML
{{ define "main" }}
|
|
|
|
{{- if eq .Kind "taxonomy" }}
|
|
{{/* ── Taxonomy overview: /categories/ or /tags/ ── */}}
|
|
<section id="hero" class="px-[var(--pad)] pt-[clamp(36px,5vw,64px)] pb-[clamp(28px,3.5vw,48px)] border-b border-[var(--rule)]">
|
|
<div class="font-sans font-medium text-[10px] leading-none tracking-[.22em] uppercase text-ink-soft mb-4">Archive</div>
|
|
<h1 class="font-display font-normal text-[clamp(48px,7vw,96px)] leading-[0.94] m-0 mb-4">The <em>{{ .Title | lower }}</em></h1>
|
|
<p class="font-serif italic text-[clamp(13px,1vw,16px)] leading-[1.65] text-ink-2 max-w-[55ch] m-0">
|
|
{{ len .Pages }} {{ .Title | lower | singularize }}{{ if ne (len .Pages) 1 }}s{{ end }} across the archive.
|
|
<a href="/" class="border-b border-current ml-1">Return to home →</a>
|
|
</p>
|
|
</section>
|
|
|
|
<div class="grid [grid-template-columns:repeat(auto-fill,minmax(220px,1fr))] gap-[var(--gap)] px-[var(--pad)] py-[var(--gap)]">
|
|
{{- range $i, $term := .Pages }}
|
|
{{- $firstPost := index $term.Pages 0 }}
|
|
{{- $img := "" }}
|
|
{{- if $firstPost }}{{- $img = $firstPost.Resources.GetMatch "*.png" }}{{- end }}
|
|
<a href="{{ $term.RelPermalink }}"
|
|
style="--d:{{ mul (math.Min $i 18) 24 }}ms"
|
|
class="card group block cursor-pointer">
|
|
<div class="relative aspect-[2/3] overflow-hidden bg-paper-2 rounded-[1px]
|
|
after:content-[''] after:absolute after:inset-0
|
|
after:shadow-[inset_0_0_0_1px_rgba(22,17,13,.04)] after:pointer-events-none">
|
|
{{- if $img }}
|
|
{{- $w := $img.Resize "600x900 webp" }}
|
|
<picture>
|
|
<source srcset="{{ $w.RelPermalink }}" type="image/webp" />
|
|
<img class="card-img w-full h-full object-cover
|
|
transition-[transform,filter] [transition-duration:.9s,.6s]
|
|
[transition-timing-function:cubic-bezier(.2,.7,.1,1),ease]
|
|
[filter:saturate(.92)_contrast(1.02)]"
|
|
loading="{{ if lt $i 8 }}eager{{ else }}lazy{{ end }}"
|
|
src="{{ $w.RelPermalink }}"
|
|
alt="{{ $term.Title }}" />
|
|
</picture>
|
|
{{- end }}
|
|
<span class="absolute bottom-[10px] left-[10px]
|
|
font-sans font-medium text-[10px] leading-none tracking-[.18em] uppercase
|
|
text-paper mix-blend-difference tabular-nums">{{ len $term.Pages }} plates</span>
|
|
</div>
|
|
<div class="mt-[14px] grid gap-1">
|
|
<h2 class="font-display font-normal text-[clamp(20px,1.6vw,26px)] leading-[1.1] tracking-normal m-0">{{ $term.Title }}</h2>
|
|
</div>
|
|
</a>
|
|
{{- end }}
|
|
</div>
|
|
|
|
{{- else }}
|
|
{{/* ── Term page (/categories/gothic/) or plain list ── */}}
|
|
<section id="hero" class="px-[var(--pad)] pt-[clamp(36px,5vw,64px)] pb-[clamp(28px,3.5vw,48px)] border-b border-[var(--rule)]">
|
|
{{- if eq .Kind "term" }}
|
|
<div class="font-sans font-medium text-[10px] leading-none tracking-[.22em] uppercase text-ink-soft mb-4">{{ .Type | humanize | singularize }}</div>
|
|
<h1 class="font-display font-normal text-[clamp(48px,7vw,96px)] leading-[0.94] m-0 mb-4"><em>{{ .Title }}</em></h1>
|
|
<p class="font-serif italic text-[clamp(13px,1vw,16px)] leading-[1.65] text-ink-2 max-w-[55ch] m-0">
|
|
{{ len .Pages }} {{ if eq (len .Pages) 1 }}plate{{ else }}plates{{ end }} tagged <em>{{ .Title }}</em>.
|
|
<a href="/" class="border-b border-current">Return to archive →</a>
|
|
</p>
|
|
{{- else }}
|
|
<div class="font-sans font-medium text-[10px] leading-none tracking-[.22em] uppercase text-ink-soft mb-4">The Archive</div>
|
|
<h1 class="font-display font-normal text-[clamp(48px,7vw,96px)] leading-[0.94] m-0 mb-4">All <em>plates</em></h1>
|
|
<p class="font-serif italic text-[clamp(13px,1vw,16px)] leading-[1.65] text-ink-2 max-w-[55ch] m-0">
|
|
<a href="/" class="border-b border-current">Return to home →</a>
|
|
</p>
|
|
{{- end }}
|
|
</section>
|
|
|
|
{{- $items := cond (eq .Kind "section") .RegularPagesRecursive .Pages }}
|
|
{{- $paginator := .Paginate $items }}
|
|
<section id="grid" data-density="default"
|
|
data-filter-type="{{ .Kind }}"
|
|
data-filter-value="{{ .Title }}"
|
|
class="grid [grid-template-columns:repeat(auto-fill,minmax(220px,1fr))] gap-[var(--gap)] px-[var(--pad)] py-[var(--gap)]">
|
|
{{- range $i, $p := $paginator.Pages }}
|
|
{{- partial "card.html" (dict "Page" $p "Index" $i) }}
|
|
{{- end }}
|
|
</section>
|
|
{{- partial "pagination.html" $paginator }}
|
|
|
|
{{- end }}
|
|
{{ end }}
|