Toggle Pricing

Fees

Payasyougo,orcommittoaseason.

A season saves roughly one session's worth.

Coaching

$70per session

Structured, forward-facing, with a written plan.

  • 60-minute sessions
  • A plan we revisit monthly
  • Voice notes between sessions

Therapy

$65per session

Long-term work with one steady practitioner.

  • 60 or 75-minute sessions
  • A written note after each session
  • Pause without losing your slot

Couples

$95per session

Fortnightly, seventy-five minutes, always in the room.

  • 75-minute sessions
  • One practitioner for both of you
  • A shared note after each session
About this block

Toggle PricingPRO

Three pricing cards under a centred serif heading that settles in word by word, with a pill toggle between paying per session and committing to a season: the serif prices blur out and in as it switches, and each card ends in a sliding-marker pill.

Pricing78: Toggle Pricing

A pricing grid with a pill toggle above it: switching between paying per session and a season blurs each price out and the new one in, without anything else on the card moving.

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

Base UI flavor

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

This installs the block to components/beste/block/pricing78.tsx plus the button22 sliding-marker pill and the text1 word stagger it uses.

Quick start

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

tsx
import { Pricing78, pricing78Demo } from "@/components/beste/block/pricing78";

export default function Page() {
  return <Pricing78 {...pricing78Demo} />;
}

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

tsx
import { Pricing78 } from "@/components/beste/block/pricing78";

export default function Page() {
  return (
    <Pricing78
      eyebrow="Fees"
      heading="Pay as you go, or commit to a season."
      toggle={{
        single: "Session by session",
        season: "A season of twelve",
        note: "A season saves roughly one session's worth.",
      }}
      plans={[
        {
          name: "Therapy",
          single: "$65",
          season: "$58",
          description: "Long-term work with one steady practitioner.",
          features: ["60 or 75-minute sessions", "A written note after each session"],
          button: { label: "Choose therapy", href: "/therapy", tone: "light" },
          featured: true,
        },
      ]}
      labels={{ perSession: "per session" }}
    />
  );
}

Props

PropTypeDefaultDescription
eyebrowstringSmall-caps line above the heading
headingstringSection heading, rendered as an h2 through Text1
toggle{ single: string; season: string; note: string }The two pill labels and the line under them
plansPlan[][]Plan cards, three across from md
labels{ perSession?: string }{}Suffix beside the price
classNamestringExtra classes for the outer <section>
ts
type Plan = {
  name: string;
  single: string;
  season: string;
  description: string;
  features: string[];
  button: ActionButton;
  featured?: boolean;
};

type ActionButton = {
  label: string;
  href: string;
  tone?: "primary" | "light" | "dark" | "outline";
};

Behavior notes

  • Each plan carries both prices, so the toggle is a presentation choice rather than a second set of plans; there is no way for the two states to fall out of sync.
  • The price is absolutely positioned inside a sized wrapper and keyed on the toggle state, so the outgoing figure blurs out while the incoming one blurs in and nothing below the price shifts during the swap.
  • Prices are set in tabular-nums, so a two-digit and a three-digit figure occupy predictable width across the row.
  • The toggle is two buttons carrying aria-pressed, not a switch: both options are named, which is the honest shape when the second one changes the price.
  • The section opens on the per-session price (season starts false), so the first number a visitor sees is the one they would pay without committing.
  • featured marks one card as the ink surface; its muted text is written against background tokens rather than the adaptive ones.
  • Each card's button carries mt-auto, so the three actions stay on one line however uneven the feature lists are.

More Pricing blocks

View all Pricing
PRO

pricing79

Three Plans Toggle

Three plan cards under a centred serif headline that settles in word by word and a monthly or yearly pill switch whose ink marker slides between the two; prices blur to their new value, a small saving note appears on yearly, the middle plan sits in ink, and each card ends in a full-width sliding-marker pill.

PRO

pricing75

Season Pricing

Three pricing tiers under a centred serif heading that settles in word by word: two soft muted cards and a featured card set on a photograph with a dark scrim and film grain, each with a serif price, a cadence line, a check list and a sliding-marker pill.

PRO

pricing71

Three Tiers With Billing Toggle

A three-tier pricing grid whose monthly and yearly toggle swaps both the light figure and the billing note on every card, with the recommended tier outlined in the accent.

PRO

pricing61

Billing Toggle Pricing

Three plans with a monthly/yearly billing toggle and feature lists.

PRO

pricing6

Billing Toggle Pricing

Three-tier pricing table with monthly/yearly billing toggle and popular plan badge. Perfect for SaaS products with tiered subscription plans.

PRO

pricing77

Two Plans Aside

A two-plan pricing section: a sticky column with a serif heading that settles in word by word, an intro and a reduced-fee note, beside two cards, one soft muted and one ink, each with a serif price, a check list and a sliding-marker pill.