A community gallery laid out as a masonry of customer photographs at mixed heights, each captioned with what is happening and the practice it came from.
A community gallery laid out as a masonry of customer photographs at mixed heights, each captioned with what is happening and the practice it came from.
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/social57"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/social57"This installs the block to components/beste/block/social57.tsx plus the badge23 and button21 components it uses for the eyebrow and the closing action.
The installed file exports social57Demo alongside the block: the exact props behind the preview above. Spread it to get a working gallery in one line.
import { Social57, social57Demo } from "@/components/beste/block/social57";
export default function GalleryPage() {
return <Social57 {...social57Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Social57 } from "@/components/beste/block/social57";
export default function GalleryPage() {
return (
<Social57
badge={{ label: "In the wild" }}
heading="Photographs from rooms we did not decorate"
description="Sent in by practices, published with their permission."
frames={[
{
src: "/wall/go-live.jpg",
alt: "A clinician smiling in a bright clinic",
caption: "Go-live morning, and nothing on fire",
place: "Bramble Health, Bristol",
tall: true,
},
{
src: "/wall/handover.jpg",
alt: "Two colleagues talking in a corridor",
caption: "The handover that used to be a phone call",
place: "Kingsway Clinic, Leeds",
},
]}
closing="Have one worth sending? We publish with a credit and never without asking."
button={{ label: "Send us a photograph", href: "/contact" }}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
badge | { label: string } | – | Eyebrow above the hairline rule, rendered through Badge23 |
heading | string | – | Section heading in the left column of the header |
description | string | – | Supporting paragraph, right-aligned from md up |
frames | Frame[] | [] | Photographs with captions, laid out as a masonry |
closing | string | – | Permission policy beside the closing action |
button | { label: string; href: string } | – | Outline submission action |
className | string | – | Extra classes for the outer section |
type ActionLink = {
label: string;
href: string;
};
type Frame = {
src: string;
alt: string;
caption: string;
place: string;
tall?: boolean;
};columns-1 sm:columns-2 lg:columns-3) rather than a grid, which is what lets frames of different heights pack without leaving gaps. Each figure carries break-inside-avoid so a photograph and its caption never split across a column.tall switches a frame from h-64 to h-96. The demo balances three tall and three short frames, which is what keeps the three columns roughly level at the bottom.lg that is exactly two per column.figure and figcaption pairs, so captions stay associated with their images.caption and place are separate, so the caption can describe the moment while the credit stays factual. Both are required, since publishing a customer photograph without a credit is what the closing note promises not to do.social53
A community credit section opening on three hairline figures, then naming each contributor in a hairline matrix of cards with their practice, what they changed, and how many reports they filed.
social58
A masonry of what readers wrote back, disagreements included, filtered by platform pills whose counts come from the responses themselves, over a hairline row of accounts to follow.
social48
A community section listing four linked places to join as full-width hairline rows, each with an icon tile, a description, a light membership figure, and an arrow that shifts on hover.
social50
A social section that gives one post an image tile of its own, floating a live post card with its engagement counts, beside the replies it drew as linked hairline rows.