site: hero auto-discovery, pick.json hero selection, amazonLink + shortlist fields

- src/lib/hero.ts: review heroes are now auto-discovered via import.meta.glob
  over reviews/*/hero.<ext>; only legacy non-hero-named assets remain as
  explicit overrides. New reviews need zero registration.
- Pick of the day moves from a hardcoded HERO_SLUG in index.astro to
  src/data/pick.json (content edit, not code edit); dev set-pick API and
  the review-page button now write pick.json. Fallback: latest review.
- Schemas: finds gain shortlist (bool) + amazonLink; reviews gain amazonLink.
- Review + find pages render an 'Also on Amazon' affiliate link when
  amazonLink is set, with shared disclosure handling.
- Both hero globs now include .avif (two June finds ship avif heroes).
This commit is contained in:
2026-07-03 15:16:25 -04:00
parent 5a4de71ad4
commit 80b3920715
8 changed files with 86 additions and 53 deletions
+7 -2
View File
@@ -7,7 +7,10 @@ import { heroes } from '../lib/hero';
import { bundleMosaic } from '../lib/bundle-mosaic';
import { buildOgImage, buildItemList, WEBSITE, ORGANIZATION } from '../lib/seo';
const HERO_SLUG = 'continue-y-n-game';
import pick from '../data/pick.json';
// Pick of the day. Set in src/data/pick.json; null falls back to the latest review.
const HERO_SLUG: string | null = pick.hero;
const INITIAL_GRID = 24;
const BATCH_SIZE = 7;
@@ -69,7 +72,9 @@ const tiles: Tile[] = [...reviewTiles, ...bundleTiles].sort(
const heroIndex = tiles.findIndex(
(t) => t.kind === 'review' && t.href === `/reviews/${HERO_SLUG}/`
);
const hero = heroIndex >= 0 ? tiles[heroIndex] : reviewTiles[0];
// Fall back to the newest review (tiles are sorted by date desc).
const hero =
heroIndex >= 0 ? tiles[heroIndex] : tiles.find((t) => t.kind === 'review');
const rest = tiles.filter((t) => t !== hero);
const lastUpdated = tiles[0]?.date;