Compact Thumbnail List

About this block

Compact Thumbnail ListPRO

Two-column compact blog list with small square thumbnails. Space-efficient design showing many posts at once with minimal metadata.

Blog11: Compact Thumbnail List

A two-column compact blog list where each post is a full-row link pairing a small square thumbnail with its first tag, date, single-line title, author name, and read time, above an optional centered header of badge, heading, and description.

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/blog11?email=YOUR_EMAIL&license_key=YOUR_KEY"

Base UI flavor

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

This installs the block to components/beste/block/blog11.tsx, plus the badge shadcn/ui primitive it uses for the section eyebrow.

Quick start

The installed file exports blog11Demo alongside the block: the exact props behind the preview above. Spread it to get a working compact post list in one line.

tsx
import { Blog11, blog11Demo } from "@/components/beste/block/blog11";

export default function BlogPage() {
  return <Blog11 {...blog11Demo} />;
}

Then replace the demo with your own props. Written out, a trimmed setup looks like this:

tsx
import { Blog11 } from "@/components/beste/block/blog11";

export default function BlogPage() {
  return (
    <Blog11
      badge={{ label: "Quick Reads", variant: "default" }}
      heading="Latest Updates"
      description="Stay informed with our most recent articles."
      posts={[
        {
          image: { src: "/posts/design-systems.jpg", alt: "Design systems" },
          title: "The Future of Design Systems",
          summary: "Exploring how design systems are evolving.",
          date: "January 15, 2026",
          readTime: "8 min",
          author: { name: "Lisa Park" },
          tags: [{ label: "Design", href: "/blog/design-systems" }],
          href: "/blog/design-systems",
        },
      ]}
    />
  );
}

Props

PropTypeDefaultDescription
badge{ label: string; variant?: "default" | "secondary" | "outline" }Centered eyebrow badge above the heading
headingstringSection heading
descriptionstringMuted paragraph under the heading
postsBlogPost[][]Rows rendered in the two-column grid
classNamestringExtra classes for the outer <section>
ts
type Author = {
  name: string;
  title?: string;
  avatar?: { src: string; alt: string };
  href?: string;
};

type Tag = {
  label: string;
  href?: string;
};

type BlogPost = {
  image: { src: string; alt: string };
  title: string;
  summary: string;
  date?: string;
  readTime?: string;
  author?: Author;
  tags?: Tag[];
  href?: string;
};

Behavior notes

  • The centered header block is only rendered when at least one of badge, heading, or description is provided; with all three omitted the grid renders alone.
  • badge.variant falls back to "default" when unset, and the whole badge is skipped if badge itself is absent.
  • Each post is wrapped in a Next.js Link whose href defaults to "#" when post.href is missing, so a post with no link still renders as a clickable no-op anchor.
  • Only the first tag is ever shown (post.tags?.[0]) and it renders as plain text: neither tag.href nor any additional tags are used.
  • Several declared BlogPost fields are never rendered by this layout: summary, author.title, author.avatar, author.href, and every tag past the first are accepted by the type but silently dropped.
  • post.title is capped to a single line via line-clamp-1, so long titles are truncated with an ellipsis rather than wrapping.
  • readTime is prefixed with a middot separator and only shown when present; the middot does not appear if readTime is omitted, and the author name renders on its own.
  • Rows use the array index as their React key, so reordering or filtering posts in place can confuse reconciliation.

More Blog blocks

View all Blog
PRO

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.

PRO

blog18

Month-Grouped Archive

Blog archive organized by month with compact list entries. Small thumbnails and formatted dates create a scannable chronological view.

FREE

blog25

Split Image with List

Two-column layout with featured image on left and article list on right. Divider-separated entries with arrow hover effects.

PRO

blog43

Editorial Article Grid

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.

PRO

blog5

Horizontal List with Icons

Vertical stack of horizontal blog cards with left-aligned thumbnails. Features calendar and clock icons for metadata, author titles, and tag badges.

PRO

blog15

Minimal Text List

Clean text-only blog list with arrow icons. No images, just titles, dates, and authors. Lightweight design with hover arrow animation.