Studio values laid out with oversized ghost numerals, titles, descriptions and keywords.
Operating-principles section with a split header (large heading left, vertical divider, eyebrow badge right) above a two-column list of values, each marked with an oversized ghost numeral, a keyword, a title, and a description.
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/agency12?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/agency12?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/agency12.tsx, the badge6 component it uses for the eyebrow label, and its dependencies.
The installed file exports agency12Demo alongside the block: the exact props behind the preview above. Spread it to get a working values section in one line.
import { Agency12, agency12Demo } from "@/components/beste/block/agency12";
export default function AboutPage() {
return <Agency12 {...agency12Demo} />;
}Then replace the demo with your own props. Written out, the same setup looks like this:
import { Agency12 } from "@/components/beste/block/agency12";
export default function AboutPage() {
return (
<Agency12
label="Operating Principles"
heading="The principles that hold every engagement together."
values={[
{
keyword: "Rigor",
title: "Evidence before instinct",
description: "We pressure-test every creative bet against real signal.",
},
{
keyword: "Restraint",
title: "Edit until it hurts",
description: "The strongest version is usually the one with the most cut away.",
},
]}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
label | string | – | Eyebrow label rendered via Badge6, right-aligned in the header |
heading | string | – | Large section heading, left-aligned in the header |
values | ValueItem[] | [] | Value entries rendered in the numbered grid |
className | string | – | Extra classes for the outer <section> |
type ValueItem = { title: string; description: string; keyword: string };md:grid-cols-[1fr_auto_1fr] grid with a hairline vertical divider (w-px bg-border) between the heading and the label column; the divider is hidden below md.01, 02, ...) is generated from its array index with String(index + 1).padStart(2, "0"), not from a field on the data, so reordering values renumbers automatically.select-none and starts at text-muted-foreground/30; hovering the value's article (via the group/agency12 class) brightens it to text-primary/40 as a subtle interactive cue.keyword renders above title as a small bold uppercase label in text-primary, functioning as a category tag distinct from the title itself.md:grid-cols-2; it does not adapt column count to values.length, so an odd number of entries leaves the last row with one item.agency11
Oversized editorial manifesto statement with emphasized phrases, principle chips and a founder signature.
agency16
Studio overview pairing facts, copy and highlight stats with a clean studio image.