A pre-launch section on a full-bleed photograph under a dark gradient, with a light display heading, four oversized countdown figures between hairline rules, and a working email capture card.
A pre-launch section on a full-bleed photograph under a dark gradient, with a light display heading, four oversized countdown figures between hairline rules and a working email capture card.
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/comingsoon77?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/comingsoon77?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/comingsoon77.tsx, the form36 capture piece it centers under the countdown (installed to components/beste/piece/form36.tsx), and the badge23 component it uses for the eyebrow.
The installed file exports comingsoon77Demo alongside the block: the exact props behind the preview above. Spread it to get a working landing page in one line.
import { Comingsoon77, comingsoon77Demo } from "@/components/beste/block/comingsoon77";
export default function LaunchPage() {
return <Comingsoon77 {...comingsoon77Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Comingsoon77 } from "@/components/beste/block/comingsoon77";
import { Form36 } from "@/components/beste/piece/form36";
export default function LaunchPage() {
return (
<Comingsoon77
badge={{ label: "Opening soon" }}
heading="We open to every practice on 1 June"
description="Eleven clinics have been running on it for a year."
units={[
{ value: "12", label: "days" },
{ value: "06", label: "hours" },
{ value: "48", label: "minutes" },
{ value: "31", label: "seconds" },
]}
media={
<Form36
label="Get the launch note"
placeholder="you@practice.com"
submitLabel="Join"
finePrint="One email when we open."
/>
}
image={{ src: "/clinic/reception.jpg", alt: "A clinician in a bright clinic" }}
note="2,140 practice leads are already on the list."
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
badge | { label: string } | – | Centered eyebrow, retoned for the dark scrim |
heading | string | – | Display heading, rendered as the page h1 |
description | string | – | Centered supporting paragraph, capped at max-w-xl |
units | CountdownUnit[] | [] | Countdown figures with their unit labels |
media | ReactNode | – | Capture card under the countdown, form36 in the demo |
image | { src: string; alt: string } | – | Full-bleed photograph behind everything |
note | string | – | Small centered line under the capture card |
className | string | – | Extra classes for the outer section |
type BandImage = {
src: string;
alt: string;
};
type CountdownUnit = {
value: string;
label: string;
};units holds strings, and the block runs no timer, which keeps it safe to server-render with no hydration mismatch between the server's clock and the browser's. Wiring a live counter means adding state around this block."06" rather than 6, and tabular-nums keeps the columns from shifting as digits change.bg-foreground under the photograph, so a missing or slow image still leaves white text on a dark surface rather than an unreadable flash.from-foreground/95 to to-foreground/60), which is heaviest where the capture card sits, so the form stays legible over the busiest part of most photographs.border-y on the container and gap-px between cells, so the figures sit between two rules rather than inside a boxed table.sm, so a four-unit countdown never leaves a single orphan on its own line.py-20, then md:py-32) rather than the set's usual py-16 md:py-24, since it is designed to be the whole page rather than a section of one.Wiring the form up
The capture card is a presentational piece with no submit handling of its own. When you connect it to a real list, the patterns in React Hook Form, TanStack Form, and Formisch cover validation and submission for this shape of single-field form.
comingsoon18
A full-bleed image pre-launch hero with a dark overlay, a monospace parenthetical eyebrow, a small kicker, an oversized launch-date headline, a supporting line, and a light outline pill notify button.
comingsoon33
A full-bleed image pre-launch teaser with a dark overlay, a monospace parenthetical eyebrow, a central play button that opens the teaser video in a modal, a heading and supporting line, and a light outline waitlist pill button.
comingsoon63
A product launch coming-soon section with a full-height product image beside a monospace parenthetical eyebrow, a product name, a tagline, a ship date, a working notify email form, and a spec grid.
comingsoon16
A two-column pre-launch section with a monospace parenthetical eyebrow, an oversized headline, a working rounded email-capture form with a success state, an avatar social-proof row, and a tall full-bleed image carrying a floating launch label.