Masonry Pinterest Grid

Explore

Discover Articles

A curated collection of our best content.

Design systems

The Future of Design Systems in Modern Web Development

Exploring how design systems are evolving to meet the demands of increasingly complex web applications. Learn about component libraries, design tokens, and the tools that make it all work together seamlessly. We'll dive deep into the architecture decisions that make design systems scalable and maintainable across large organizations.

LPLisa Park
8 min read
TypeScript

Advanced TypeScript Patterns

Make your codebase more maintainable with advanced TypeScript techniques. From generics to conditional types, learn how to leverage TypeScript's powerful type system to catch bugs at compile time and improve developer experience.

MSMaria Santos
15 min read
CSS

Modern CSS Techniques You Should Know in 2026

A comprehensive guide to the latest CSS features including container queries, cascade layers, and the new color functions that are changing how we style the web. We explore practical examples of :has() selector, subgrid layouts, scroll-driven animations, and the new anchor positioning API. Plus, learn how to progressively enhance your stylesheets for older browsers while taking advantage of cutting-edge features.

SKSarah Kim
7 min read
About this block

Masonry Pinterest GridPRO

Pinterest-style masonry layout with varying content heights. CSS columns create organic flow with cards of different summary lengths.

Blog12: Masonry Pinterest Grid

A Pinterest-style blog index that flows post cards through CSS multi-column layout (one, two, or three columns responsively), each card showing a hover-zoomed cover image, an optional outline tag badge, a title, a full summary, an author avatar with name, and a 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/blog12?email=YOUR_EMAIL&license_key=YOUR_KEY"

Base UI flavor

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

This installs the block to components/beste/block/blog12.tsx, plus the badge and avatar shadcn/ui primitives it uses for the tag/eyebrow badges and the author avatars.

Quick start

The installed file exports blog12Demo alongside the block: the exact props behind the preview above. Spread it to get a working masonry blog grid in one line.

tsx
import { Blog12, blog12Demo } from "@/components/beste/block/blog12";

export default function Page() {
  return <Blog12 {...blog12Demo} />;
}

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

tsx
import { Blog12 } from "@/components/beste/block/blog12";

export default function Page() {
  return (
    <Blog12
      badge={{ label: "Explore", variant: "default" }}
      heading="Discover Articles"
      description="A curated collection of our best content."
      posts={[
        {
          image: { src: "/covers/design-systems.jpg", alt: "Design systems" },
          title: "The Future of Design Systems",
          summary: "How design systems evolve to meet complex web apps.",
          date: "January 15, 2026",
          readTime: "8 min read",
          author: {
            name: "Lisa Park",
            title: "Senior Developer",
            avatar: { src: "/avatars/lisa.jpg", alt: "Lisa Park" },
          },
          tags: [{ label: "Design", href: "/blog/design" }],
          href: "/blog/future-of-design-systems",
        },
      ]}
    />
  );
}

Props

PropTypeDefaultDescription
badge{ label: string; variant?: "default" | "secondary" | "outline" }–Optional centered eyebrow badge above the heading
headingstring–Section heading rendered as <h2>
descriptionstring–Muted sub-copy under the heading
postsBlogPost[][]Cards flowed through the CSS column grid
classNamestring–Extra classes merged onto 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 layout is pure CSS masonry via columns-1 sm:columns-2 lg:columns-3 with break-inside-avoid on each card, so card order flows top-to-bottom within each column and card heights vary with summary length; there is no JavaScript reflow or virtualization.
  • The full summary is always rendered with no line clamp, which is what drives the varying card heights that create the Pinterest effect; long summaries produce tall cards.
  • Only the first tag is shown: the card renders post.tags?.[0] alone, so any additional entries in a post's tags array are silently ignored.
  • Every clickable target (cover image, title, tag) is a next/link Link; when a post.href, tag.href, or nothing is provided it falls back to href="#", and author.href is accepted in the type but never wired to a link.
  • post.date is accepted in the BlogPost type but is never rendered; only readTime appears in the card footer, aligned opposite the author block.
  • The author avatar falls back to initials built from author.name.split(" ") first letters when no avatar image loads; if author is omitted the whole author block is hidden and the read time sits alone.
  • The header block is skipped entirely unless at least one of badge, heading, or description is provided, and badge.variant defaults to "default" when omitted.

More Blog blocks

View all Blog
PRO

blog52

Newsroom Masonry

PRO

blog43

Editorial Article Grid

PRO

blog48

Quad Grid

Get Pro access