Launch Readiness Progress

(In the final stretch)

Almost everything is in place.

We're deep in the last mile of building the studio. Leave your address and we'll bring you in the instant the bar fills.

Launch readiness0%
Design locked
Final testing
Opening day

We launch when it's ready, not a day before.

About this block

Launch Readiness ProgressPRO

A coming-soon section on a soft muted card with a monospace parenthetical eyebrow, a heading, a launch-readiness percentage that counts up with an animated progress bar, a build-status row, and a working email notify form.

ComingSoon50: Launch Readiness Progress

An Auralis coming-soon section on a soft muted card with a monospace parenthetical eyebrow, a heading, a launch-readiness percentage that counts up alongside an animated progress bar, a build-status row, and a working email notify form.

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.

Upgrade Now

Installation

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

bash
npx shadcn add "https://ui.beste.co/r/comingsoon50?email=YOUR_EMAIL&license_key=YOUR_KEY"

Base UI flavor

bash
npx shadcn add "https://ui.beste.co/r-base/comingsoon50?email=YOUR_EMAIL&license_key=YOUR_KEY"

This installs the block to components/beste/block/comingsoon50.tsx.

Quick start

The installed file exports comingsoon50Demo alongside the block: the exact props behind the preview above. Spread it to get a working readiness section in one line.

tsx
import { ComingSoon50, comingsoon50Demo } from "@/components/beste/block/comingsoon50";

export default function Page() {
  return <ComingSoon50 {...comingsoon50Demo} />;
}

Then replace the demo with your own props. Written out, a trimmed setup looks like this:

tsx
import { ComingSoon50 } from "@/components/beste/block/comingsoon50";

export default function Page() {
  return (
    <ComingSoon50
      badge={{ label: "In the final stretch" }}
      labels={{
        progressCaption: "Launch readiness",
        placeholder: "you@studio.com",
        success: "You're on the list. We'll write the moment we hit 100.",
        note: "We launch when it's ready, not a day before.",
      }}
      heading="Almost everything is in place."
      description="Leave your address and we'll bring you in the instant the bar fills."
      progress={87}
      statuses={[
        { label: "Design locked", done: true },
        { label: "Final testing", done: false },
        { label: "Opening day", done: false },
      ]}
    />
  );
}

Props

PropTypeDefaultDescription
badgeBadgeParenthetical eyebrow rendered via Badge7
labelsComingSoon50Labels{}Progress caption, form placeholder, success, and note
headingstringStatement heading
descriptionstringSupporting paragraph under the heading
progressnumber0Launch-readiness percentage, clamped to 0 through 100
statusesStatusItem[][]Build-status row of done and pending steps
classNamestringExtra classes for the outer <section>
ts
type StatusItem = {
  label: string;
  done?: boolean;
};

type Badge = {
  label: string;
};

type ComingSoon50Labels = {
  progressCaption?: string;
  placeholder?: string;
  success?: string;
  note?: string;
};

Behavior notes

  • The progress value is clamped to the 0 through 100 range before use, so out-of-range numbers still produce a valid bar.
  • An IntersectionObserver at threshold: 0.4 watches the progress block and flips a started flag the first time it scrolls into view, then disconnects, so the animation runs once.
  • Once started, a requestAnimationFrame loop with a cubic ease-out over 1400ms counts the percentage from zero up to the clamped value, while the bar width transitions from 0% to the clamped percent via a CSS transition-[width].
  • Because the count begins at zero and only ticks on the client, the figure renders as 0% until the observer fires.
  • Each statuses row renders a Check badge when done is true or a pulsing dot otherwise, and the row renders only when the array is non-empty.
  • The email form owns its own state; handleSubmit calls preventDefault and only flips to the success pill when the trimmed email is non-empty, and labels.note renders under the form only while it has not been submitted.

Wiring the form up

The form ships with local state and a success message but no backend, so submissions are not sent anywhere until you connect one. Point handleSubmit at your own route handler or email platform, or wire in a form library. For a walkthrough of the options, see React Hook Form, TanStack Form, and Formisch.

More Coming Soon blocks

View all Coming Soon
PRO

comingsoon19

Pre-Launch Manifesto

A pre-launch manifesto section on a soft muted card with a monospace parenthetical eyebrow, a large statement heading, and a three-column ruled list of numbered building principles above a follow-along pill button.

PRO

comingsoon61

Community Launch Waitlist

A community coming-soon section on a soft muted card with a monospace parenthetical eyebrow, a heading, a working email waitlist form, a secondary outline community pill button, and an avatar row with a member count.

PRO

comingsoon15

Waitlist Coming Soon

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.

FREE

comingsoon2

Development Progress Milestones

Coming soon section with a progress bar and milestone tracker showing development stages like Design, Backend, Frontend, and Testing. Perfect for keeping users informed about product development progress.

PRO

comingsoon32

Trusted By Waitlist

A centered pre-launch section with a monospace parenthetical eyebrow, a statement heading, a supporting paragraph, a waitlist pill button, and a captioned grayscale logo strip of early partners.

PRO

comingsoon65

What Happens Next Waitlist

A waitlist coming-soon section with a monospace parenthetical eyebrow, a heading, a working email notify form, and a three-step numbered process explaining what happens after signing up.