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.
A band of numbers on the ink surface under film grain: a wide statement beside a pale pill, then four figures that count up along a ruled row.
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/stats78?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/stats78?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/stats78.tsx plus the button22 sliding-marker pill and the text1 word stagger it uses.
The installed file exports stats78Demo alongside the block: the exact props behind the preview above. Spread it to get a working stats band in one line.
import { Stats78, stats78Demo } from "@/components/beste/block/stats78";
export default function Page() {
return <Stats78 {...stats78Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Stats78 } from "@/components/beste/block/stats78";
export default function Page() {
return (
<Stats78
heading="Seven years, three chairs, and the numbers that matter to us."
button={{ label: "How we count", href: "/method", tone: "light" }}
figures={[
{ value: 7, label: "Years in practice" },
{ value: 3200, suffix: "+", label: "Sessions since 2019" },
{ value: 88, suffix: "%", label: "Would recommend us" },
]}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
heading | string | – | The statement, rendered as an h2 through Text1 |
button | ActionButton | – | Pill action, defaulting to the light tone on this dark band |
figures | Figure[] | [] | Figures, four across from md |
className | string | – | Extra classes for the outer <section> |
type Figure = {
value: number;
suffix?: string;
label: string;
};
type ActionButton = {
label: string;
href: string;
tone?: "primary" | "light" | "dark" | "outline";
};stagger={0.04} and is set one step smaller than its siblings, because it carries a full sentence rather than a phrase.button falls back to the light tone rather than primary, which is right on a dark band: an unspecified button comes out pale instead of taking the brand colour.md:border-l with md:first:border-l-0 unsetting the first, drawn against background/20 for the dark surface, so a four-up row is separated without an outer line.tabular-nums with thousands grouping, so the row does not shift while the numbers climb.useInView is set to once, so scrolling back up does not replay the count.useId, so two grain surfaces on one page cannot collide on a global SVG id.stats76
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.
stats64
An oversized monochrome stat band with rule-divided figures and editorial labels beneath each.
stats27
Magazine-style numbered list layout with large sequence numbers, stat values, and a sticky sidebar heading for an editorial feel.