Feature Voting Roadmap

Help Us Prioritize

You decide what we build first.

These are the features on the table for launch. Vote for the ones you need most and we'll ship in the order you set.

  • Offline mode

    Keep working when the connection drops, sync the moment it returns.

  • Native mobile app

    A full companion app for iOS and Android, not just a shrunken website.

  • Public API and webhooks

    Wire your data into the tools your team already runs on.

  • Dark theme

    An easy-on-the-eyes theme for the late shifts.

About this block

Feature Voting RoadmapPRO

A pre-launch feature-voting section with a centered square eyebrow and heading, and a list of upcoming feature cards each with a title, description, and an interactive upvote control that updates the count.

ComingSoon39: Feature Voting Roadmap

A pre-launch feature-voting section built on a single accent color, with a centered square eyebrow and heading, and a list of upcoming feature cards below, each with a title, a description, and an interactive upvote control that updates the visible count.

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/comingsoon39?email=YOUR_EMAIL&license_key=YOUR_KEY"

Base UI flavor

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

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

Quick start

The installed file exports comingsoon39Demo alongside the block: the exact props behind the preview above. Spread it to get a working voting list in one line.

tsx
import { ComingSoon39, comingsoon39Demo } from "@/components/beste/block/comingsoon39";

export default function Page() {
  return <ComingSoon39 {...comingsoon39Demo} />;
}

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

tsx
import { ComingSoon39 } from "@/components/beste/block/comingsoon39";

export default function Page() {
  return (
    <ComingSoon39
      label="Help Us Prioritize"
      heading="You decide what we build first."
      description="Vote for the features you need most and we'll ship in the order you set."
      features={[
        {
          title: "Offline mode",
          description: "Keep working when the connection drops, sync when it returns.",
          votes: 312,
        },
        {
          title: "Native mobile app",
          description: "A full companion app for iOS and Android, not a shrunken website.",
          votes: 268,
        },
      ]}
    />
  );
}

Props

PropTypeDefaultDescription
labelstring–Centered square eyebrow rendered above the heading via Badge6
headingstring–Centered section heading
descriptionstring–Supporting paragraph under the heading
featuresFeatureItem[][]Upcoming feature cards, each with its own upvote control
classNamestring–Extra classes for the outer <section>
ts
type FeatureItem = {
  title: string;
  description: string;
  votes: number;
};

Behavior notes

  • Each feature card has an interactive upvote button, not a form: clicking it toggles that card's index in local voted state, sets aria-pressed, and restyles the button with the accent color.
  • The displayed count is derived, not stored: it renders feature.votes plus one while the card is voted, so toggling adds or removes a single vote against the base votes number and nothing is persisted or sent anywhere.
  • The feature list renders only when features is non-empty, mapping each entry into a bordered bg-card row with the vote control on the left and the title and description on the right.
  • The centered eyebrow, heading, and description each render only when their prop is present.
  • The votes value is a number, and the title and description are plain text with no inline markup parsing, so HTML passed in shows as escaped text.

More Coming Soon blocks

View all Coming Soon
PRO

comingsoon78

Public Roadmap Coming Soon

PRO

comingsoon7

Launch Roadmap Timeline

PRO

comingsoon27

Launch Roadmap Columns

Get Pro access