Podcast Launch Teaser

Podcast cover artwork with a studio microphoneSeason 1
New Podcast

In the Making

A weekly show about the messy middle of building things, hosted by our founders. First season drops the week we launch.

Listen onSpotifyAppleYouTube

First episodes

  • 01Why we almost didn't start38 min
  • 02Pricing is a feeling44 min
  • 03The week everything broke51 min
About this block

Podcast Launch TeaserPRO

A two-column podcast-launch section with an accent-badged square cover image beside a square eyebrow, show title, description, a dark seal subscribe button, platform links, and a ruled list of first episodes.

ComingSoon42: Podcast Launch Teaser

A Polaris two-column podcast-launch section with an accent-badged square cover image beside a square eyebrow, a show title, a description, a dark seal subscribe button with a Mic icon, a row of platform links, and a ruled numbered list of first episodes.

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

Base UI flavor

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

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

Quick start

The installed file exports comingsoon42Demo alongside the block: the exact props behind the preview above. Spread it to get a working podcast teaser in one line.

tsx
import { ComingSoon42, comingsoon42Demo } from "@/components/beste/block/comingsoon42";

export default function Page() {
  return <ComingSoon42 {...comingsoon42Demo} />;
}

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

tsx
import { ComingSoon42 } from "@/components/beste/block/comingsoon42";

export default function Page() {
  return (
    <ComingSoon42
      label="New Podcast"
      labels={{
        imageBadge: "Season 1",
        episodesTitle: "First episodes",
        listenCaption: "Listen on",
      }}
      heading="In the Making"
      description="A weekly show about the messy middle of building things."
      button={{ label: "Subscribe Now", href: "/subscribe" }}
      platforms={[
        { label: "Spotify", href: "/on/spotify" },
        { label: "Apple", href: "/on/apple" },
      ]}
      episodes={[
        { title: "Why we almost didn't start", length: "38 min" },
        { title: "Pricing is a feeling", length: "44 min" },
      ]}
      image={{ src: "/cover.jpg", alt: "Podcast cover artwork" }}
    />
  );
}

Props

PropTypeDefaultDescription
labelstring–Square eyebrow rendered above the heading via Badge6
labelsComingSoon42Labels{}Cover badge, episodes-list title, and listen-on caption
headingstring–Show title
descriptionstring–Supporting paragraph under the title
buttonActionLink–Dark seal subscribe link with a Mic icon via Button1
platformsActionLink[][]Inline platform links joined by a middot separator
episodesEpisodeItem[][]Ruled numbered list of first episodes
imageImageItem–Square cover image on the left with an optional accent badge
classNamestring–Extra classes for the outer <section>
ts
type EpisodeItem = {
  title: string;
  length: string;
};

type ActionLink = {
  label: string;
  href: string;
};

type ImageItem = {
  src: string;
  alt: string;
};

type ComingSoon42Labels = {
  imageBadge?: string;
  episodesTitle?: string;
  listenCaption?: string;
};

Behavior notes

  • The cover renders on the left only when image is set, as a plain <img> covering a square frame; labels.imageBadge overlays a bg-primary pill in the top-left corner when present.
  • The button renders as a real navigation via Button1 asChild wrapping a Next.js <Link href={button.href} /> with a Mic icon and the dark tone, so it points at a URL rather than firing a handler.
  • The platforms row renders each entry as a Next.js <Link> and joins them with a literal middot separator, prefixed by labels.listenCaption, only when the array is non-empty.
  • The episodes list renders only when non-empty, with each row drawn under border-t rules and numbered with a zero-padded index (01, 02), the title, and the length.
  • Every region is optional and every string is plain text with no inline markup parsing, so any HTML passed in shows as escaped text.

More Coming Soon blocks

View all Coming Soon
PRO

comingsoon33

Video Teaser Reveal

PRO

comingsoon53

Next Issue Magazine

PRO

comingsoon63

Product Pre-Order Teaser

Get Pro access