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
+18 -2
View File
@@ -39,6 +39,9 @@ const linkLabel =
(review.data.linkText ?? new URL(review.data.link).hostname.replace(/^www\./, ''));
const external = review.data.link ? resolveExternalLink(review.data.link) : undefined;
const amazon = review.data.amazonLink
? resolveExternalLink(review.data.amazonLink)
: undefined;
const fromFindItem = review.data.fromFind
? (await getCollection('find')).find((f) => f.id === review.data.fromFind)
@@ -111,7 +114,20 @@ const categoryLabel =
</p>
)}
{external?.isAffiliate && (
{amazon && (
<p class="external">
<a
href={amazon.href}
target="_blank"
rel={amazon.isAffiliate ? AFFILIATE_REL : 'noopener noreferrer'}
>
Also on Amazon ↗
</a>
{amazon.isAffiliate && <span class="aff-badge">Affiliate</span>}
</p>
)}
{(external?.isAffiliate || amazon?.isAffiliate) && (
<p class="aff-disclosure">{AFFILIATE_DISCLOSURE}</p>
)}
@@ -121,7 +137,7 @@ const categoryLabel =
label="Make today's pick"
action="set-pick"
slug={review.id}
confirm={`This will set ${review.data.name} as the homepage hero (rewrites HERO_SLUG in src/pages/index.astro).`}
confirm={`This will set ${review.data.name} as the homepage hero (writes src/data/pick.json).`}
/>
</div>
)}