155 lines
4.8 KiB
TypeScript
155 lines
4.8 KiB
TypeScript
import Link from "next/link"
|
|||
|
|
import { Check, Zap } from "lucide-react"
|
||
|
|
import { cn } from "@/lib/utils"
|
||
|
|
|
||
|
|
const plans = [
|
||
|
|
{
|
||
|
|
name: "Starter",
|
||
|
|
price: "Free",
|
||
|
|
interval: "",
|
||
|
|
description: "For landlords just getting started.",
|
||
|
|
highlight: false,
|
||
|
|
cta: "Get started free",
|
||
|
|
ctaHref: "/signup",
|
||
|
|
features: [
|
||
|
|
"1 property",
|
||
|
|
"Up to 3 tenants",
|
||
|
|
"100 MB document storage",
|
||
|
|
"Rent tracking",
|
||
|
|
"Maintenance requests",
|
||
|
|
"Lease tracking",
|
||
|
|
"Tenant portal",
|
||
|
|
],
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name: "Pro",
|
||
|
|
price: "$29",
|
||
|
|
interval: "/mo",
|
||
|
|
description: "For active landlords managing multiple properties.",
|
||
|
|
highlight: true,
|
||
|
|
badge: "Most popular",
|
||
|
|
cta: "Start Pro",
|
||
|
|
ctaHref: "/signup",
|
||
|
|
features: [
|
||
|
|
"Up to 10 properties",
|
||
|
|
"Unlimited tenants",
|
||
|
|
"5 GB document storage",
|
||
|
|
"AI rent receipts (50/mo)",
|
||
|
|
"AI maintenance reports",
|
||
|
|
"Automated rent reminders",
|
||
|
|
"Stripe payment links",
|
||
|
|
"Lease expiry alerts",
|
||
|
|
],
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name: "Landlord",
|
||
|
|
price: "$59",
|
||
|
|
interval: "/mo",
|
||
|
|
description: "For serious portfolios that need full power.",
|
||
|
|
highlight: false,
|
||
|
|
cta: "Start Landlord",
|
||
|
|
ctaHref: "/signup",
|
||
|
|
features: [
|
||
|
|
"Unlimited properties",
|
||
|
|
"Unlimited tenants",
|
||
|
|
"25 GB document storage",
|
||
|
|
"AI calls (200/mo)",
|
||
|
|
"Team access",
|
||
|
|
"White-label tenant portal",
|
||
|
|
"Priority support",
|
||
|
|
],
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name: "Lifetime",
|
||
|
|
price: "$199",
|
||
|
|
interval: " one-time",
|
||
|
|
description: "Pay once, own it forever.",
|
||
|
|
highlight: false,
|
||
|
|
badge: "Best value",
|
||
|
|
cta: "Get lifetime access",
|
||
|
|
ctaHref: "/signup",
|
||
|
|
features: [
|
||
|
|
"Everything in Landlord",
|
||
|
|
"No recurring fees — ever",
|
||
|
|
"All future updates included",
|
||
|
|
"White-label tenant portal",
|
||
|
|
"Team access",
|
||
|
|
"25 GB document storage",
|
||
|
|
],
|
||
|
|
},
|
||
|
|
]
|
||
|
|
|
||
|
|
export function Pricing() {
|
||
|
|
return (
|
||
|
|
<section id="pricing" className="py-24">
|
||
|
|
<div className="mx-auto max-w-6xl px-6">
|
||
|
|
<div className="mb-14 text-center">
|
||
|
|
<p className="mb-3 text-sm font-semibold uppercase tracking-widest text-indigo-400">Pricing</p>
|
||
|
|
<h2 className="text-3xl font-bold text-white sm:text-4xl">Simple, honest pricing</h2>
|
||
|
|
<p className="mx-auto mt-4 max-w-lg text-white/50">
|
||
|
|
Start free, upgrade when you grow. No hidden fees, no per-unit charges.
|
||
|
|
</p>
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<div className="grid gap-5 sm:grid-cols-2 lg:grid-cols-4">
|
||
|
|
{plans.map((plan) => (
|
||
|
|
<div
|
||
|
|
key={plan.name}
|
||
|
|
className={cn(
|
||
|
|
"relative flex flex-col rounded-2xl border p-6",
|
||
|
|
plan.highlight
|
||
|
|
? "border-indigo-500/50 bg-indigo-600/10 shadow-xl shadow-indigo-600/10"
|
||
|
|
: "border-white/[0.06] bg-[#16161f]"
|
||
|
|
)}
|
||
|
|
>
|
||
|
|
{plan.badge && (
|
||
|
|
<div className="absolute -top-3 left-1/2 -translate-x-1/2">
|
||
|
|
<span className={cn(
|
||
|
|
"flex items-center gap-1 rounded-full px-3 py-1 text-xs font-semibold",
|
||
|
|
plan.highlight
|
||
|
|
? "bg-indigo-600 text-white"
|
||
|
|
: "bg-white/10 text-white/70"
|
||
|
|
)}>
|
||
|
|
<Zap className="h-3 w-3" />
|
||
|
|
{plan.badge}
|
||
|
|
</span>
|
||
|
|
</div>
|
||
|
|
)}
|
||
|
|
|
||
|
|
<div className="mb-5">
|
||
|
|
<p className="text-sm font-semibold text-white/60">{plan.name}</p>
|
||
|
|
<div className="mt-1 flex items-baseline gap-0.5">
|
||
|
|
<span className="text-3xl font-extrabold text-white">{plan.price}</span>
|
||
|
|
{plan.interval && <span className="text-sm text-white/40">{plan.interval}</span>}
|
||
|
|
</div>
|
||
|
|
<p className="mt-2 text-xs leading-relaxed text-white/40">{plan.description}</p>
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<Link
|
||
|
|
href={plan.ctaHref}
|
||
|
|
className={cn(
|
||
|
|
"mb-6 block rounded-lg px-4 py-2.5 text-center text-sm font-semibold transition",
|
||
|
|
plan.highlight
|
||
|
|
? "bg-indigo-600 text-white hover:bg-indigo-500"
|
||
|
|
: "border border-white/10 text-white/70 hover:border-white/20 hover:text-white"
|
||
|
|
)}
|
||
|
|
>
|
||
|
|
{plan.cta}
|
||
|
|
</Link>
|
||
|
|
|
||
|
|
<ul className="flex-1 space-y-2.5">
|
||
|
|
{plan.features.map((f) => (
|
||
|
|
<li key={f} className="flex items-start gap-2">
|
||
|
|
<Check className="mt-0.5 h-3.5 w-3.5 flex-shrink-0 text-indigo-400" />
|
||
|
|
<span className="text-xs text-white/60">{f}</span>
|
||
|
|
</li>
|
||
|
|
))}
|
||
|
|
</ul>
|
||
|
|
</div>
|
||
|
|
))}
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
</section>
|
||
|
|
)
|
||
|
|
}
|