A curated reading list under a left-aligned header, laid out as two columns of linked rows where a wide thumbnail sits beside the article title and nothing else competes with it.
A curated reading list under a left-aligned header, laid out as two columns of linked rows where a wide thumbnail sits beside the article title and nothing else competes with it.
Upgrade to Pro
Pro blocks install through the shadcn CLI with your license key and ship their full source. Docs and live previews stay open to everyone, so you can read every block's details first.
Swap YOUR_EMAIL and YOUR_KEY for the email and license key on your account. Find your license key on your account page.
Radix flavor
npx shadcn add "https://ui.beste.co/r/blog64?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/blog64?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/blog64.tsx and the badge6 component it uses for the eyebrow (installed to components/beste/component/badge6.tsx).
The installed file exports blog64Demo alongside the block: the exact props behind the preview above. Spread it to get a working reading list in one line.
import { Blog64, blog64Demo } from "@/components/beste/block/blog64";
export default function ReadingListPage() {
return <Blog64 {...blog64Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Blog64 } from "@/components/beste/block/blog64";
export default function ReadingListPage() {
return (
<Blog64
eyebrow="Reading list"
heading="Where to start"
description="The pieces we hand to new clients and new hires, in the order we hand them over."
posts={[
{
image: { src: "/covers/manual.jpg", alt: "Notes on a studio table" },
title: "The operating manual we hand every new hire",
href: "/essays/operating-manual",
},
{
image: { src: "/covers/estimate.jpg", alt: "A printed estimate" },
title: "Writing an estimate you can defend line by line",
href: "/essays/estimates",
},
]}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
eyebrow | string | – | Badge6 label above the hairline rule |
heading | string | – | Section heading under the rule |
description | string | – | Supporting paragraph, capped at max-w-3xl |
posts | PickedPost[] | [] | Linked rows, filling the two columns in order |
className | string | – | Extra classes for the outer section |
type PickedPost = {
image: PostImage;
title: string;
href: string;
};
type PostImage = {
src: string;
alt: string;
};Link, so the thumbnail and the title are one hit target rather than two.h-24 w-40 box with the image absolutely positioned inside it, so rows keep the same height whatever aspect ratio the source image has.group/blog64. The scale is wrapped in motion-safe, so it holds still for anyone who asked for reduced motion.md and two above it, flowing in reading order rather than down each column.blog11
Two-column compact blog list with small square thumbnails. Space-efficient design showing many posts at once with minimal metadata.
blog5
Vertical stack of horizontal blog cards with left-aligned thumbnails. Features calendar and clock icons for metadata, author titles, and tag badges.
blog43
A blog listing with an eyebrow over a hairline rule, a two-column heading, and three linked article cards with a hover-zoom image, a category label, a title, an excerpt, and byline.
blog60
A blog section pairing one linked feature with a hover-zoom image, category label, and byline against a hairline list of five recent posts stamped with their date.