site: ui/ux refresh, seo pass, find/lists indexes, 25 new finds

- newspaper-style masthead (stats | "Unique" | About/Blog) on every page
  with per-page italic subheader + last-updated date on listing pages;
  sitewide 42rem reading width
- pinterest home (hero + masonry, "load more"); old list view at /index3/
- new pages: /about, /blog, /legal, /find/, /finds/, custom 404
- footer collection links now clickable; "founded" stat replaces "updated"
  in the masthead
- centralised SEO component with per-page json-ld (Review, BlogPosting,
  Product, Article, CollectionPage, ItemList, BreadcrumbList, etc.);
  @astrojs/sitemap + @astrojs/rss; robots.txt; promoted finds canonical
  to their review
- memoize getSiteStats() so the masthead/footer counts don't multiply
  per-page build cost
- 25 new daily-finds captures
This commit is contained in:
2026-05-03 16:58:23 -04:00
parent c184f3f50a
commit c8095d2766
54 changed files with 2337 additions and 95 deletions
+11 -17
View File
@@ -13,14 +13,17 @@ const tiles = reviews.map((review) => ({
subtitle: review.data.subtitle,
hero: heroes[review.id],
}));
const lastUpdated = reviews[0]?.data.date;
---
<BaseLayout title="Grid" wide>
<div class="intro">
<h1>Grid view</h1>
<p><a href="/">← list view</a></p>
</div>
<BaseLayout
title="Grid"
description="Every review on Unique, tiled in a single grid."
subheader="Every review as a tile."
lastUpdated={lastUpdated}
noindex
>
<ul class="grid">
{
tiles.map((tile) => (
@@ -34,7 +37,7 @@ const tiles = reviews.map((review) => ({
height={tile.hero.src.height}
loading="lazy"
decoding="async"
alt=""
alt={tile.name}
/>
)}
{tile.hero?.kind === 'video' && (
@@ -46,6 +49,7 @@ const tiles = reviews.map((review) => ({
muted
playsinline
preload="metadata"
aria-label={tile.name}
/>
)}
<div class="text">
@@ -59,16 +63,6 @@ const tiles = reviews.map((review) => ({
</ul>
<style>
.intro {
display: flex;
align-items: baseline;
justify-content: space-between;
gap: 1rem;
margin-bottom: 1.5rem;
}
.intro h1 { margin: 0; font-size: 1.5rem; }
.intro p { margin: 0; font-size: 0.9rem; color: var(--muted); }
.grid {
column-count: 3;
column-gap: 1rem;