A centered pre-launch section with a square eyebrow, a heading, a supporting line, a row of accent statistics that count up when scrolled into view, and a dark seal claim-seat button.
A centered Polaris pre-launch section with a square eyebrow, a heading, a supporting line, a row of accent statistics that count up when scrolled into view, and a dark seal claim-seat button.
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/comingsoon45?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/comingsoon45?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/comingsoon45.tsx.
The installed file exports comingsoon45Demo alongside the block: the exact props behind the preview above. Spread it to get a working animated stats section in one line.
import { ComingSoon45, comingsoon45Demo } from "@/components/beste/block/comingsoon45";
export default function Page() {
return <ComingSoon45 {...comingsoon45Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { ComingSoon45 } from "@/components/beste/block/comingsoon45";
export default function Page() {
return (
<ComingSoon45
label="The Waitlist So Far"
heading="The room is filling up fast."
description="Thousands of makers have already claimed a seat."
button={{ label: "Claim Your Seat", href: "/waitlist" }}
stats={[
{ value: 8400, suffix: "+", label: "On the waitlist today" },
{ value: 62, suffix: " countries", label: "Signed up worldwide" },
{ value: 40, suffix: "%", label: "Founder discount locked in" },
]}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
label | string | – | Square eyebrow rendered above the heading via Badge6 |
heading | string | – | Centered section heading |
description | string | – | Supporting paragraph under the heading |
button | ActionLink | – | Dark seal claim-seat link rendered via Button1 |
stats | StatItem[] | [] | Accent figures that count up when scrolled into view |
className | string | – | Extra classes for the outer <section> |
type StatItem = {
value: number;
suffix?: string;
prefix?: string;
label: string;
};
type ActionLink = {
label: string;
href: string;
};IntersectionObserver at threshold: 0.4 watches the stat row and flips a started flag the first time it scrolls into view, then disconnects, so each figure animates once.requestAnimationFrame loop with a cubic ease-out over 1400ms to count from zero up to its value, rendering prefix, the running number via toLocaleString("en-US"), and suffix.0 until the observer fires; there is no email form on this block.stats is non-empty, and the eyebrow, heading, description, and button each render only when their prop is present.button renders as a real navigation via Button1 asChild wrapping a Next.js <Link href={button.href} /> with the dark tone, so it points at a URL rather than firing a handler.comingsoon15
A centered pre-launch section with an eyebrow, a large light heading, a paragraph, an image tile holding a working email-capture form with a success state, and a social-proof note.
comingsoon36
A centered pre-launch section with a square eyebrow, an accent-highlighted heading, a large colon-separated live countdown clock, a working email-capture form with a success state, and an avatar social-proof row.
comingsoon21
A centered waitlist section with a square eyebrow, a bold accent-highlighted heading, a working rounded email-capture form with a success state, and an avatar row with a live signup counter.
comingsoon6
Coming soon section with an email waitlist input, stacked subscriber avatars, and a live join count. Perfect for building early traction and social proof before launch.