# Pricing 1

> Three-tier pricing cards with highlighted Pro plan and feature lists.

A shadcn/ui block from the [@nusaiba](https://nusaiba.dev) registry, listed on [shadcn.exchange](https://shadcn.exchange/r/nusaiba/pricing-1).

- Page, with a live preview: https://shadcn.exchange/r/nusaiba/pricing-1
- Screenshot: https://abzjhwgwpdpz7ua5.public.blob.vercel-storage.com/shots/nusaiba/pricing-1-light-372e38d690e13142.png
- Registry item: https://nusaiba.dev/r/base-nova/pricing-1.json
- Categories: pricing
- Listed: 2026-10-13, source last changed 2026-10-13

## Install

```bash
npx shadcn@latest add https://nusaiba.dev/r/base-nova/pricing-1.json
```

Run it in a project that has shadcn/ui set up. It adds the files below and installs what they depend on.

## Dependencies

- npm packages: `motion`
- Registry items: `@nusaiba/foundation`, `button`, `badge`

## Files

### `registry/blocks/pricing/1/pricing-section.tsx`

```tsx
"use client";

import { CheckIcon } from "lucide-react";
import { motion } from "motion/react";
import { Badge } from "@/components/ui/badge";
import { Button } from "@/components/ui/button";
import { cn } from "@/lib/utils";
import { SectionShell, ContentRail } from "@/components/layout-contract";

const plans = [
	{
		name: "Starter",
		price: "$0",
		period: "forever",
		description: "For individuals exploring the platform.",
		features: ["Up to 3 projects", "Basic analytics", "Email support"],
		highlighted: false,
	},
	{
		name: "Pro",
		price: "$29",
		period: "per seat / mo",
		description: "For growing teams shipping every week.",
		features: [
			"Unlimited projects",
			"Advanced analytics",
			"Priority support",
			"SSO & audit logs",
		],
		highlighted: true,
	},
	{
		name: "Enterprise",
		price: "Custom",
		period: "contact us",
		description: "For organizations with advanced needs.",
		features: [
			"Everything in Pro",
			"Dedicated manager",
			"Custom SLAs",
			"On-premise option",
		],
		highlighted: false,
	},
];

export function PricingSection() {
	return (
		<SectionShell spacingMode="section">
			<ContentRail maxWidth="max-w-5xl" className="space-y-10">
				<div className="mx-auto max-w-2xl text-center">
					<h2 className="font-medium text-2xl tracking-tight md:text-4xl">
						Simple, transparent pricing
					</h2>
					<p className="mt-4 text-muted-foreground text-sm md:text-base">
						Start free, upgrade when your team grows. No hidden fees.
					</p>
				</div>

				<div className="grid gap-6 md:grid-cols-3">
					{plans.map((plan, index) => (
						<motion.div
							className={cn(
								"relative flex flex-col rounded-[var(--radius-md)] border p-6 md:p-8",
								plan.highlighted
									? "border-primary bg-primary/[0.03] shadow-sm"
									: "border-border bg-background",
							)}
							initial={{ opacity: 0, y: 20 }}
							key={plan.name}
							transition={{ delay: index * 0.08, duration: 0.45 }}
							viewport={{ once: true }}
							whileInView={{ opacity: 1, y: 0 }}
						>
							{plan.highlighted ? (
								<Badge className="absolute -top-2.5 left-6">Most popular</Badge>
							) : null}
							<p className="font-medium text-sm">{plan.name}</p>
							<div className="mt-3 flex items-baseline gap-1">
								<span className="font-medium text-3xl tracking-tight">{plan.price}</span>
								<span className="text-muted-foreground text-xs">{plan.period}</span>
							</div>
							<p className="mt-3 text-muted-foreground text-sm">{plan.description}</p>
							<ul className="mt-6 flex-1 space-y-3">
								{plan.features.map((feature) => (
									<li className="flex items-start gap-2 text-sm" key={feature}>
										<CheckIcon className="mt-0.5 size-4 shrink-0 text-primary" />
										{feature}
									</li>
								))}
							</ul>
							<Button
								className="mt-8 w-full"
								variant={plan.highlighted ? "default" : "outline"}
							>
								{plan.price === "Custom" ? "Contact sales" : "Get started"}
							</Button>
						</motion.div>
					))}
				</div>
			</ContentRail>
		</SectionShell>
	);
}
```
