Three-Step How-To

How it works

Ship your next release in three steps

Each step shows the surface you'll touch — a real asset, not a mockup — so the workflow stays grounded in what your team actually sees.

Drop in your assets

Upload designs, brand guidelines, or reference images. The upload card tracks progress so the team knows when it's safe to start.

brand-guidelines.pdf12.4 MB · 68%

Plan the release window

A single calendar tile keeps the launch date front and center. Tone reflects whether you're on track or running hot.

APR
21Tuesday

Ship the change

One copy-and-paste command pushes the release. The terminal pill drops into changelogs and onboarding docs without extra wiring.

pnpm dlx shadcn@latest add feature9
About this block

Three-Step How-ToFREE

Three side-by-side step cards with a media surface anchored to the bottom of each card. Each slot accepts an image, video, or live registry-component asset.

Feature9: Three-Step How-To

Centered header above three side-by-side step cards, each with its media surface pinned to the bottom of the card so uneven copy lengths still align the media row across all three cards. Each step's media slot follows the Media Slot Standard.

Free block

This block is free. No license or account is required: install it with the CLI and use it in unlimited projects.

Installation

Radix flavor

bash
npx shadcn add "https://ui.beste.co/r/feature9"

Base UI flavor

bash
npx shadcn add "https://ui.beste.co/r-base/feature9"

This installs the block to components/beste/block/feature9.tsx, the shadcn/ui badge component it depends on, and the calendar1, terminal2, and upload1 pieces it embeds as media-slot fillers (installed to components/beste/piece/{name}.tsx).

Quick start

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

tsx
import { Feature9, feature9Demo } from "@/components/beste/block/feature9";

export default function Page() {
  return <Feature9 {...feature9Demo} />;
}

Then replace the demo with your own props. Written out, a trimmed setup mixing an image card and a live-asset card looks like this:

tsx
import { Terminal2 } from "@/components/beste/piece/terminal2";
import { Feature9 } from "@/components/beste/block/feature9";

export default function Page() {
  return (
    <Feature9
      badge={{ label: "How it works", variant: "outline" }}
      heading="Ship your next release in three steps"
      description="Each step shows the surface you'll actually touch."
      cards={[
        {
          title: "Review the design",
          description: "A screenshot of the finished mockup handed off to engineering.",
          media: {
            type: "image",
            src: "https://images.unsplash.com/photo-1517694712202-14dd9538aa97?w=1200&h=900&fit=crop",
            alt: "Code on screen",
          },
        },
        {
          title: "Ship the change",
          description: "One copy-and-paste command pushes the release.",
          media: { type: "component", component: <Terminal2 command="pnpm dlx shadcn@latest add feature9" /> },
        },
      ]}
    />
  );
}

Props

PropTypeDefaultDescription
badge{ label: string; variant?: "default" | "secondary" | "outline" }Badge above the heading
headingstringSection heading
descriptionstringSection intro text
cardsStepCard[][]Step cards, rendered side by side
classNamestringExtra classes for the outer <section>
ts
type StepCard = {
  title: string;
  description: string;
  media: StepMedia;
};

type StepMedia =
  | { type: "image"; src: string; alt?: string }
  | { type: "video"; src: string; alt?: string }
  | {
      type: "component";
      component: React.ReactNode;
      background?: ComponentBackground;
    };

type ComponentBackground =
  | { type: "dots" }
  | { type: "none" }
  | { type: "image"; src: string; alt?: string }
  | { type: "video"; src: string; alt?: string };

Behavior notes

  • Cards lay out md:flex-row (column on mobile) and cap at md:w-[350px]; each card's media is pushed to the bottom via mt-auto pt-4, so the three cards' media rows stay aligned even when the title/description text runs to different lengths.
  • The second demo card ("Plan the release window") sets background: { type: "none" } on its component media, opting out of the dotted-grid default so the embedded Calendar1 piece sits directly on the card's own surface, the only demo item in this batch that uses the none background variant.
  • The media surface itself uses bg-card (matching the card's own background), not the bg-muted/30 panel used in feature1/feature2/feature8, so the media area blends into the card instead of reading as a distinct tinted panel.
  • There is no buttons/CTA prop on this block at all; it stops at badge, heading, description, and the three step cards.

More Feature blocks

View all Feature
FREE

feature194

Three Cards With Asset Media

Three feature cards that swap an icon for a real micro-asset: a bar chart, a before/after stat, and a terminal prompt. Demonstrates how registry-pieces drop into block media slots.

FREE

feature8

Capability Carousel

Looping carousel of capability cards with a centered media slot per card. Each slot accepts an image, video, or live registry-component asset.

PRO

feature251

Deliverable Cards With Media

Three soft cards, each floating its own media piece over a dotted field before an eyebrow, a title, an explanation and a ruled delivery note, laid out as a plain grid with no horizontal scrolling.

PRO

feature309

Linked Step Cards

Three numbered cards on a muted fill, each one a whole link that inverts to ink on hover, carrying a serif title, a paragraph of what happens at that step and a closing arrow link.

PRO

feature185

Image Feature Cards Grid over Media

Three-column image feature cards grid with sticky header over background media and glass-morphism styling

PRO

feature265

Staircase Asset Trio

A feature whose three image tiles step down the page in a staircase on large screens, each floating a different live asset above a small kicker, title, and paragraph.