spb/tools-spboucher-ai
Public
1import type { Metadata } from "next";2import Link from "next/link";3import { listCollections } from "@/lib/public/queries";4import { Breadcrumbs } from "@/components/breadcrumbs";5import { fmtDate } from "@/lib/utils";6export const revalidate = 600;7export const metadata: Metadata = { title: "Collections", description: "Curated stacks and guides: Apple Silicon AI, high-frequency finance research, academic writing, self-hosted agent infrastructure, real-estate valuation and more.", alternates: { canonical: "/collections" } };8export default async function Collections() {9 const cols = await listCollections();10 return (11 <div className="mx-auto max-w-7xl px-4 py-8 sm:px-6">12 <Breadcrumbs items={[{ label: "Collections" }]} />13 <h1 className="display h1 mt-3">Collections</h1>14 <p className="mt-2 max-w-2xl text-fg-2">Editorial guides that assemble tools into working stacks. Each collection explains why a tool is included and how the pieces fit together.</p>15 <div className="mt-8 grid gap-4 md:grid-cols-2 lg:grid-cols-3">16 {cols.map((c) => (17 <Link key={c.slug} href={`/collections/${c.slug}`} className="card flex flex-col p-5">18 <h2 className="display text-2xl">{c.title}</h2>19 <p className="mt-2 line-clamp-3 text-sm text-fg-2">{c.description}</p>20 <p className="mt-auto pt-4 text-xs text-fg-3">{c.count} tools · updated {fmtDate(c.updatedAt)}</p>21 </Link>22 ))}23 {cols.length === 0 && <p className="card p-8 text-fg-2">Collections are being prepared.</p>}24 </div>25 </div>26 );27}28