Curated Reading List With Thumbnails

About this block

Curated Reading List With ThumbnailsPRO

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.

Blog64: Curated Reading List With Thumbnails

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.

Upgrade Now

Installation

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

bash
npx shadcn add "https://ui.beste.co/r/blog64?email=YOUR_EMAIL&license_key=YOUR_KEY"

Base UI flavor

bash
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).

Quick start

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.

tsx
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:

tsx
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",
        },
      ]}
    />
  );
}

Props

PropTypeDefaultDescription
eyebrowstring–Badge6 label above the hairline rule
headingstring–Section heading under the rule
descriptionstring–Supporting paragraph, capped at max-w-3xl
postsPickedPost[][]Linked rows, filling the two columns in order
classNamestring–Extra classes for the outer section
ts
type PickedPost = {
  image: PostImage;
  title: string;
  href: string;
};

type PostImage = {
  src: string;
  alt: string;
};

Behavior notes

  • Rows carry a thumbnail and a title only. There is no date, category or excerpt, which is what lets twelve of them sit on a page without turning into a feed.
  • Each row is a whole Link, so the thumbnail and the title are one hit target rather than two.
  • The thumbnail is a fixed 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.
  • Hovering a row eases the image up in scale and moves the title to the accent colour, both through a named group/blog64. The scale is wrapped in motion-safe, so it holds still for anyone who asked for reduced motion.
  • The grid is one column below md and two above it, flowing in reading order rather than down each column.

More Blog blocks

View all Blog
PRO

blog11

Compact Thumbnail List

PRO

blog5

Horizontal List with Icons

PRO

blog43

Editorial Article Grid

Get Pro access