A full article layout with a ruled byline row, a wide lead image, prose blocks that carry their own anchors, an accent-ruled pull quote, a closing tag row, and a contents rail that sticks beside the text on desktop.
A full article layout with a ruled byline row, a wide lead image, prose blocks that carry their own anchors, an accent-ruled pull quote, a closing tag row, and a contents rail that sticks beside the text on desktop.
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/post88?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/post88?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/post88.tsx and the badge6 component it uses for the eyebrow (installed to components/beste/component/badge6.tsx).
The installed file exports post88Demo alongside the block: the exact props behind the preview above. Spread it to get a working article page in one line.
import { Post88, post88Demo } from "@/components/beste/block/post88";
export default function ArticlePage() {
return <Post88 {...post88Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Post88 } from "@/components/beste/block/post88";
export default function ArticlePage() {
return (
<Post88
eyebrow="Practice"
title="The estimate is the design work nobody sees"
summary="Pricing a project is not admin you do after the thinking."
date="18 March 2026"
readTime="9 min read"
author={{
name: "Maria Santos",
title: "Partner",
avatar: { src: "/people/maria.jpg", alt: "Maria Santos" },
}}
featuredImage={{ src: "/covers/estimate.jpg", alt: "An estimate on a desk" }}
tocTitle="On this page"
content={[
{ type: "paragraph", content: "Every studio we know treats the estimate as the boring part." },
{
type: "heading",
content: "What a number is actually saying",
anchor: { title: "What a number is saying", id: "what-a-number-is-saying" },
},
{ type: "list", items: ["How long the problem is.", "How much you have solved before."] },
{ type: "quote", content: "If the first line of your estimate is free, you have already told the client which part you do not value." },
]}
tags={[{ label: "Pricing", href: "/subjects/pricing" }]}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
eyebrow | string | – | Badge6 label above the article title |
title | string | – | Article title, rendered as the page h1 |
summary | string | – | Standfirst under the title |
date | string | – | Publication date in the byline row |
readTime | string | – | Reading time, printed after the date |
author | Author | – | Name, role and portrait in the byline row |
featuredImage | FeaturedImage | – | Wide lead image under the byline |
tocTitle | string | – | Label above the contents rail |
content | ContentBlock[] | [] | The article body, block by block |
tags | Tag[] | [] | Subject links under the article |
className | string | – | Extra classes for the outer section |
type ContentBlock = {
type: "paragraph" | "heading" | "subheading" | "list" | "quote";
content?: string;
items?: string[];
anchor?: { title: string; id: string };
};
type Author = {
name: string;
title?: string;
avatar?: { src: string; alt: string };
};
type FeaturedImage = {
src: string;
alt: string;
};
type Tag = {
label: string;
href: string;
};anchor becomes an entry, and a heading without one simply does not appear in the rail.preventDefault and scroll with scrollIntoView({ behavior: "smooth" }), and the headings carry scroll-mt-24 so a sticky site header does not land on the title.lg:sticky lg:top-24 beside the text on desktop and order-first above it on smaller screens, where a sticky sidebar would be in the way.list blocks render as a real ul with accent markers, and quote blocks as a blockquote on an accent rule. Anything else falls through to a paragraph.article element with a single h1, so a page using this block should not carry another one.post87
A full article layout with an oversized light title, an author row framed by hairlines, a wide lead image, prose sections with accent-bulleted lists, an accent-ruled pull quote, and a closing share row.
post9
Two-column layout with main content on left and sticky author profile card on right with social links. Great for individual contributor articles.
post3
Full-width article with gradient overlay hero image, featured badge, and complete metadata. Ideal for flagship content that deserves prominent visual presentation.
post12
Two-column layout with main article and right sidebar containing related article cards with thumbnails. Perfect for discovery-focused content.