2026-03-18 13:02:58 -07:00

177 lines
7.0 KiB
TypeScript

import Image from "next/image";
import Link from "next/link";
import { Background } from "../../components/background";
import { ContactSection } from "../../components/contact-section";
import { DemoCta } from "../../components/demo-cta";
import { FaqSection } from "../../components/faq-section";
import { PageSchema } from "../../components/page-schema";
import { SiteFooter } from "../../components/site-footer";
import { SiteHeader } from "../../components/site-header";
import { defaultFaqs } from "../../data/faq";
import { siteInfo } from "../../data/site";
export const metadata = {
title: "Pricing",
description:
"LedgerOne pricing: first two connected accounts are free. Unlimited accounts are $9 per month.",
keywords: siteInfo.keywords
};
const plans = [
{
name: "Starter",
price: "Free",
tagline: "Best for getting your first ledger online.",
badge: "2 accounts",
features: [
"First two connected accounts",
"Unlimited exports",
"Rule engine access",
"Audit logs included"
],
cta: "Start free",
primary: false
},
{
name: "Unlimited",
price: "$9",
tagline: "Scale your ledger without limits.",
badge: "Unlimited accounts",
features: [
"Unlimited connected accounts",
"Priority sync cadence",
"Advanced rule automation",
"Team-ready exports"
],
cta: "Choose Unlimited",
primary: true
}
];
const comparisons = [
{ label: "Connected accounts", starter: "2", pro: "Unlimited" },
{ label: "Exports", starter: "Unlimited", pro: "Unlimited" },
{ label: "Rule engine", starter: "Core rules", pro: "Advanced rules" },
{ label: "Audit logs", starter: "Included", pro: "Included" },
{ label: "Support", starter: "Standard", pro: "Priority" }
];
export default function PricingPage() {
const schema = [
{
"@context": "https://schema.org",
"@type": "WebPage",
name: "LedgerOne Pricing",
description:
"LedgerOne pricing: first two connected accounts are free. Unlimited accounts are $9 per month.",
url: `${siteInfo.url}/pricing`
},
{
"@context": "https://schema.org",
"@type": "FAQPage",
mainEntity: defaultFaqs.map((item) => ({
"@type": "Question",
name: item.question,
acceptedAnswer: { "@type": "Answer", text: item.answer }
}))
}
];
return (
<div className="page-soft-bg min-h-screen font-sans text-foreground flex flex-col relative overflow-hidden">
<Background />
<SiteHeader />
<main className="relative z-10 flex-1 pt-24 pb-16">
<div className="max-w-7xl mx-auto px-6 lg:px-8">
<div className="text-center max-w-3xl mx-auto mb-10 animate-slide-up">
<h1 className="text-4xl font-bold tracking-tight text-foreground sm:text-5xl">
Simple, transparent pricing.
</h1>
<p className="mt-6 text-lg text-muted-foreground">
Start with the essentials and upgrade only when you need more accounts.
Both plans include unlimited exports and audit logs.
</p>
</div>
<div className="grid md:grid-cols-2 gap-8 max-w-4xl mx-auto">
{plans.map((plan) => (
<div
key={plan.name}
className={`rounded-2xl p-8 border transition-all ${plan.primary
? "border-primary bg-background shadow-glow-teal ring-1 ring-primary"
: "border-border bg-background/50 shadow-sm hover:shadow-md glass-panel"
}`}
>
<div className="flex items-center justify-between">
<h3 className="text-lg font-semibold text-foreground">{plan.name}</h3>
{plan.primary && (
<span className="inline-flex items-center rounded-full bg-primary/10 px-3 py-1 text-xs font-medium text-primary">
Most Popular
</span>
)}
</div>
<div className="mt-4 flex items-baseline text-foreground">
<span className="text-4xl font-bold tracking-tight">{plan.price}</span>
{plan.price !== "Free" && <span className="ml-1 text-xl font-semibold text-muted-foreground">/month</span>}
</div>
<p className="mt-2 text-sm text-muted-foreground">{plan.tagline}</p>
<ul className="mt-8 space-y-4">
{plan.features.map((feature) => (
<li key={feature} className="flex items-start">
<div className="flex-shrink-0">
<svg className="h-5 w-5 text-primary" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M5 13l4 4L19 7" />
</svg>
</div>
<p className="ml-3 text-sm text-muted-foreground">{feature}</p>
</li>
))}
</ul>
<Link
href="/register"
className={`mt-8 block w-full text-center ${plan.primary ? "btn-primary" : "btn-secondary"}`}
>
{plan.cta}
</Link>
</div>
))}
</div>
<div className="mt-16 max-w-4xl mx-auto glass-panel rounded-xl p-1">
<div className="px-6 py-4">
<h2 className="text-xl font-bold text-foreground">Compare plans</h2>
</div>
<div className="overflow-x-auto">
<table className="min-w-full divide-y divide-border">
<thead className="bg-secondary/30">
<tr>
<th scope="col" className="px-6 py-4 text-left text-xs font-medium text-muted-foreground uppercase tracking-wider">Feature</th>
<th scope="col" className="px-6 py-4 text-left text-xs font-medium text-muted-foreground uppercase tracking-wider">Starter</th>
<th scope="col" className="px-6 py-4 text-left text-xs font-medium text-muted-foreground uppercase tracking-wider">Unlimited</th>
</tr>
</thead>
<tbody className="bg-background divide-y divide-border">
{comparisons.map((item) => (
<tr key={item.label}>
<td className="px-6 py-4 whitespace-nowrap text-sm font-medium text-foreground">{item.label}</td>
<td className="px-6 py-4 whitespace-nowrap text-sm text-muted-foreground">{item.starter}</td>
<td className="px-6 py-4 whitespace-nowrap text-sm text-muted-foreground">{item.pro}</td>
</tr>
))}
</tbody>
</table>
</div>
</div>
</div>
</main>
<div className="relative z-10">
<SiteFooter />
</div>
<PageSchema schema={schema} />
</div>
);
}