Since the first two rooms opened in 2019.
The point at which most people decide it is worth it.
Across the three practitioners who make up the studio.
English, Portuguese and Spanish, in the room or online.
An impact section where a serif heading settles in word by word beside a pill action, then four ruled columns of serif figures count up from zero as they enter the viewport, each with a small-caps label and a line of context, under a slowly drifting soft light.
Four figures in a ruled row: each counts up from zero when it reaches the viewport, above a small-caps label and a line explaining what the number actually measures.
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/stats76?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/stats76?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/stats76.tsx plus the button22 sliding-marker pill and the text1 word stagger it uses.
The installed file exports stats76Demo alongside the block: the exact props behind the preview above. Spread it to get a working stats section in one line.
import { Stats76, stats76Demo } from "@/components/beste/block/stats76";
export default function Page() {
return <Stats76 {...stats76Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Stats76 } from "@/components/beste/block/stats76";
export default function Page() {
return (
<Stats76
eyebrow="In numbers"
heading="Small rooms, a long list of people who came back."
button={{ label: "Read how we measure", href: "/method", tone: "outline" }}
stats={[
{ value: 2400, suffix: "+", label: "Sessions held", description: "Since the first two rooms opened in 2019." },
{ value: 91, suffix: "%", label: "Stay past session five", description: "The point at which most people decide it is worth it." },
]}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
eyebrow | string | – | Small-caps line above the heading |
heading | string | – | Section heading, rendered as an h2 through Text1 |
button | ActionButton | – | Pill action beside the heading |
stats | Stat[] | [] | Figures, four across from md |
className | string | – | Extra classes for the outer <section> |
type Stat = {
value: number;
suffix?: string;
label: string;
description: string;
};
type ActionButton = {
label: string;
href: string;
tone?: "primary" | "light" | "dark" | "outline";
};useInView is set to once, so scrolling back up does not replay it.tabular-nums with US thousands grouping, so 2400 reads as 2,400 and the row does not change width while the count climbs.md:border-l on every figure with md:first:border-l-0 unsetting the first, so a four-up row is separated without an outer line on either edge.md, so a two-column phone layout does not carry a stray vertical rule.dd with its label as the following dt inside a dl, so the number is the value and the label is the term describing it.description line is a plain paragraph rather than part of the definition pair, since it explains the measurement rather than naming it.0.12s stagger, so the row resolves left to right.stats77
A split statistics section: a portrait photograph drifting inside its frame on the left, and on the right a serif heading that settles in word by word, an intro, three ruled serif figures that count up as they enter the viewport, and a pill action.
stats78
A dark ink statistics band with film grain: a serif statement that settles in word by word beside a light sliding-marker pill, then four ruled columns of serif figures that count up from zero as they enter the viewport.
stats27
Magazine-style numbered list layout with large sequence numbers, stat values, and a sticky sidebar heading for an editorial feel.