Masonry

Layout

Pinterest-style masonry grid layout.

Preview

Item 1
Item 2
Item 3
Item 4
Item 5
Item 6
Item 7
Item 8

Usage

example.jsx
import { Masonry } from "@/components/ui/masonry";

export default function Example() {
  return <Masonry />;
}

Source Code

Copy this file into components/ui/masonry.jsx in your project.

masonry.jsx
import { forwardRef } from "react";
import { cn } from "@/lib/utils";

const Masonry = forwardRef(({ className, columns = 3, gap = 4, children, ...props }, ref) => (
  <div
    ref={ref}
    className={cn(
      gap === 2 && "[column-gap:0.5rem]",
      gap === 4 && "[column-gap:1rem]",
      gap === 6 && "[column-gap:1.5rem]",
      gap === 8 && "[column-gap:2rem]",
      columns === 2 && "[column-count:2]",
      columns === 3 && "[column-count:3]",
      columns === 4 && "[column-count:4]",
      className
    )}
    {...props}
  >
    {Array.isArray(children)
      ? children.map((child, i) => (
          <div key={i} className="mb-4 break-inside-avoid">{child}</div>
        ))
      : children}
  </div>
));
Masonry.displayName = "Masonry";

export { Masonry };

Quick Install

Make sure you have the cn() utility set up. It requires clsx and tailwind-merge.

npm install clsx tailwind-merge