A newsletter tool priced by list size, where each plan stops at its cap and the next one takes over.
registry/demos/plan-fit-audience-demo.tsx
"use client";
import { PlanFit, type PlanFitPlan } from "@/components/ui/plan-fit";
// A newsletter tool priced by list size. No overage: each plan stops at its
// cap, so a plan the list has outgrown fades and the next one takes over.
const PLANS: PlanFitPlan[] = [
{
id: "starter",
name: "Starter",
pitch: "Your first issue, and the hundred after it.",
price: 0,
included: 1000,
caption: "Free forever",
features: ["Unlimited sends", "Signup forms", "Tinta badge in the footer"],
cta: { label: "Start writing", href: "#start" },
},
{
id: "creator",
name: "Creator",
pitch: "For writers turning readers into a business.",
price: 15,
included: 10000,
caption: "Billed monthly",
features: ["Paid subscriptions", "Your own domain", "Referral rewards"],
cta: { label: "Go Creator", href: "#creator" },
},
{
id: "publisher",
name: "Publisher",
pitch: "For a masthead with editors and sponsors.",
price: 59,
included: 50000,
caption: "Billed monthly",
features: ["Five editor seats", "Sponsor slots", "Priority sending"],
cta: { label: "Go Publisher", href: "#publisher" },
},
];
export function PlanFitAudienceDemo() {
return (
<div className="w-full max-w-4xl">
<PlanFit
plans={PLANS}
unit="subscribers"
readoutLabel="readers on your list"
defaultValue={2400}
period="/mo"
fitLabel="Your plan"
className="[--plan-fit-accent-ink:#ffffff] [--plan-fit-accent:#2f5bff] dark:[--plan-fit-accent-ink:#ffffff] dark:[--plan-fit-accent:#5b7cff]"
/>
</div>
);
}
Live preview, examples and props: https://keyframeui.com/components/plan-fit#plan-fit-audience-demo