# Beste UI

> Beautiful, accessible blocks, pieces and components for shadcn/ui and Tailwind CSS, built for React and Next.js. Install one with the shadcn CLI and the code is yours to edit: no runtime dependency, nothing to upgrade.

Markdown rendition of https://ui.beste.co/block/saas106. Every page on the site has one: add `.md` to any address, or send `Accept: text/markdown`.

Last updated: 2026-07-29

Whole catalog for LLMs: https://ui.beste.co/llms.txt. Registry index: https://ui.beste.co/r/registry.json

---
1. /
2. [Blocks](/blocks)
3. /
4. [SaaS](/blocks/saas)
5. /
6. Product Tour Switcher

# Product Tour Switcher[PRO](/pricing)

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.

ViewCodeDocs

Base UI

![](https://oud.pics/sm/l/npm.svg)`npx shadcn add https://ui.beste.co/r-base/saas106`

## Saas106: Product Tour Switcher

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.

[Upgrade NowUpgrade Now](/pricing)

### Installation

Swap `YOUR_EMAIL` and `YOUR_KEY` for the email and license key on your account. Find your license key on your [account page](/account).

**Radix flavor**

bashCopy

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

**Base UI flavor**

bashCopy

```
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.

### Quick start

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.

tsxCopy

```
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:

tsxCopy

```
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" }}
    />
  );
}
```

### Props

| 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>                       |

tsCopy

```
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;
};
```

### Behavior notes

* The active step lives in `useState(0)`, so the first step renders on the server and the panel is populated before hydration.
* Tabs are `<button type="button">` with `aria-pressed` and an explicit `cursor-pointer`, and switching never touches the URL.
* The interface panel is drawn with plain divs on `bg-muted` rather than an image, so it never goes stale against the real product and costs nothing to load.
* Panel rows use `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.
* Rows are a grid, not a `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.
* Below `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.
* Row status is free text, so a row can say `Agreed`, `Overdue` or `Held until Friday` without the block owning a status enum or a colour scale.
* The button is a single prop shared by every step rather than one per step, which keeps the primary action stable while the tour content changes.

## More SaaS blocks

[View all SaaS](/blocks/saas)

[](/block/saas13)

PRO

saas13

### Plan Comparison Table

Comparison table showing features across Starter, Pro, and Enterprise tiers with checkmarks. Perfect for pricing pages that need clear feature differentiation.

[](/block/saas104)

PRO

saas104

### Plan Comparison Table

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.

[](/block/saas103)

PRO

saas103

### Onboarding Split

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.

[](/block/saas14)

PRO

saas14

### How It Works Steps

Three-step onboarding process with numbered circles and connecting lines. Perfect for explaining product workflows or signup processes.

[](/block/saas98)

PRO

saas98

### SaaS Interface Split

Feature split pairing a focused pitch with a built monochrome app-window mockup of skeletons, nav, and metrics.

[](/block/saas107)

PRO

saas107

### Trust And Compliance Ledger

Security section pairing four ruled pillars with circular icons and a labelled row of measured figures such as uptime and support response, closed by a caveat note beside an outline pill CTA.

## Ship the interface, keep the code.

New blocks, pieces and components every week. Install one with a command and it is yours to edit. No runtime dependency, no upgrade path to fight.

[Browse the libraryBrowse the library](/blocks)[See pricingSee pricing](/pricing)

### Library

* [Blocks](/blocks)
* [Pages](/pages)
* [Pieces](/pieces)
* [Components](/components)
* [Search](/search)

### Learn

* [Docs](/docs)
* [AI & MCP](/docs/mcp)
* [Blog](/blog)
* [Free tools](/tools)
* [What's new?](/changelog)
* [Website Builder](https://beste.co)

### More

* [Pricing](/pricing)
* [Referrals](/referrals)
* [License](/license)
* [GitHub](https://github.com/beste-co/beste-ui)

### Shadcn Blocks

* [Shadcn Hero Blocks](/blocks/hero)
* [Shadcn Feature Blocks](/blocks/feature)
* [Shadcn Pricing Blocks](/blocks/pricing)
* [Shadcn CTA Blocks](/blocks/cta)
* [Shadcn FAQ Blocks](/blocks/faq)
* [Shadcn About Blocks](/blocks/about)
* [Shadcn Stats Blocks](/blocks/stats)
* [Shadcn Footer Blocks](/blocks/footer)
* [Shadcn Navigation Blocks](/blocks/navigation)
* [Shadcn Auth Blocks](/blocks/auth)
* [Shadcn Ecommerce Blocks](/blocks/ecommerce)
* [Shadcn Portfolio Blocks](/blocks/portfolio)
* [Shadcn Showcase Blocks](/blocks/showcase)
* [Shadcn Careers Blocks](/blocks/careers)
* [Shadcn Onboarding Blocks](/blocks/onboarding)
* [Shadcn Coming Soon Blocks](/blocks/coming-soon)
* [Shadcn Post Blocks](/blocks/post)
* [Shadcn Legal Blocks](/blocks/legal)
* [Shadcn Workflow Blocks](/blocks/workflow)
* [Shadcn News Blocks](/blocks/news)

© 2026, [Beste](https://beste.co). All rights reserved.