Product tour driven by pill tabs: each step pairs an explanation and a pill CTA with a soft interface panel built from divs, listing labelled rows with their value and current status.
Product tour driven by pill tabs. Each step pairs an explanation and a pill CTA with a soft interface panel built entirely from divs, listing labelled rows with their value and current status, so the tour needs no screenshots to stay current.
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/saas106?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/saas106?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/saas106.tsx plus the badge7 eyebrow and button12 pill button it uses.
The installed file exports saas106Demo alongside the block: the exact props behind the preview above. Spread it to get a working tour in one line.
import { Saas106, saas106Demo } from "@/components/beste/block/saas106";
export default function Page() {
return <Saas106 {...saas106Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Saas106 } from "@/components/beste/block/saas106";
export default function Page() {
return (
<Saas106
badge={{ label: "Inside the product" }}
heading="One screen for the work everyone keeps in spreadsheets."
description="The brief, the schedule and the invoice in the same place."
steps={[
{
label: "Briefs",
title: "Every brief written against the same spine",
description: "New work starts from a template your team can argue with.",
panelTitle: "Hallvard Press, catalogue",
panelCaption: "Brief completeness, 7 of 9 answered",
rows: [{ title: "Audience", value: "Independent booksellers", status: "Agreed" }],
},
]}
button={{ label: "Take the full tour", href: "/tour" }}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
badge | { label: string } | – | Eyebrow label rendered as a Badge7 |
heading | string | – | Section heading in the left column |
description | string | – | Supporting paragraph, right-aligned from md up |
steps | TourStep[] | [] | Each step is one pill tab, one explanation and one panel |
button | ActionButton | – | Pill CTA under the active explanation, rendered as Button12 |
className | string | – | Extra classes for the outer <section> |
type TourStep = {
label: string;
title: string;
description: string;
panelTitle: string;
panelCaption: string;
rows: PanelRow[];
};
type PanelRow = {
title: string;
value: string;
status: string;
};
type ActionButton = {
label: string;
href: string;
};useState(0), so the first step renders on the server and the panel is populated before hydration.<button type="button"> with aria-pressed and an explicit cursor-pointer, and switching never touches the URL.bg-muted rather than an image, so it never goes stale against the real product and costs nothing to load.border-current/10 rather than the page border token, which is the set's rule for hairlines inside a tinted surface: the rule inherits the panel's own text colour instead of fighting it.justify-between flex row: md:grid-cols-[minmax(0,10rem)_1fr_auto] fixes the label track so every value starts on the same x position and every status ends flush right, which a flex row cannot do once the labels differ in length.md the grid drops to two tracks with the status wrapping onto its own line, so a long value never squeezes the status into a single character per line.Agreed, Overdue or Held until Friday without the block owning a status enum or a colour scale.saas13
Comparison table showing features across Starter, Pro, and Enterprise tiers with checkmarks. Perfect for pricing pages that need clear feature differentiation.
saas104
A comparison section with an eyebrow over a hairline rule, a two-column heading, and a scrollable three-plan feature table with check, dash, and text cells and a highlighted plan column.
saas103
A reversed split with an image tile floating a live setup checklist on the left, and an eyebrow, light heading, checked bullets, and an accent button on the right.
saas14
Three-step onboarding process with numbered circles and connecting lines. Perfect for explaining product workflows or signup processes.