Ghost-watermark 404 numeral, italic headline "gone to press",
russet CTA back to archive — same type stack and token system
as the rest of the site.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
For kind=taxonomy pages, .Pages contains term pages (not posts), so
card.html was getting no images. Add a separate branch that renders
each term as a cover card using the first post's image, title, and
plate count.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Script injected via hugo.IsProduction guard so it's absent during
hugo server dev mode. Src and website-id stored in hugo.toml params.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Override the browser-default blue/accent-coloured × with a custom
SVG circle using --ink-soft (#5b4f44) so it blends with the UI.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
lbBuildThumbs() was called after goToSlide(), so the scroll in
syncThumbs() ran against an empty container. Reorder so thumbs are
built before goToSlide() positions them.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Issue metadata (title, description, season, status) now lives in
content/issues/XX/_index.md. terms.html reads from those pages via
$.Site.GetPage, driven by issueIds param in hugo.toml. Removes the
JSON data file and its generation from import-posts.py.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Mark five posts (Gothic, Cyberpunk, Dark Fantasy, Urban, Sci-Fi) as
featured: true. Homepage grid now filters by that flag instead of
showing first 8. CTA button changed from plain black to brand russet.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
pagerSize set to 10 (5 columns × 2 rows). New pagination partial
renders prev/next links and numbered page buttons. Applied to
_default/list.html (categories + tags) and issues/list.html.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The search bar had its own border-b which stacked with the header's
border-b once the category tabs row was removed. Drop the redundant
one from the search bar.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace full plate grid with issue identity hero (title, season,
description, logo), 8-plate preview, and CTA strip linking to the
full issue. All data is derived from the issues/01 taxonomy term page
so the page stays in sync when the issue changes.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Tabs now reflect only categories that actually have posts, so stale
entries like Noir can't appear.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Normalise all post descriptions at import time: first character uppercased,
period appended if missing. Regenerated all 101 page bundles.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The click-outside handler was checking for .subhead (a BEM class removed
in the Tailwind refactor) so every click including on the input itself
triggered closeSearch(). Now checks for the actual search label and popup.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Remove all BEM component classes (hero__*, card__*, issue-card__*, foot__*,
masthead__*, searchpop__*, lb__*) from CSS and templates. Replace with
Tailwind v4 utility classes inline in HTML. Create card.html partial to
avoid repeating verbose utility strings across grid templates. Rename
lightbox CSS to flat lb-* and search popup to sp-*.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Each card frame now shows № 01 at the bottom-left alongside the
existing plate number (top-left) and category (top-right).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
/categories/dark-fantasy/ was also activating the Fantasy tab
because path.includes('fantasy') matched. Now compares the full
/categories/{slug}/ path.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Save location.href before pushState when opening lightbox from a
grid page, and navigate back to it on close. Direct single-post
page loads still return to the issue page.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Previously the lightbox list was built from whichever cards happened
to be in the DOM (e.g. only tagged posts on a /tags/ page). Now all
three open paths — card click, VTA navigation, and direct URL load —
scope the list to all posts sharing the same issue as the opened post.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Import script now takes only the first CSV category per post.
All card grid templates simplified to show just that single
category in card__sub — no tag alongside it.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Use Hugo's `issue = "issues"` taxonomy so each post carries
`issues: ["01"]` in frontmatter. Issue pages live at /issues/01/
with a dedicated _index.md holding title, season, and description.
The /issues/ archive page uses data/issues.json for forthcoming
entries that have no posts yet.
Layouts:
- layouts/issues/list.html → plate grid for a single issue term
- layouts/issues/terms.html → issues archive (new)
- _default/single.html → scopes grid to issue term page, back-link to /issues/01/
- baseof.html → ribbon links to /issues/01/, JSON island includes issue field
- partials/header.html → Issues link → /issues/
JS:
- lbClose() navigates to /issues/${issueId}/ on a single-post page
- lightbox meta panel shows linked Issue fact
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>