All Taste components
Content
Article cards
The latest three posts from a blog or help centre, with a cover, a topic, a title and a date.
3 posts · cover art · topic badge · reading time · link to all
import { ArrowRight } from "lucide-react";
const posts = [
{ href: "/journal/late-payment-reminders", cover: "/journal/reminders.jpg", topic: "Guides",
title: "How to word a late-payment reminder without losing the client", date: "2026-10-02", readingTime: "6 min read" },
{ href: "/journal/day-rate-or-project-fee", cover: "/journal/pricing.jpg", topic: "Pricing",
title: "Day rate or project fee? A simple way to decide", date: "2026-09-24", readingTime: "8 min read" },
{ href: "/journal/recurring-proration", cover: "/journal/recurring.jpg", topic: "Product",
title: "Recurring invoices now handle mid-month changes", date: "2026-09-17", readingTime: "3 min read" },
];
const formatDate = (iso: string) =>
new Date(iso).toLocaleDateString("en-GB", { day: "numeric", month: "short", year: "numeric" });
export function ArticleCards() {
return (
<section aria-labelledby="journal-title" className="bg-bg font-sans">
<div className="mx-auto max-w-6xl px-4 py-20 sm:px-6">
<div className="flex flex-wrap items-end justify-between gap-4">
<h2 id="journal-title" className="text-3xl font-semibold tracking-tight text-fg">From the journal</h2>
<a href="/journal" className="inline-flex items-center gap-1 text-sm font-medium text-primary hover:underline">
All articles <ArrowRight className="size-4" aria-hidden />
</a>
</div>
<div className="mt-10 grid gap-x-6 gap-y-10 md:grid-cols-3">
{posts.map((p) => (
<a key={p.href} href={p.href} className="group flex flex-col gap-3">
<img src={p.cover} alt="" className="aspect-[16/10] w-full rounded-lg border border-border bg-surface object-cover transition group-hover:border-border-strong" />
<span className="w-fit rounded-full bg-surface-2 px-2 py-0.5 text-xs font-medium text-fg-muted">{p.topic}</span>
<h3 className="text-base font-semibold leading-snug tracking-tight text-fg group-hover:underline group-hover:underline-offset-4">{p.title}</h3>
<p className="text-xs text-fg-subtle">
<time dateTime={p.date}>{formatDate(p.date)}</time> · {p.readingTime}
</p>
</a>
))}
</div>
</div>
</section>
);
}
The code uses the Taste Tailwind preset. Make yours on the Taste page with Export my system.