Two-column compact blog list with small square thumbnails. Space-efficient design showing many posts at once with minimal metadata.
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.
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/blog11?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
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.
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.
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:
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",
},
]}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
badge | { label: string; variant?: "default" | "secondary" | "outline" } | – | Centered eyebrow badge above the heading |
heading | string | – | Section heading |
description | string | – | Muted paragraph under the heading |
posts | BlogPost[] | [] | Rows rendered in the two-column grid |
className | string | – | Extra classes for the outer <section> |
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;
};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.Link whose href defaults to "#" when post.href is missing, so a post with no link still renders as a clickable no-op anchor.post.tags?.[0]) and it renders as plain text: neither tag.href nor any additional tags are used.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.index as their React key, so reordering or filtering posts in place can confuse reconciliation.blog18
Blog archive organized by month with compact list entries. Small thumbnails and formatted dates create a scannable chronological view.
blog25
Two-column layout with featured image on left and article list on right. Divider-separated entries with arrow hover effects.
blog22
Vertically stacked blog cards with 2:1 aspect ratio images. Full article summaries with author avatars and read more buttons. Long-form content showcase.
blog15
Clean text-only blog list with arrow icons. No images, just titles, dates, and authors. Lightweight design with hover arrow animation.
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 monospace category, a title, an excerpt, and byline.