Responsive three-column image gallery with hover zoom effects, captions, and optional clickable cards. Perfect for showcasing project portfolios or work samples.
Responsive photo grid for a portfolio or case-study page: up to three columns of image cards with an optional caption, each card zooming its image slightly on hover, and rendering as a real link whenever an href is supplied.
Free block
This block is free. No license or account is required: install it with the CLI and use it in unlimited projects.
Radix flavor
npx shadcn add "https://ui.beste.co/r/showcase3"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/showcase3"This installs the block to components/beste/block/showcase3.tsx and the badge shadcn/ui primitive it depends on.
The installed file exports showcase3Demo alongside the block: the exact props behind the preview above. Spread it to get a working gallery in one line.
import { Showcase3, showcase3Demo } from "@/components/beste/block/showcase3";
export default function WorkPage() {
return <Showcase3 {...showcase3Demo} />;
}Then replace the demo with your own props. Written out, the same setup looks like this:
import { Showcase3 } from "@/components/beste/block/showcase3";
export default function WorkPage() {
return (
<Showcase3
heading="See our work in action"
description="Browse through our collection of successful projects."
images={[
{
src: "https://images.unsplash.com/photo-1565768502719-571073a68b4c?w=500&fit=crop",
alt: "Enterprise dashboard",
caption: "Enterprise Dashboard",
href: "https://beste.co",
},
{
src: "https://images.unsplash.com/photo-1583265101492-bfe6ef35cef8?w=500&fit=crop",
alt: "Mobile app",
caption: "Mobile Application",
},
]}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
badge | { label: string; variant?: "default" | "secondary" | "outline" } | – | Optional badge above the heading |
heading | string | – | Section heading |
description | string | – | Section intro text |
images | GalleryItem[] | [] | Grid tiles, in order |
className | string | – | Extra classes for the outer <section> |
type GalleryItem = {
src: string;
alt: string;
caption?: string;
href?: string;
};md:grid-cols-2 lg:grid-cols-3), not a data-driven column count.<Link> when image.href is set and as a plain <div> when it's omitted, sharing identical visual chrome either way, so mixing linked and non-linked tiles in the same grid is supported.scale-105) is driven by the named group group/showcase3 on the card wrapper, so it works the same whether the wrapper is a link or a div.image.caption is present; captionless tiles are just the image with no text area beneath it.images is empty.showcase42
An asymmetric mosaic image gallery with mixed-span tiles and monospace frame captions.
showcase41
A ruled, type-forward project index where each row reveals a floating thumbnail on hover.
showcase37
Horizontally scrollable row of wide product showcase frames with captions.
showcase1
Full-width image showcase with clickable animated hotspots that reveal feature popovers with icons and descriptions. Perfect for product tours and interactive feature demonstrations.
showcase7
Two-column section combining product image with large customer quote, author avatar, name, and role. Perfect for social proof sections alongside product visuals.