A social proof grid of six linked post cards, each with an avatar, handle, timestamp, the post itself, and reply, repost, and like counts under a hairline.
A social proof grid of six linked post cards, each with an avatar, handle, timestamp, the post itself, and reply, repost and like counts under a hairline.
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.
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/social49?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/social49?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/social49.tsx plus the badge23 and button21 components it uses for the eyebrow and the closing action.
The installed file exports social49Demo alongside the block: the exact props behind the preview above. Spread it to get a working grid in one line.
import { Social49, social49Demo } from "@/components/beste/block/social49";
export default function PostsPage() {
return <Social49 {...social49Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Social49 } from "@/components/beste/block/social49";
export default function PostsPage() {
return (
<Social49
badge={{ label: "Said in public" }}
heading="What practices posted without being asked to"
description="None of these were solicited and none were paid for."
posts={[
{
name: "Tom Ashby",
handle: "@tomashby",
avatar: { src: "/people/tom.jpg", alt: "Portrait of Tom Ashby" },
body: "Four clinics, one waiting list, and the first Monday in years where nobody rang round.",
time: "2h",
replies: "12",
reposts: "34",
likes: "218",
href: "https://example.com/post/1",
},
{
name: "Elena Rourke",
handle: "@elenarourke",
avatar: { src: "/people/elena.jpg", alt: "Portrait of Elena Rourke" },
body: "Eleven years of records moved over a weekend. I had budgeted three weeks.",
time: "1d",
replies: "31",
reposts: "96",
likes: "540",
href: "https://example.com/post/2",
},
]}
button={{ label: "Read them in full", href: "/testimonials" }}
/>
);
}| 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 |
posts | Post[] | [] | Post cards, three across from lg |
button | { label: string; href: string } | – | Centered outline action under the grid |
className | string | – | Extra classes for the outer section |
type ActionLink = {
label: string;
href: string;
};
type Post = {
name: string;
handle: string;
avatar: { src: string; alt: string };
body: string;
time: string;
replies: string;
reposts: string;
likes: string;
href: string;
};"1.2k" without the block needing to format anything. They use tabular-nums so the row stays steady.aria-hidden, which means a screen reader hears three bare numbers. If that matters for your use, add visually hidden labels in the installed file.Link with a hover fill, so the entire post is one target pointing at the original thread.flex flex-col with the body marked flex-1, so the engagement rows align along the bottom across every card in a row regardless of post length.min-w-0 with truncate on the name and handle, so a long handle ellipsizes rather than pushing the timestamp out of the row.border-t, so the rule belongs to the counts rather than sitting as a divider in the card.flex items-start justify-center. The items-start is load-bearing: without it the button would stretch vertically inside the centered flex row.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.
social2
Social media post with author info, text content, image, and interactive like/comment/share/bookmark buttons with counts. Perfect for feed-style content displays.
social46
Community group card with cover image, privacy status, member/post counts, topic tags, and join button. Perfect for community discovery and group suggestions.
social52
An upcoming sessions list with a date block, format, and remaining seats on each linked hairline row, beside a column that sticks and floats a live card for whoever is hosting next.