--- import { getCollection } from "astro:content"; import BaseLayout from "@/layouts/BaseLayout.astro"; export async function getStaticPaths() { const allPosts = await getCollection("posts", ({ data }) => !data.draft); const categories = [ ...new Set(allPosts.map((p) => p.data.category).filter(Boolean)), ]; return categories.map((cat) => ({ params: { category: cat }, props: { category: cat, posts: allPosts .filter((p) => p.data.category === cat) .sort((a, b) => b.data.date.getTime() - a.data.date.getTime()), }, })); } const { category, posts } = Astro.props; const allPosts = await getCollection("posts", ({ data }) => !data.draft); const categories = [ ...new Set(allPosts.map((p) => p.data.category).filter(Boolean)), ].sort(); const fmtDate = (d: Date) => d.toLocaleDateString("en-US", { year: "numeric", month: "short", day: "numeric", }); const readTime = (body?: string) => { const words = body?.split(/\s+/).length ?? 0; return `~${Math.max(1, Math.round(words / 220))} mins`; }; const excerpt = (body?: string, len = 140) => { if (!body) return ""; const plain = body .replace(/^---[\s\S]*?---/, "") .replace(/[#*_`>\[\]()!|~\-]/g, "") .replace(/\n+/g, " ") .trim(); return plain.length > len ? plain.slice(0, len).trimEnd() + " …" : plain; }; ---

{category}

{posts.length} post{posts.length !== 1 ? "s" : ""}